diff --git a/.github/workflows/defi.yml b/.github/workflows/defi.yml index e04911d66b..10424208fc 100644 --- a/.github/workflows/defi.yml +++ b/.github/workflows/defi.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -49,7 +49,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -72,7 +72,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -111,7 +111,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -151,7 +151,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -179,20 +179,19 @@ jobs: ./contracts/coverage/**/* retention-days: 1 - coverage-uploader: - name: "Upload Coverage Reports" + contracts-base-forktest: + name: "Base Fork Tests" runs-on: ubuntu-latest - needs: - - contracts-unit-coverage - - contracts-forktest - - contracts-arb-forktest + continue-on-error: true env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + HARDHAT_CACHE_DIR: ./cache + PROVIDER_URL: ${{ secrets.PROVIDER_URL }} + BASE_PROVIDER_URL: ${{ secrets.BASE_PROVIDER_URL }} steps: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -219,7 +218,7 @@ jobs: ./contracts/coverage.json ./contracts/coverage/**/* retention-days: 1 - + coverage-uploader: name: "Upload Coverage Reports" runs-on: ubuntu-latest @@ -227,11 +226,13 @@ jobs: - contracts-unit-coverage - contracts-forktest - contracts-arb-forktest + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} steps: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -277,7 +278,7 @@ jobs: pip3 inspect - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: "20.x" cache: "yarn" @@ -301,4 +302,4 @@ jobs: env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} with: - args: --severity-threshold=high --all-projects + args: --severity-threshold=high --all-projects \ No newline at end of file diff --git a/contracts/contracts/harvest/AeroHavester.sol b/contracts/contracts/harvest/AbstractHarvesterBase.sol similarity index 69% rename from contracts/contracts/harvest/AeroHavester.sol rename to contracts/contracts/harvest/AbstractHarvesterBase.sol index 759a6ab515..d5001d55cf 100644 --- a/contracts/contracts/harvest/AeroHavester.sol +++ b/contracts/contracts/harvest/AbstractHarvesterBase.sol @@ -10,33 +10,20 @@ import { StableMath } from "../utils/StableMath.sol"; import { Governable } from "../governance/Governable.sol"; import { IOracle } from "../interfaces/IOracle.sol"; import { IStrategy } from "../interfaces/IStrategy.sol"; -import { IRouter } from "./../interfaces/aerodrome/IRouter.sol"; +import { IVault } from "./../interfaces/IVault.sol"; import "../utils/Helpers.sol"; -contract AeroHarvester is Governable { +abstract contract AbstractHarvesterBase is Governable { using SafeERC20 for IERC20; using SafeMath for uint256; using StableMath for uint256; - enum SwapPlatform { - Aerodrome // Only aerodrome is supported for now. - } - event SupportedStrategyUpdate(address strategyAddress, bool isSupported); - event RewardTokenConfigUpdated( - address tokenAddress, - uint16 allowedSlippageBps, - uint16 harvestRewardBps, - SwapPlatform swapPlatform, - address swapPlatformAddr, - IRouter.Route[] route, - uint256 liquidationLimit, - bool doSwapRewardToken - ); + event RewardTokenSwapped( address indexed rewardToken, address indexed swappedInto, - SwapPlatform swapPlatform, + uint8 swapPlatform, uint256 amountIn, uint256 amountOut ); @@ -47,15 +34,23 @@ contract AeroHarvester is Governable { uint256 farmerFee ); event RewardProceedsAddressChanged(address newProceedsAddress); - event PriceProviderAddressChanged(address priceProviderAddress); + + event RewardTokenConfigUpdated( + address tokenAddress, + uint16 allowedSlippageBps, + uint16 harvestRewardBps, + uint8 swapPlatform, + address swapPlatformAddr, + bytes swapData, + uint256 liquidationLimit, + bool doSwapRewardToken + ); error EmptyAddress(); error InvalidSlippageBps(); error InvalidHarvestRewardBps(); - - error InvalidSwapPlatform(SwapPlatform swapPlatform); - error InvalidTokenInSwapPath(address token); + error InvalidSwapPlatform(uint8 swapPlatform); error UnsupportedStrategy(address strategyAddress); @@ -68,20 +63,21 @@ contract AeroHarvester is Governable { uint16 allowedSlippageBps; // Reward when calling a harvest function denominated in basis points. uint16 harvestRewardBps; - // Address of AMM protocol like Aerodrome to perform swap Rewards => BaseToken. + // Address of compatible exchange protocol (Uniswap V2/V3, SushiSwap, Balancer and Curve). address swapPlatformAddr; /* When true the reward token is being swapped. In a need of (temporarily) disabling the swapping of * a reward token this needs to be set to false. */ bool doSwapRewardToken; // Platform to use for Swapping - SwapPlatform swapPlatform; + uint8 swapPlatform; /* How much token can be sold per one harvest call. If the balance of rewards tokens * exceeds that limit multiple harvest calls are required to harvest all of the tokens. * Set it to MAX_INT to effectively disable the limit. */ uint256 liquidationLimit; } + address public immutable vaultAddress; mapping(address => RewardTokenConfig) public rewardTokenConfigs; mapping(address => bool) public supportedStrategies; @@ -100,17 +96,11 @@ contract AeroHarvester is Governable { // Cached decimals for `baseTokenAddress` uint256 public immutable baseTokenDecimals; - // Aerodrome route to swap using Aerodrome Router - mapping(address => IRouter.Route[]) public aerodromeRoute; - - // Address of the price provider - IOracle public immutable priceProvider; - - constructor(IOracle _priceProvider, address _baseTokenAddress) { - require(address(_priceProvider) != address(0)); + constructor(address _vaultAddress, address _baseTokenAddress) { + require(_vaultAddress != address(0)); require(_baseTokenAddress != address(0)); - priceProvider = _priceProvider; + vaultAddress = _vaultAddress; baseTokenAddress = _baseTokenAddress; // Cache decimals as well @@ -137,118 +127,6 @@ contract AeroHarvester is Governable { emit RewardProceedsAddressChanged(_rewardProceedsAddress); } - /** - * @dev Add/update a reward token configuration that holds harvesting config variables - * @param _tokenAddress Address of the reward token - * @param tokenConfig.allowedSlippageBps uint16 maximum allowed slippage denominated in basis points. - * Example: 300 == 3% slippage - * @param tokenConfig.harvestRewardBps uint16 amount of reward tokens the caller of the function is rewarded. - * Example: 100 == 1% - * @param tokenConfig.swapPlatformAddr Address of a AMM contract to perform - * the exchange from reward tokens to stablecoin (currently hard-coded to USDT) - * @param tokenConfig.liquidationLimit uint256 Maximum amount of token to be sold per one swap function call. - * When value is 0 there is no limit. - * @param tokenConfig.doSwapRewardToken bool Disables swapping of the token when set to true, - * does not cause it to revert though. - * @param tokenConfig.swapPlatform SwapPlatform to use for Swapping - * @param route Route required for swapping - */ - function setRewardTokenConfig( - address _tokenAddress, - RewardTokenConfig calldata tokenConfig, - IRouter.Route[] memory route - ) external onlyGovernor { - if (tokenConfig.allowedSlippageBps > 1000) { - revert InvalidSlippageBps(); - } - - if (tokenConfig.harvestRewardBps > 1000) { - revert InvalidHarvestRewardBps(); - } - - address newRouterAddress = tokenConfig.swapPlatformAddr; - if (newRouterAddress == address(0)) { - // Swap router address should be non zero address - revert EmptyAddress(); - } - - address oldRouterAddress = rewardTokenConfigs[_tokenAddress] - .swapPlatformAddr; - rewardTokenConfigs[_tokenAddress] = tokenConfig; - - // Revert if feed does not exist - // slither-disable-next-line unused-return - priceProvider.price(_tokenAddress); - - IERC20 token = IERC20(_tokenAddress); - // if changing token swap provider cancel existing allowance - if ( - /* oldRouterAddress == address(0) when there is no pre-existing - * configuration for said rewards token - */ - oldRouterAddress != address(0) && - oldRouterAddress != newRouterAddress - ) { - token.safeApprove(oldRouterAddress, 0); - } - - // Give SwapRouter infinite approval when needed - if (oldRouterAddress != newRouterAddress) { - token.safeApprove(newRouterAddress, 0); - token.safeApprove(newRouterAddress, type(uint256).max); - } - - SwapPlatform _platform = tokenConfig.swapPlatform; - if (_platform == SwapPlatform.Aerodrome) { - _validateAerodromeRoute(route, _tokenAddress); - - // Find a better way to do this. - IRouter.Route[] storage routes = aerodromeRoute[_tokenAddress]; - for (uint256 i = 0; i < route.length; ) { - routes.push(route[i]); - unchecked { - ++i; - } - } - } else { - // Note: This code is unreachable since Solidity reverts when - // the value is outside the range of defined values of the enum - // (even if it's under the max length of the base type) - revert InvalidSwapPlatform(_platform); - } - - emit RewardTokenConfigUpdated( - _tokenAddress, - tokenConfig.allowedSlippageBps, - tokenConfig.harvestRewardBps, - _platform, - newRouterAddress, - route, - tokenConfig.liquidationLimit, - tokenConfig.doSwapRewardToken - ); - } - - /** - * @dev Validates the route to make sure the path is for `token` to `baseToken` - * - * @param route Route passed to the `setRewardTokenConfig` - * @param token The address of the reward token - */ - function _validateAerodromeRoute( - IRouter.Route[] memory route, - address token - ) internal view { - // Do some validation - if (route[0].from != token) { - revert InvalidTokenInSwapPath(route[0].from); - } - - if (route[route.length - 1].to != baseTokenAddress) { - revert InvalidTokenInSwapPath(route[route.length - 1].to); - } - } - /** * @dev Flags a strategy as supported or not supported one * @param _strategyAddress Address of the strategy @@ -318,10 +196,10 @@ contract AeroHarvester is Governable { _harvest(_strategyAddr); IStrategy strategy = IStrategy(_strategyAddr); address[] memory rewardTokens = strategy.getRewardTokenAddresses(); - IOracle _priceProvider = priceProvider; + IOracle priceProvider = IOracle(IVault(vaultAddress).priceProvider()); uint256 len = rewardTokens.length; for (uint256 i = 0; i < len; ++i) { - _swap(rewardTokens[i], _rewardTo, _priceProvider); + _swap(rewardTokens[i], _rewardTo, priceProvider); } } @@ -409,7 +287,7 @@ contract AeroHarvester is Governable { IERC20 baseToken = IERC20(baseTokenAddress); uint256 baseTokenBalance = baseToken.balanceOf(address(this)); if (baseTokenBalance < amountReceived) { - // Note: It's possible to bypass this check by transfering `baseToken` + // Note: It's possible to bypass this check by transferring `baseToken` // directly to Harvester before calling the `harvestAndSwap`. However, // there's no incentive for an attacker to do that. Doing a balance diff // will increase the gas cost significantly @@ -435,55 +313,55 @@ contract AeroHarvester is Governable { ); } - function _doSwap( - SwapPlatform swapPlatform, - address routerAddress, - address rewardTokenAddress, - uint256 amountIn, - uint256 minAmountOut - ) internal returns (uint256 amountOut) { - if (swapPlatform == SwapPlatform.Aerodrome) { - return - _swapWithAerodrome( - routerAddress, - rewardTokenAddress, - amountIn, - minAmountOut - ); - } else { - // Should never be invoked since we catch invalid values - // in the `setRewardTokenConfig` function before it's set - revert InvalidSwapPlatform(swapPlatform); + function _validateConfigAndApproveTokens( + address _tokenAddress, + RewardTokenConfig calldata tokenConfig + ) internal { + if (tokenConfig.allowedSlippageBps > 1000) { + revert InvalidSlippageBps(); + } + + if (tokenConfig.harvestRewardBps > 1000) { + revert InvalidHarvestRewardBps(); + } + + address newRouterAddress = tokenConfig.swapPlatformAddr; + if (newRouterAddress == address(0)) { + // Swap router address should be non zero address + revert EmptyAddress(); + } + + address oldRouterAddress = rewardTokenConfigs[_tokenAddress] + .swapPlatformAddr; + rewardTokenConfigs[_tokenAddress] = tokenConfig; + + // Revert if feed does not exist + // slither-disable-next-line unused-return + IOracle(IVault(vaultAddress).priceProvider()).price(_tokenAddress); + + IERC20 token = IERC20(_tokenAddress); + // if changing token swap provider cancel existing allowance + if ( + /* oldRouterAddress == address(0) when there is no pre-existing + * configuration for said rewards token + */ + oldRouterAddress != address(0) && + oldRouterAddress != newRouterAddress + ) { + token.safeApprove(oldRouterAddress, 0); + } + // Give SwapRouter infinite approval when needed + if (oldRouterAddress != newRouterAddress) { + token.safeApprove(newRouterAddress, 0); + token.safeApprove(newRouterAddress, type(uint256).max); } } - /** - * @dev Swaps the token to `baseToken` with Aerodrome - * - * @param routerAddress Aerodrome Router address - * @param swapToken Address of the tokenIn - * @param amountIn Amount of `swapToken` to swap - * @param minAmountOut Minimum expected amount of `baseToken` - * - * @return amountOut Amount of `baseToken` received after the swap - */ - function _swapWithAerodrome( + function _doSwap( + uint8 swapPlatform, address routerAddress, - address swapToken, + address rewardTokenAddress, uint256 amountIn, uint256 minAmountOut - ) internal returns (uint256 amountOut) { - IRouter.Route[] memory route = aerodromeRoute[swapToken]; - - uint256[] memory amounts = IRouter(routerAddress) - .swapExactTokensForTokens( - amountIn, - minAmountOut, - route, - address(this), - block.timestamp - ); - - amountOut = amounts[amounts.length - 1]; - } + ) internal virtual returns (uint256 amountOut) {} } diff --git a/contracts/contracts/harvest/BaseHarvester.sol b/contracts/contracts/harvest/BaseHarvester.sol deleted file mode 100644 index 6c58e97c54..0000000000 --- a/contracts/contracts/harvest/BaseHarvester.sol +++ /dev/null @@ -1,740 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { SafeMath } from "@openzeppelin/contracts/utils/math/SafeMath.sol"; -import "@openzeppelin/contracts/utils/math/Math.sol"; - -import { StableMath } from "../utils/StableMath.sol"; -import { Governable } from "../governance/Governable.sol"; -import { IVault } from "../interfaces/IVault.sol"; -import { IOracle } from "../interfaces/IOracle.sol"; -import { IStrategy } from "../interfaces/IStrategy.sol"; -import { IUniswapV2Router } from "../interfaces/uniswap/IUniswapV2Router02.sol"; -import { IUniswapV3Router } from "../interfaces/uniswap/IUniswapV3Router.sol"; -import { IBalancerVault } from "../interfaces/balancer/IBalancerVault.sol"; -import { ICurvePool } from "../strategies/ICurvePool.sol"; -import "../utils/Helpers.sol"; - -abstract contract BaseHarvester is Governable { - using SafeERC20 for IERC20; - using SafeMath for uint256; - using StableMath for uint256; - - enum SwapPlatform { - UniswapV2Compatible, - UniswapV3, - Balancer, - Curve - } - - event SupportedStrategyUpdate(address strategyAddress, bool isSupported); - event RewardTokenConfigUpdated( - address tokenAddress, - uint16 allowedSlippageBps, - uint16 harvestRewardBps, - SwapPlatform swapPlatform, - address swapPlatformAddr, - bytes swapData, - uint256 liquidationLimit, - bool doSwapRewardToken - ); - event RewardTokenSwapped( - address indexed rewardToken, - address indexed swappedInto, - SwapPlatform swapPlatform, - uint256 amountIn, - uint256 amountOut - ); - event RewardProceedsTransferred( - address indexed token, - address farmer, - uint256 protcolYield, - uint256 farmerFee - ); - event RewardProceedsAddressChanged(address newProceedsAddress); - - error EmptyAddress(); - error InvalidSlippageBps(); - error InvalidHarvestRewardBps(); - - error InvalidSwapPlatform(SwapPlatform swapPlatform); - - error InvalidUniswapV2PathLength(); - error InvalidTokenInSwapPath(address token); - error EmptyBalancerPoolId(); - error InvalidCurvePoolAssetIndex(address token); - - error UnsupportedStrategy(address strategyAddress); - - error SlippageError(uint256 actualBalance, uint256 minExpected); - error BalanceMismatchAfterSwap(uint256 actualBalance, uint256 minExpected); - - // Configuration properties for harvesting logic of reward tokens - struct RewardTokenConfig { - // Max allowed slippage when swapping reward token for a stablecoin denominated in basis points. - uint16 allowedSlippageBps; - // Reward when calling a harvest function denominated in basis points. - uint16 harvestRewardBps; - // Address of compatible exchange protocol (Uniswap V2/V3, SushiSwap, Balancer and Curve). - address swapPlatformAddr; - /* When true the reward token is being swapped. In a need of (temporarily) disabling the swapping of - * a reward token this needs to be set to false. - */ - bool doSwapRewardToken; - // Platform to use for Swapping - SwapPlatform swapPlatform; - /* How much token can be sold per one harvest call. If the balance of rewards tokens - * exceeds that limit multiple harvest calls are required to harvest all of the tokens. - * Set it to MAX_INT to effectively disable the limit. - */ - uint256 liquidationLimit; - } - - mapping(address => RewardTokenConfig) public rewardTokenConfigs; - mapping(address => bool) public supportedStrategies; - - address public immutable vaultAddress; - - /** - * Address receiving rewards proceeds. Initially the Vault contract later will possibly - * be replaced by another contract that eases out rewards distribution. - **/ - address public rewardProceedsAddress; - - /** - * All tokens are swapped to this token before it gets transferred - * to the `rewardProceedsAddress`. USDT for OUSD and WETH for OETH. - **/ - address public immutable baseTokenAddress; - // Cached decimals for `baseTokenAddress` - uint256 public immutable baseTokenDecimals; - - // Uniswap V2 path for reward tokens using Uniswap V2 Router - mapping(address => address[]) public uniswapV2Path; - // Uniswap V3 path for reward tokens using Uniswap V3 Router - mapping(address => bytes) public uniswapV3Path; - // Pool ID to use for reward tokens on Balancer - mapping(address => bytes32) public balancerPoolId; - - struct CurvePoolIndices { - // Casted into uint128 and stored in a struct to save gas - uint128 rewardTokenIndex; - uint128 baseTokenIndex; - } - // Packed indices of assets on the Curve pool - mapping(address => CurvePoolIndices) public curvePoolIndices; - - constructor(address _vaultAddress, address _baseTokenAddress) { - require(_vaultAddress != address(0)); - require(_baseTokenAddress != address(0)); - - vaultAddress = _vaultAddress; - baseTokenAddress = _baseTokenAddress; - - // Cache decimals as well - baseTokenDecimals = Helpers.getDecimals(_baseTokenAddress); - } - - /*************************************** - Configuration - ****************************************/ - - /** - * Set the Address receiving rewards proceeds. - * @param _rewardProceedsAddress Address of the reward token - */ - function setRewardProceedsAddress(address _rewardProceedsAddress) - external - onlyGovernor - { - if (_rewardProceedsAddress == address(0)) { - revert EmptyAddress(); - } - - rewardProceedsAddress = _rewardProceedsAddress; - emit RewardProceedsAddressChanged(_rewardProceedsAddress); - } - - /** - * @dev Add/update a reward token configuration that holds harvesting config variables - * @param _tokenAddress Address of the reward token - * @param tokenConfig.allowedSlippageBps uint16 maximum allowed slippage denominated in basis points. - * Example: 300 == 3% slippage - * @param tokenConfig.harvestRewardBps uint16 amount of reward tokens the caller of the function is rewarded. - * Example: 100 == 1% - * @param tokenConfig.swapPlatformAddr Address Address of a UniswapV2 compatible contract to perform - * the exchange from reward tokens to stablecoin (currently hard-coded to USDT) - * @param tokenConfig.liquidationLimit uint256 Maximum amount of token to be sold per one swap function call. - * When value is 0 there is no limit. - * @param tokenConfig.doSwapRewardToken bool Disables swapping of the token when set to true, - * does not cause it to revert though. - * @param tokenConfig.swapPlatform SwapPlatform to use for Swapping - * @param swapData Additional data required for swapping - */ - function setRewardTokenConfig( - address _tokenAddress, - RewardTokenConfig calldata tokenConfig, - bytes calldata swapData - ) external onlyGovernor { - if (tokenConfig.allowedSlippageBps > 1000) { - revert InvalidSlippageBps(); - } - - if (tokenConfig.harvestRewardBps > 1000) { - revert InvalidHarvestRewardBps(); - } - - address newRouterAddress = tokenConfig.swapPlatformAddr; - if (newRouterAddress == address(0)) { - // Swap router address should be non zero address - revert EmptyAddress(); - } - - address oldRouterAddress = rewardTokenConfigs[_tokenAddress] - .swapPlatformAddr; - rewardTokenConfigs[_tokenAddress] = tokenConfig; - - // Revert if feed does not exist - // slither-disable-next-line unused-return - IOracle(IVault(vaultAddress).priceProvider()).price(_tokenAddress); - - IERC20 token = IERC20(_tokenAddress); - // if changing token swap provider cancel existing allowance - if ( - /* oldRouterAddress == address(0) when there is no pre-existing - * configuration for said rewards token - */ - oldRouterAddress != address(0) && - oldRouterAddress != newRouterAddress - ) { - token.safeApprove(oldRouterAddress, 0); - } - - // Give SwapRouter infinite approval when needed - if (oldRouterAddress != newRouterAddress) { - token.safeApprove(newRouterAddress, 0); - token.safeApprove(newRouterAddress, type(uint256).max); - } - - SwapPlatform _platform = tokenConfig.swapPlatform; - if (_platform == SwapPlatform.UniswapV2Compatible) { - uniswapV2Path[_tokenAddress] = _decodeUniswapV2Path( - swapData, - _tokenAddress - ); - } else if (_platform == SwapPlatform.UniswapV3) { - uniswapV3Path[_tokenAddress] = _decodeUniswapV3Path( - swapData, - _tokenAddress - ); - } else if (_platform == SwapPlatform.Balancer) { - balancerPoolId[_tokenAddress] = _decodeBalancerPoolId( - swapData, - newRouterAddress, - _tokenAddress - ); - } else if (_platform == SwapPlatform.Curve) { - curvePoolIndices[_tokenAddress] = _decodeCurvePoolIndices( - swapData, - newRouterAddress, - _tokenAddress - ); - } else { - // Note: This code is unreachable since Solidity reverts when - // the value is outside the range of defined values of the enum - // (even if it's under the max length of the base type) - revert InvalidSwapPlatform(_platform); - } - - emit RewardTokenConfigUpdated( - _tokenAddress, - tokenConfig.allowedSlippageBps, - tokenConfig.harvestRewardBps, - _platform, - newRouterAddress, - swapData, - tokenConfig.liquidationLimit, - tokenConfig.doSwapRewardToken - ); - } - - /** - * @dev Decodes the data passed into Uniswap V2 path and validates - * it to make sure the path is for `token` to `baseToken` - * - * @param data Ecnoded data passed to the `setRewardTokenConfig` - * @param token The address of the reward token - * @return path The validated Uniswap V2 path - */ - function _decodeUniswapV2Path(bytes calldata data, address token) - internal - view - returns (address[] memory path) - { - (path) = abi.decode(data, (address[])); - uint256 len = path.length; - - if (len < 2) { - // Path should have at least two tokens - revert InvalidUniswapV2PathLength(); - } - - // Do some validation - if (path[0] != token) { - revert InvalidTokenInSwapPath(path[0]); - } - - if (path[len - 1] != baseTokenAddress) { - revert InvalidTokenInSwapPath(path[len - 1]); - } - } - - /** - * @dev Decodes the data passed into Uniswap V3 path and validates - * it to make sure the path is for `token` to `baseToken` - * - * @param data Ecnoded data passed to the `setRewardTokenConfig` - * @param token The address of the reward token - * @return path The validated Uniswap V3 path - */ - function _decodeUniswapV3Path(bytes calldata data, address token) - internal - view - returns (bytes calldata path) - { - path = data; - - address decodedAddress = address(uint160(bytes20(data[0:20]))); - - if (decodedAddress != token) { - // Invalid Reward Token in swap path - revert InvalidTokenInSwapPath(decodedAddress); - } - - decodedAddress = address(uint160(bytes20(data[path.length - 20:]))); - if (decodedAddress != baseTokenAddress) { - // Invalid Base Token in swap path - revert InvalidTokenInSwapPath(decodedAddress); - } - } - - /** - * @dev Decodes the data passed to Balancer Pool ID - * - * @param data Ecnoded data passed to the `setRewardTokenConfig` - * @return poolId The pool ID - */ - function _decodeBalancerPoolId( - bytes calldata data, - address balancerVault, - address token - ) internal view returns (bytes32 poolId) { - (poolId) = abi.decode(data, (bytes32)); - - if (poolId == bytes32(0)) { - revert EmptyBalancerPoolId(); - } - - IBalancerVault bVault = IBalancerVault(balancerVault); - - // Note: this reverts if token is not a pool asset - // slither-disable-next-line unused-return - bVault.getPoolTokenInfo(poolId, token); - - // slither-disable-next-line unused-return - bVault.getPoolTokenInfo(poolId, baseTokenAddress); - } - - /** - * @dev Decodes the data passed to get the pool indices and - * checks it against the Curve Pool to make sure it's - * not misconfigured. The indices are packed into a single - * uint256 for gas savings - * - * @param data Ecnoded data passed to the `setRewardTokenConfig` - * @param poolAddress Curve pool address - * @param token The address of the reward token - * @return indices Packed pool asset indices - */ - function _decodeCurvePoolIndices( - bytes calldata data, - address poolAddress, - address token - ) internal view returns (CurvePoolIndices memory indices) { - indices = abi.decode(data, (CurvePoolIndices)); - - ICurvePool pool = ICurvePool(poolAddress); - if (token != pool.coins(indices.rewardTokenIndex)) { - revert InvalidCurvePoolAssetIndex(token); - } - if (baseTokenAddress != pool.coins(indices.baseTokenIndex)) { - revert InvalidCurvePoolAssetIndex(baseTokenAddress); - } - } - - /** - * @dev Flags a strategy as supported or not supported one - * @param _strategyAddress Address of the strategy - * @param _isSupported Bool marking strategy as supported or not supported - */ - function setSupportedStrategy(address _strategyAddress, bool _isSupported) - external - onlyGovernor - { - supportedStrategies[_strategyAddress] = _isSupported; - emit SupportedStrategyUpdate(_strategyAddress, _isSupported); - } - - /*************************************** - Rewards - ****************************************/ - - /** - * @dev Transfer token to governor. Intended for recovering tokens stuck in - * contract, i.e. mistaken sends. - * @param _asset Address for the asset - * @param _amount Amount of the asset to transfer - */ - function transferToken(address _asset, uint256 _amount) - external - onlyGovernor - { - IERC20(_asset).safeTransfer(governor(), _amount); - } - - /** - * @dev Collect reward tokens from a specific strategy and swap them for - * base token on the configured swap platform. Can be called by anyone. - * Rewards incentivizing the caller are sent to the caller of this function. - * @param _strategyAddr Address of the strategy to collect rewards from - */ - function harvestAndSwap(address _strategyAddr) external nonReentrant { - // Remember _harvest function checks for the validity of _strategyAddr - _harvestAndSwap(_strategyAddr, msg.sender); - } - - /** - * @dev Collect reward tokens from a specific strategy and swap them for - * base token on the configured swap platform. Can be called by anyone - * @param _strategyAddr Address of the strategy to collect rewards from - * @param _rewardTo Address where to send a share of harvest rewards to as an incentive - * for executing this function - */ - function harvestAndSwap(address _strategyAddr, address _rewardTo) - external - nonReentrant - { - // Remember _harvest function checks for the validity of _strategyAddr - _harvestAndSwap(_strategyAddr, _rewardTo); - } - - /** - * @dev Collect reward tokens from a specific strategy and swap them for - * base token on the configured swap platform - * @param _strategyAddr Address of the strategy to collect rewards from - * @param _rewardTo Address where to send a share of harvest rewards to as an incentive - * for executing this function - */ - function _harvestAndSwap(address _strategyAddr, address _rewardTo) - internal - { - _harvest(_strategyAddr); - IStrategy strategy = IStrategy(_strategyAddr); - address[] memory rewardTokens = strategy.getRewardTokenAddresses(); - IOracle priceProvider = IOracle(IVault(vaultAddress).priceProvider()); - uint256 len = rewardTokens.length; - for (uint256 i = 0; i < len; ++i) { - _swap(rewardTokens[i], _rewardTo, priceProvider); - } - } - - /** - * @dev Collect reward tokens from a specific strategy and swap them for - * base token on the configured swap platform - * @param _strategyAddr Address of the strategy to collect rewards from. - */ - function _harvest(address _strategyAddr) internal { - if (!supportedStrategies[_strategyAddr]) { - revert UnsupportedStrategy(_strategyAddr); - } - - IStrategy strategy = IStrategy(_strategyAddr); - strategy.collectRewardTokens(); - } - - /** - * @dev Swap a reward token for the base token on the configured - * swap platform. The token must have a registered price feed - * with the price provider - * @param _swapToken Address of the token to swap - * @param _rewardTo Address where to send the share of harvest rewards to - * @param _priceProvider Oracle to get prices of the swap token - */ - function _swap( - address _swapToken, - address _rewardTo, - IOracle _priceProvider - ) internal virtual { - RewardTokenConfig memory tokenConfig = rewardTokenConfigs[_swapToken]; - - /* This will trigger a return when reward token configuration has not yet been set - * or we have temporarily disabled swapping of specific reward token via setting - * doSwapRewardToken to false. - */ - if (!tokenConfig.doSwapRewardToken) { - return; - } - - uint256 balance = IERC20(_swapToken).balanceOf(address(this)); - - if (balance == 0) { - return; - } - - if (tokenConfig.liquidationLimit > 0) { - balance = Math.min(balance, tokenConfig.liquidationLimit); - } - - // This'll revert if there is no price feed - uint256 oraclePrice = _priceProvider.price(_swapToken); - - // Oracle price is 1e18 - uint256 minExpected = (balance * - (1e4 - tokenConfig.allowedSlippageBps) * // max allowed slippage - oraclePrice).scaleBy( - baseTokenDecimals, - Helpers.getDecimals(_swapToken) - ) / - 1e4 / // fix the max slippage decimal position - 1e18; // and oracle price decimals position - - // Do the swap - uint256 amountReceived = _doSwap( - tokenConfig.swapPlatform, - tokenConfig.swapPlatformAddr, - _swapToken, - balance, - minExpected - ); - - if (amountReceived < minExpected) { - revert SlippageError(amountReceived, minExpected); - } - - emit RewardTokenSwapped( - _swapToken, - baseTokenAddress, - tokenConfig.swapPlatform, - balance, - amountReceived - ); - - IERC20 baseToken = IERC20(baseTokenAddress); - uint256 baseTokenBalance = baseToken.balanceOf(address(this)); - if (baseTokenBalance < amountReceived) { - // Note: It's possible to bypass this check by transferring `baseToken` - // directly to Harvester before calling the `harvestAndSwap`. However, - // there's no incentive for an attacker to do that. Doing a balance diff - // will increase the gas cost significantly - revert BalanceMismatchAfterSwap(baseTokenBalance, amountReceived); - } - - // Farmer only gets fee from the base amount they helped farm, - // They do not get anything from anything that already was there - // on the Harvester - uint256 farmerFee = amountReceived.mulTruncateScale( - tokenConfig.harvestRewardBps, - 1e4 - ); - uint256 protcolYield = baseTokenBalance - farmerFee; - - baseToken.safeTransfer(rewardProceedsAddress, protcolYield); - baseToken.safeTransfer(_rewardTo, farmerFee); - emit RewardProceedsTransferred( - baseTokenAddress, - _rewardTo, - protcolYield, - farmerFee - ); - } - - function _doSwap( - SwapPlatform swapPlatform, - address routerAddress, - address rewardTokenAddress, - uint256 amountIn, - uint256 minAmountOut - ) internal returns (uint256 amountOut) { - if (swapPlatform == SwapPlatform.UniswapV2Compatible) { - return - _swapWithUniswapV2( - routerAddress, - rewardTokenAddress, - amountIn, - minAmountOut - ); - } else if (swapPlatform == SwapPlatform.UniswapV3) { - return - _swapWithUniswapV3( - routerAddress, - rewardTokenAddress, - amountIn, - minAmountOut - ); - } else if (swapPlatform == SwapPlatform.Balancer) { - return - _swapWithBalancer( - routerAddress, - rewardTokenAddress, - amountIn, - minAmountOut - ); - } else if (swapPlatform == SwapPlatform.Curve) { - return - _swapWithCurve( - routerAddress, - rewardTokenAddress, - amountIn, - minAmountOut - ); - } else { - // Should never be invoked since we catch invalid values - // in the `setRewardTokenConfig` function before it's set - revert InvalidSwapPlatform(swapPlatform); - } - } - - /** - * @dev Swaps the token to `baseToken` with Uniswap V2 - * - * @param routerAddress Uniswap V2 Router address - * @param swapToken Address of the tokenIn - * @param amountIn Amount of `swapToken` to swap - * @param minAmountOut Minimum expected amount of `baseToken` - * - * @return amountOut Amount of `baseToken` received after the swap - */ - function _swapWithUniswapV2( - address routerAddress, - address swapToken, - uint256 amountIn, - uint256 minAmountOut - ) internal returns (uint256 amountOut) { - address[] memory path = uniswapV2Path[swapToken]; - - uint256[] memory amounts = IUniswapV2Router(routerAddress) - .swapExactTokensForTokens( - amountIn, - minAmountOut, - path, - address(this), - block.timestamp - ); - - amountOut = amounts[amounts.length - 1]; - } - - /** - * @dev Swaps the token to `baseToken` with Uniswap V3 - * - * @param routerAddress Uniswap V3 Router address - * @param swapToken Address of the tokenIn - * @param amountIn Amount of `swapToken` to swap - * @param minAmountOut Minimum expected amount of `baseToken` - * - * @return amountOut Amount of `baseToken` received after the swap - */ - function _swapWithUniswapV3( - address routerAddress, - address swapToken, - uint256 amountIn, - uint256 minAmountOut - ) internal returns (uint256 amountOut) { - bytes memory path = uniswapV3Path[swapToken]; - - IUniswapV3Router.ExactInputParams memory params = IUniswapV3Router - .ExactInputParams({ - path: path, - recipient: address(this), - deadline: block.timestamp, - amountIn: amountIn, - amountOutMinimum: minAmountOut - }); - amountOut = IUniswapV3Router(routerAddress).exactInput(params); - } - - /** - * @dev Swaps the token to `baseToken` on Balancer - * - * @param balancerVaultAddress BalancerVaultAddress - * @param swapToken Address of the tokenIn - * @param amountIn Amount of `swapToken` to swap - * @param minAmountOut Minimum expected amount of `baseToken` - * - * @return amountOut Amount of `baseToken` received after the swap - */ - function _swapWithBalancer( - address balancerVaultAddress, - address swapToken, - uint256 amountIn, - uint256 minAmountOut - ) internal returns (uint256 amountOut) { - bytes32 poolId = balancerPoolId[swapToken]; - - IBalancerVault.SingleSwap memory singleSwap = IBalancerVault - .SingleSwap({ - poolId: poolId, - kind: IBalancerVault.SwapKind.GIVEN_IN, - assetIn: swapToken, - assetOut: baseTokenAddress, - amount: amountIn, - userData: hex"" - }); - - IBalancerVault.FundManagement memory fundMgmt = IBalancerVault - .FundManagement({ - sender: address(this), - fromInternalBalance: false, - recipient: payable(address(this)), - toInternalBalance: false - }); - - amountOut = IBalancerVault(balancerVaultAddress).swap( - singleSwap, - fundMgmt, - minAmountOut, - block.timestamp - ); - } - - /** - * @dev Swaps the token to `baseToken` on Curve - * - * @param poolAddress Curve Pool Address - * @param swapToken Address of the tokenIn - * @param amountIn Amount of `swapToken` to swap - * @param minAmountOut Minimum expected amount of `baseToken` - * - * @return amountOut Amount of `baseToken` received after the swap - */ - function _swapWithCurve( - address poolAddress, - address swapToken, - uint256 amountIn, - uint256 minAmountOut - ) internal returns (uint256 amountOut) { - CurvePoolIndices memory indices = curvePoolIndices[swapToken]; - - // Note: Not all CurvePools return the `amountOut`, make sure - // to use only pool that do. Otherwise the swap would revert - // always - amountOut = ICurvePool(poolAddress).exchange( - uint256(indices.rewardTokenIndex), - uint256(indices.baseTokenIndex), - amountIn, - minAmountOut - ); - } -} diff --git a/contracts/contracts/harvest/Harvester.sol b/contracts/contracts/harvest/Harvester.sol index 3c8839e3bd..1082d98908 100644 --- a/contracts/contracts/harvest/Harvester.sol +++ b/contracts/contracts/harvest/Harvester.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { BaseHarvester } from "./BaseHarvester.sol"; +import { OETHHarvester } from "./OETHHarvester.sol"; -contract Harvester is BaseHarvester { +contract Harvester is OETHHarvester { constructor(address _vault, address _usdtAddress) - BaseHarvester(_vault, _usdtAddress) + OETHHarvester(_vault, _usdtAddress) {} } diff --git a/contracts/contracts/harvest/OETHBaseHarvester.sol b/contracts/contracts/harvest/OETHBaseHarvester.sol new file mode 100644 index 0000000000..f9a5f72ed1 --- /dev/null +++ b/contracts/contracts/harvest/OETHBaseHarvester.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { SafeMath } from "@openzeppelin/contracts/utils/math/SafeMath.sol"; +import "@openzeppelin/contracts/utils/math/Math.sol"; + +import { StableMath } from "../utils/StableMath.sol"; +import { IOracle } from "../interfaces/IOracle.sol"; +import { IRouter } from "./../interfaces/aerodrome/IRouter.sol"; +import "../utils/Helpers.sol"; +import { AbstractHarvesterBase } from "./AbstractHarvesterBase.sol"; +import { IVault } from "./../interfaces/IVault.sol"; + +contract OETHBaseHarvester is AbstractHarvesterBase { + using SafeERC20 for IERC20; + using SafeMath for uint256; + using StableMath for uint256; + + enum SwapPlatform { + Aerodrome // Only aerodrome is supported for now. + } + + event PriceProviderAddressChanged(address priceProviderAddress); + + // Aerodrome route to swap using Aerodrome Router + mapping(address => bytes) public aerodromeRoute; + + constructor(address _vaultAddress, address _baseTokenAddress) + AbstractHarvesterBase(_vaultAddress, _baseTokenAddress) + {} + + /** + * @dev Add/update a reward token configuration that holds harvesting config variables + * @param _tokenAddress Address of the reward token + * @param tokenConfig.allowedSlippageBps uint16 maximum allowed slippage denominated in basis points. + * Example: 300 == 3% slippage + * @param tokenConfig.harvestRewardBps uint16 amount of reward tokens the caller of the function is rewarded. + * Example: 100 == 1% + * @param tokenConfig.swapPlatformAddr Address of a AMM contract to perform + * the exchange from reward tokens to stablecoin (currently hard-coded to USDT) + * @param tokenConfig.liquidationLimit uint256 Maximum amount of token to be sold per one swap function call. + * When value is 0 there is no limit. + * @param tokenConfig.doSwapRewardToken bool Disables swapping of the token when set to true, + * does not cause it to revert though. + * @param tokenConfig.swapPlatform SwapPlatform to use for Swapping + * @param swapData Route required for swapping + */ + function setRewardTokenConfig( + address _tokenAddress, + RewardTokenConfig calldata tokenConfig, + bytes calldata swapData + ) external onlyGovernor { + _validateConfigAndApproveTokens(_tokenAddress, tokenConfig); + + address newRouterAddress = tokenConfig.swapPlatformAddr; + uint8 _platform = tokenConfig.swapPlatform; + if (_platform == uint8(SwapPlatform.Aerodrome)) { + _validateAerodromeRoute(swapData, _tokenAddress); + aerodromeRoute[_tokenAddress] = swapData; + } else { + // Note: This code is unreachable since Solidity reverts when + // the value is outside the range of defined values of the enum + // (even if it's under the max length of the base type) + revert InvalidSwapPlatform(_platform); + } + + emit RewardTokenConfigUpdated( + _tokenAddress, + tokenConfig.allowedSlippageBps, + tokenConfig.harvestRewardBps, + uint8(_platform), + newRouterAddress, + swapData, + tokenConfig.liquidationLimit, + tokenConfig.doSwapRewardToken + ); + } + + /** + * @dev Validates the route to make sure the path is for `token` to `baseToken` + * + * @param data Route passed to the `setRewardTokenConfig` + * @param token The address of the reward token + */ + function _validateAerodromeRoute(bytes memory data, address token) + internal + view + { + IRouter.Route[] memory route = abi.decode(data, (IRouter.Route[])); + // Do some validation + if (route[0].from != token) { + revert InvalidTokenInSwapPath(route[0].from); + } + + if (route[route.length - 1].to != baseTokenAddress) { + revert InvalidTokenInSwapPath(route[route.length - 1].to); + } + } + + function _doSwap( + uint8 swapPlatform, + address routerAddress, + address rewardTokenAddress, + uint256 amountIn, + uint256 minAmountOut + ) internal virtual override returns (uint256 amountOut) { + if (swapPlatform == uint8(SwapPlatform.Aerodrome)) { + return + _swapWithAerodrome( + routerAddress, + rewardTokenAddress, + amountIn, + minAmountOut + ); + } else { + // Should never be invoked since we catch invalid values + // in the `setRewardTokenConfig` function before it's set + revert InvalidSwapPlatform(swapPlatform); + } + } + + /** + * @dev Swaps the token to `baseToken` with Aerodrome + * + * @param routerAddress Aerodrome Router address + * @param swapToken Address of the tokenIn + * @param amountIn Amount of `swapToken` to swap + * @param minAmountOut Minimum expected amount of `baseToken` + * + * @return amountOut Amount of `baseToken` received after the swap + */ + function _swapWithAerodrome( + address routerAddress, + address swapToken, + uint256 amountIn, + uint256 minAmountOut + ) internal returns (uint256 amountOut) { + IRouter.Route[] memory route = abi.decode( + aerodromeRoute[swapToken], + (IRouter.Route[]) + ); + + uint256[] memory amounts = IRouter(routerAddress) + .swapExactTokensForTokens( + amountIn, + minAmountOut, + route, + address(this), + block.timestamp + ); + + amountOut = amounts[amounts.length - 1]; + } +} diff --git a/contracts/contracts/harvest/OETHHarvester.sol b/contracts/contracts/harvest/OETHHarvester.sol index 609a5fc038..8acc0d75a1 100644 --- a/contracts/contracts/harvest/OETHHarvester.sol +++ b/contracts/contracts/harvest/OETHHarvester.sol @@ -1,10 +1,412 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { BaseHarvester } from "./BaseHarvester.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { SafeMath } from "@openzeppelin/contracts/utils/math/SafeMath.sol"; +import "@openzeppelin/contracts/utils/math/Math.sol"; -contract OETHHarvester is BaseHarvester { - constructor(address _vault, address _wethAddress) - BaseHarvester(_vault, _wethAddress) +import { StableMath } from "../utils/StableMath.sol"; +import { IVault } from "../interfaces/IVault.sol"; +import { IOracle } from "../interfaces/IOracle.sol"; +import { IUniswapV2Router } from "../interfaces/uniswap/IUniswapV2Router02.sol"; +import { IUniswapV3Router } from "../interfaces/uniswap/IUniswapV3Router.sol"; +import { IBalancerVault } from "../interfaces/balancer/IBalancerVault.sol"; +import { ICurvePool } from "../strategies/ICurvePool.sol"; +import "../utils/Helpers.sol"; +import { AbstractHarvesterBase } from "./AbstractHarvesterBase.sol"; + +contract OETHHarvester is AbstractHarvesterBase { + using SafeERC20 for IERC20; + using SafeMath for uint256; + using StableMath for uint256; + + enum SwapPlatform { + UniswapV2Compatible, + UniswapV3, + Balancer, + Curve + } + + error InvalidUniswapV2PathLength(); + error EmptyBalancerPoolId(); + error InvalidCurvePoolAssetIndex(address token); + + // Uniswap V2 path for reward tokens using Uniswap V2 Router + mapping(address => address[]) public uniswapV2Path; + // Uniswap V3 path for reward tokens using Uniswap V3 Router + mapping(address => bytes) public uniswapV3Path; + // Pool ID to use for reward tokens on Balancer + mapping(address => bytes32) public balancerPoolId; + + struct CurvePoolIndices { + // Casted into uint128 and stored in a struct to save gas + uint128 rewardTokenIndex; + uint128 baseTokenIndex; + } + // Packed indices of assets on the Curve pool + mapping(address => CurvePoolIndices) public curvePoolIndices; + + constructor(address _vaultAddress, address _baseTokenAddress) + AbstractHarvesterBase(_vaultAddress, _baseTokenAddress) {} + + /** + * @dev Add/update a reward token configuration that holds harvesting config variables + * @param _tokenAddress Address of the reward token + * @param tokenConfig.allowedSlippageBps uint16 maximum allowed slippage denominated in basis points. + * Example: 300 == 3% slippage + * @param tokenConfig.harvestRewardBps uint16 amount of reward tokens the caller of the function is rewarded. + * Example: 100 == 1% + * @param tokenConfig.swapPlatformAddr Address Address of a UniswapV2 compatible contract to perform + * the exchange from reward tokens to stablecoin (currently hard-coded to USDT) + * @param tokenConfig.liquidationLimit uint256 Maximum amount of token to be sold per one swap function call. + * When value is 0 there is no limit. + * @param tokenConfig.doSwapRewardToken bool Disables swapping of the token when set to true, + * does not cause it to revert though. + * @param tokenConfig.swapPlatform SwapPlatform to use for Swapping + * @param swapData Additional data required for swapping + */ + function setRewardTokenConfig( + address _tokenAddress, + RewardTokenConfig calldata tokenConfig, + bytes calldata swapData + ) external onlyGovernor { + _validateConfigAndApproveTokens(_tokenAddress, tokenConfig); + address newRouterAddress = tokenConfig.swapPlatformAddr; + + SwapPlatform _platform = SwapPlatform(tokenConfig.swapPlatform); + if (_platform == SwapPlatform.UniswapV2Compatible) { + uniswapV2Path[_tokenAddress] = _decodeUniswapV2Path( + swapData, + _tokenAddress + ); + } else if (_platform == SwapPlatform.UniswapV3) { + uniswapV3Path[_tokenAddress] = _decodeUniswapV3Path( + swapData, + _tokenAddress + ); + } else if (_platform == SwapPlatform.Balancer) { + balancerPoolId[_tokenAddress] = _decodeBalancerPoolId( + swapData, + newRouterAddress, + _tokenAddress + ); + } else if (_platform == SwapPlatform.Curve) { + curvePoolIndices[_tokenAddress] = _decodeCurvePoolIndices( + swapData, + newRouterAddress, + _tokenAddress + ); + } else { + // Note: This code is unreachable since Solidity reverts when + // the value is outside the range of defined values of the enum + // (even if it's under the max length of the base type) + revert InvalidSwapPlatform(uint8(_platform)); + } + + emit RewardTokenConfigUpdated( + _tokenAddress, + tokenConfig.allowedSlippageBps, + tokenConfig.harvestRewardBps, + uint8(_platform), + newRouterAddress, + swapData, + tokenConfig.liquidationLimit, + tokenConfig.doSwapRewardToken + ); + } + + /** + * @dev Decodes the data passed into Uniswap V2 path and validates + * it to make sure the path is for `token` to `baseToken` + * + * @param data Ecnoded data passed to the `setRewardTokenConfig` + * @param token The address of the reward token + * @return path The validated Uniswap V2 path + */ + function _decodeUniswapV2Path(bytes calldata data, address token) + internal + view + returns (address[] memory path) + { + (path) = abi.decode(data, (address[])); + uint256 len = path.length; + + if (len < 2) { + // Path should have at least two tokens + revert InvalidUniswapV2PathLength(); + } + + // Do some validation + if (path[0] != token) { + revert InvalidTokenInSwapPath(path[0]); + } + + if (path[len - 1] != baseTokenAddress) { + revert InvalidTokenInSwapPath(path[len - 1]); + } + } + + /** + * @dev Decodes the data passed into Uniswap V3 path and validates + * it to make sure the path is for `token` to `baseToken` + * + * @param data Ecnoded data passed to the `setRewardTokenConfig` + * @param token The address of the reward token + * @return path The validated Uniswap V3 path + */ + function _decodeUniswapV3Path(bytes calldata data, address token) + internal + view + returns (bytes calldata path) + { + path = data; + + address decodedAddress = address(uint160(bytes20(data[0:20]))); + + if (decodedAddress != token) { + // Invalid Reward Token in swap path + revert InvalidTokenInSwapPath(decodedAddress); + } + + decodedAddress = address(uint160(bytes20(data[path.length - 20:]))); + if (decodedAddress != baseTokenAddress) { + // Invalid Base Token in swap path + revert InvalidTokenInSwapPath(decodedAddress); + } + } + + /** + * @dev Decodes the data passed to Balancer Pool ID + * + * @param data Ecnoded data passed to the `setRewardTokenConfig` + * @return poolId The pool ID + */ + function _decodeBalancerPoolId( + bytes calldata data, + address balancerVault, + address token + ) internal view returns (bytes32 poolId) { + (poolId) = abi.decode(data, (bytes32)); + + if (poolId == bytes32(0)) { + revert EmptyBalancerPoolId(); + } + + IBalancerVault bVault = IBalancerVault(balancerVault); + + // Note: this reverts if token is not a pool asset + // slither-disable-next-line unused-return + bVault.getPoolTokenInfo(poolId, token); + + // slither-disable-next-line unused-return + bVault.getPoolTokenInfo(poolId, baseTokenAddress); + } + + /** + * @dev Decodes the data passed to get the pool indices and + * checks it against the Curve Pool to make sure it's + * not misconfigured. The indices are packed into a single + * uint256 for gas savings + * + * @param data Ecnoded data passed to the `setRewardTokenConfig` + * @param poolAddress Curve pool address + * @param token The address of the reward token + * @return indices Packed pool asset indices + */ + function _decodeCurvePoolIndices( + bytes calldata data, + address poolAddress, + address token + ) internal view returns (CurvePoolIndices memory indices) { + indices = abi.decode(data, (CurvePoolIndices)); + + ICurvePool pool = ICurvePool(poolAddress); + if (token != pool.coins(indices.rewardTokenIndex)) { + revert InvalidCurvePoolAssetIndex(token); + } + if (baseTokenAddress != pool.coins(indices.baseTokenIndex)) { + revert InvalidCurvePoolAssetIndex(baseTokenAddress); + } + } + + function _doSwap( + uint8 swapPlatform, + address routerAddress, + address rewardTokenAddress, + uint256 amountIn, + uint256 minAmountOut + ) internal virtual override returns (uint256 amountOut) { + SwapPlatform _swapPlatform = SwapPlatform(swapPlatform); + if (_swapPlatform == SwapPlatform.UniswapV2Compatible) { + return + _swapWithUniswapV2( + routerAddress, + rewardTokenAddress, + amountIn, + minAmountOut + ); + } else if (_swapPlatform == SwapPlatform.UniswapV3) { + return + _swapWithUniswapV3( + routerAddress, + rewardTokenAddress, + amountIn, + minAmountOut + ); + } else if (_swapPlatform == SwapPlatform.Balancer) { + return + _swapWithBalancer( + routerAddress, + rewardTokenAddress, + amountIn, + minAmountOut + ); + } else if (_swapPlatform == SwapPlatform.Curve) { + return + _swapWithCurve( + routerAddress, + rewardTokenAddress, + amountIn, + minAmountOut + ); + } else { + // Should never be invoked since we catch invalid values + // in the `setRewardTokenConfig` function before it's set + revert InvalidSwapPlatform(swapPlatform); + } + } + + /** + * @dev Swaps the token to `baseToken` with Uniswap V2 + * + * @param routerAddress Uniswap V2 Router address + * @param swapToken Address of the tokenIn + * @param amountIn Amount of `swapToken` to swap + * @param minAmountOut Minimum expected amount of `baseToken` + * + * @return amountOut Amount of `baseToken` received after the swap + */ + function _swapWithUniswapV2( + address routerAddress, + address swapToken, + uint256 amountIn, + uint256 minAmountOut + ) internal returns (uint256 amountOut) { + address[] memory path = uniswapV2Path[swapToken]; + + uint256[] memory amounts = IUniswapV2Router(routerAddress) + .swapExactTokensForTokens( + amountIn, + minAmountOut, + path, + address(this), + block.timestamp + ); + + amountOut = amounts[amounts.length - 1]; + } + + /** + * @dev Swaps the token to `baseToken` with Uniswap V3 + * + * @param routerAddress Uniswap V3 Router address + * @param swapToken Address of the tokenIn + * @param amountIn Amount of `swapToken` to swap + * @param minAmountOut Minimum expected amount of `baseToken` + * + * @return amountOut Amount of `baseToken` received after the swap + */ + function _swapWithUniswapV3( + address routerAddress, + address swapToken, + uint256 amountIn, + uint256 minAmountOut + ) internal returns (uint256 amountOut) { + bytes memory path = uniswapV3Path[swapToken]; + + IUniswapV3Router.ExactInputParams memory params = IUniswapV3Router + .ExactInputParams({ + path: path, + recipient: address(this), + deadline: block.timestamp, + amountIn: amountIn, + amountOutMinimum: minAmountOut + }); + amountOut = IUniswapV3Router(routerAddress).exactInput(params); + } + + /** + * @dev Swaps the token to `baseToken` on Balancer + * + * @param balancerVaultAddress BalancerVaultAddress + * @param swapToken Address of the tokenIn + * @param amountIn Amount of `swapToken` to swap + * @param minAmountOut Minimum expected amount of `baseToken` + * + * @return amountOut Amount of `baseToken` received after the swap + */ + function _swapWithBalancer( + address balancerVaultAddress, + address swapToken, + uint256 amountIn, + uint256 minAmountOut + ) internal returns (uint256 amountOut) { + bytes32 poolId = balancerPoolId[swapToken]; + + IBalancerVault.SingleSwap memory singleSwap = IBalancerVault + .SingleSwap({ + poolId: poolId, + kind: IBalancerVault.SwapKind.GIVEN_IN, + assetIn: swapToken, + assetOut: baseTokenAddress, + amount: amountIn, + userData: hex"" + }); + + IBalancerVault.FundManagement memory fundMgmt = IBalancerVault + .FundManagement({ + sender: address(this), + fromInternalBalance: false, + recipient: payable(address(this)), + toInternalBalance: false + }); + + amountOut = IBalancerVault(balancerVaultAddress).swap( + singleSwap, + fundMgmt, + minAmountOut, + block.timestamp + ); + } + + /** + * @dev Swaps the token to `baseToken` on Curve + * + * @param poolAddress Curve Pool Address + * @param swapToken Address of the tokenIn + * @param amountIn Amount of `swapToken` to swap + * @param minAmountOut Minimum expected amount of `baseToken` + * + * @return amountOut Amount of `baseToken` received after the swap + */ + function _swapWithCurve( + address poolAddress, + address swapToken, + uint256 amountIn, + uint256 minAmountOut + ) internal returns (uint256 amountOut) { + CurvePoolIndices memory indices = curvePoolIndices[swapToken]; + + // Note: Not all CurvePools return the `amountOut`, make sure + // to use only pool that do. Otherwise the swap would revert + // always + amountOut = ICurvePool(poolAddress).exchange( + uint256(indices.rewardTokenIndex), + uint256(indices.baseTokenIndex), + amountIn, + minAmountOut + ); + } } diff --git a/contracts/contracts/interfaces/aerodrome/IVoter.sol b/contracts/contracts/interfaces/aerodrome/IVoter.sol index eff54591d4..7a552c54c4 100644 --- a/contracts/contracts/interfaces/aerodrome/IVoter.sol +++ b/contracts/contracts/interfaces/aerodrome/IVoter.sol @@ -9,4 +9,7 @@ interface IVoter { function createGauge(address _poolFactory, address _pool) external returns (address); + + /// @dev Pool => Gauge + function gauges(address pool) external view returns (address); } diff --git a/contracts/contracts/oracle/AbstractOracleRouterWithFeed.sol b/contracts/contracts/oracle/AbstractOracleRouterWithFeed.sol new file mode 100644 index 0000000000..2523723f31 --- /dev/null +++ b/contracts/contracts/oracle/AbstractOracleRouterWithFeed.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../interfaces/chainlink/AggregatorV3Interface.sol"; +import { OracleRouterBase } from "./OracleRouterBase.sol"; +import { StableMath } from "../utils/StableMath.sol"; + +// @notice Abstract Oracle Router with custom price feed +abstract contract AbstractOracleRouterWithFeed is OracleRouterBase { + using StableMath for uint256; + + address public immutable priceFeed; + + constructor(address _feed) { + priceFeed = _feed; + } + + /** + * @notice Returns the total price in 18 digit units for a given asset. + * This implementation does not (!) do range checks as the + * parent OracleRouter does. + * @param asset address of the asset + * @return uint256 unit price for 1 asset unit, in 18 decimal fixed + */ + function price(address asset) + external + view + virtual + override + returns (uint256) + { + (address _feed, uint256 maxStaleness) = feedMetadata(asset); + if (_feed == FIXED_PRICE) { + return 1e18; + } + require(_feed != address(0), "Asset not available"); + + // slither-disable-next-line unused-return + (, int256 _iprice, , uint256 updatedAt, ) = AggregatorV3Interface(_feed) + .latestRoundData(); + + require( + updatedAt + maxStaleness >= block.timestamp, + "Oracle price too old" + ); + + uint8 decimals = getDecimals(_feed); + uint256 _price = uint256(_iprice).scaleBy(18, decimals); + return _price; + } +} diff --git a/contracts/contracts/oracle/BaseOETHOracleRouter.sol b/contracts/contracts/oracle/BaseOETHOracleRouter.sol index 5cfd656807..3bda545153 100644 --- a/contracts/contracts/oracle/BaseOETHOracleRouter.sol +++ b/contracts/contracts/oracle/BaseOETHOracleRouter.sol @@ -2,52 +2,16 @@ pragma solidity ^0.8.0; import "../interfaces/chainlink/AggregatorV3Interface.sol"; -import { OracleRouterBase } from "./OracleRouterBase.sol"; +import { AbstractOracleRouterWithFeed } from "./AbstractOracleRouterWithFeed.sol"; import { StableMath } from "../utils/StableMath.sol"; // @notice Oracle Router that denominates all prices in ETH for base network -contract BaseOETHOracleRouter is OracleRouterBase { +contract BaseOETHOracleRouter is AbstractOracleRouterWithFeed { using StableMath for uint256; - address public immutable aeroPriceFeed; - - constructor(address _aeroPriceFeed) { - aeroPriceFeed = _aeroPriceFeed; - } - - /** - * @notice Returns the total price in 18 digit units for a given asset. - * This implementation does not (!) do range checks as the - * parent OracleRouter does. - * @param asset address of the asset - * @return uint256 unit price for 1 asset unit, in 18 decimal fixed - */ - function price(address asset) - external - view - virtual - override - returns (uint256) - { - (address _feed, uint256 maxStaleness) = feedMetadata(asset); - if (_feed == FIXED_PRICE) { - return 1e18; - } - require(_feed != address(0), "Asset not available"); - - // slither-disable-next-line unused-return - (, int256 _iprice, , uint256 updatedAt, ) = AggregatorV3Interface(_feed) - .latestRoundData(); - - require( - updatedAt + maxStaleness >= block.timestamp, - "Oracle price too old" - ); - - uint8 decimals = getDecimals(_feed); - uint256 _price = uint256(_iprice).scaleBy(18, decimals); - return _price; - } + constructor(address _aeroPriceFeed) + AbstractOracleRouterWithFeed(_aeroPriceFeed) + {} /** * @dev The price feed contract to use for a particular asset along with @@ -69,7 +33,7 @@ contract BaseOETHOracleRouter is OracleRouterBase { maxStaleness = 0; } else if (asset == 0x940181a94A35A4569E4529A3CDfB74e38FD98631) { // AERO/ETH - feedAddress = aeroPriceFeed; + feedAddress = priceFeed; maxStaleness = 1 days; } else { revert("Asset not available"); diff --git a/contracts/contracts/oracle/OETHOracleRouter.sol b/contracts/contracts/oracle/OETHOracleRouter.sol index 4f3a853398..ccace87160 100644 --- a/contracts/contracts/oracle/OETHOracleRouter.sol +++ b/contracts/contracts/oracle/OETHOracleRouter.sol @@ -2,52 +2,16 @@ pragma solidity ^0.8.0; import "../interfaces/chainlink/AggregatorV3Interface.sol"; -import { OracleRouterBase } from "./OracleRouterBase.sol"; +import { AbstractOracleRouterWithFeed } from "./AbstractOracleRouterWithFeed.sol"; import { StableMath } from "../utils/StableMath.sol"; // @notice Oracle Router that denominates all prices in ETH -contract OETHOracleRouter is OracleRouterBase { +contract OETHOracleRouter is AbstractOracleRouterWithFeed { using StableMath for uint256; - address public immutable auraPriceFeed; - - constructor(address _auraPriceFeed) { - auraPriceFeed = _auraPriceFeed; - } - - /** - * @notice Returns the total price in 18 digit units for a given asset. - * This implementation does not (!) do range checks as the - * parent OracleRouter does. - * @param asset address of the asset - * @return uint256 unit price for 1 asset unit, in 18 decimal fixed - */ - function price(address asset) - external - view - virtual - override - returns (uint256) - { - (address _feed, uint256 maxStaleness) = feedMetadata(asset); - if (_feed == FIXED_PRICE) { - return 1e18; - } - require(_feed != address(0), "Asset not available"); - - // slither-disable-next-line unused-return - (, int256 _iprice, , uint256 updatedAt, ) = AggregatorV3Interface(_feed) - .latestRoundData(); - - require( - updatedAt + maxStaleness >= block.timestamp, - "Oracle price too old" - ); - - uint8 decimals = getDecimals(_feed); - uint256 _price = uint256(_iprice).scaleBy(18, decimals); - return _price; - } + constructor(address _auraPriceFeed) + AbstractOracleRouterWithFeed(_auraPriceFeed) + {} /** * @dev The price feed contract to use for a particular asset along with @@ -103,7 +67,7 @@ contract OETHOracleRouter is OracleRouterBase { maxStaleness = 1 days + STALENESS_BUFFER; } else if (asset == 0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF) { // AURA/ETH - feedAddress = auraPriceFeed; + feedAddress = priceFeed; maxStaleness = 0; } else { revert("Asset not available"); diff --git a/contracts/contracts/proxies/Proxies.sol b/contracts/contracts/proxies/Proxies.sol index c8e1813012..e5d3cc8fb2 100644 --- a/contracts/contracts/proxies/Proxies.sol +++ b/contracts/contracts/proxies/Proxies.sol @@ -216,3 +216,17 @@ contract BridgedWOETHProxy is InitializeGovernedUpgradeabilityProxy { contract BridgedBaseWOETHProxy is InitializeGovernedUpgradeabilityProxy { } + +/** + * @notice AerodromeEthStrategyProxy delegates calls to AerodromEthStrategy implementation + */ +contract AerodromeEthStrategyProxy is InitializeGovernedUpgradeabilityProxy { + +} + +/** + * @notice OETHBaseHarvesterProxy delegates calls to a Harvester implementation + */ +contract OETHBaseHarvesterProxy is InitializeGovernedUpgradeabilityProxy { + +} diff --git a/contracts/contracts/strategies/AerodromeEthStrategy.sol b/contracts/contracts/strategies/AerodromeEthStrategy.sol index 622c817824..068c2818ee 100644 --- a/contracts/contracts/strategies/AerodromeEthStrategy.sol +++ b/contracts/contracts/strategies/AerodromeEthStrategy.sol @@ -17,7 +17,6 @@ import { StableMath } from "../utils/StableMath.sol"; import { IVault } from "../interfaces/IVault.sol"; import { IWETH9 } from "../interfaces/IWETH9.sol"; import { FixedPointMathLib } from "solady/src/utils/FixedPointMathLib.sol"; -import "hardhat/console.sol"; contract AerodromeEthStrategy is InitializableAbstractStrategy { using StableMath for uint256; @@ -76,6 +75,7 @@ contract AerodromeEthStrategy is InitializableAbstractStrategy { address(oeth), address(aeroFactoryAddress) ); + _; // Get the ratio of oeth to weth after rebalance. @@ -84,10 +84,9 @@ contract AerodromeEthStrategy is InitializableAbstractStrategy { address(oeth), address(aeroFactoryAddress) ); - // Ensure that the rebalance does not cross the midpoint and that the final ratio better than initial. require(finalRatio > midpoint, "WETH reserves exceeds OETH"); // This means we needed more WETH (not profitable) - require(finalRatio <= initialRatio, "Pool imbalance worsened"); + require(initialRatio > finalRatio, "Pool imbalance worsened"); } constructor( diff --git a/contracts/deploy/base/001_core_base.js b/contracts/deploy/base/001_core_base.js new file mode 100644 index 0000000000..f5faacbda8 --- /dev/null +++ b/contracts/deploy/base/001_core_base.js @@ -0,0 +1,338 @@ +const addresses = require("../../utils/addresses.js"); +const hre = require("hardhat"); +const { BigNumber, utils } = require("ethers"); +const { getAssetAddresses } = require("../../test/helpers.js"); +const { deployOnBaseWithGuardian } = require("../../utils/delpoy-l2.js"); + +// 5/8 multisig +const guardianAddr = addresses.base.governor; + +module.exports = deployOnBaseWithGuardian( + { deployName: "001_core_base" }, + async ({ deployWithConfirmation, ethers, withConfirmation }) => { + let actions = []; + const coreActions = await deployCore({ + deployWithConfirmation, + withConfirmation, + ethers, + }); + + actions = actions.concat(coreActions); + + await deployDripper({ deployWithConfirmation, withConfirmation, ethers }); + + const harvesterActions = await deployHarvester({ + deployWithConfirmation, + withConfirmation, + ethers, + }); + + actions = actions.concat(harvesterActions); + + // Governance Actions + // ---------------- + return { + name: "Deploy OETH Vault, Dripper and Harvester", + actions, + }; + } +); + +/** + * Deploy the core contracts (Vault and OETH). + */ +const deployCore = async ({ + deployWithConfirmation, + withConfirmation, + ethers, +}) => { + const { deployerAddr, strategistAddr } = await getNamedAccounts(); + const sDeployer = await ethers.provider.getSigner(deployerAddr); + const assetAddresses = await getAssetAddresses(hre.deployments); + console.log( + `Using asset addresses: ${JSON.stringify(assetAddresses, null, 2)}` + ); + + // Proxies + await deployWithConfirmation("OETHVaultProxy"); + await deployWithConfirmation("OETHProxy"); + + //await deployWithConfirmation("OETHOracleRouter"); + await deployWithConfirmation( + "PriceFeedPair", + [ + addresses.base.aeroUsdPriceFeed, + addresses.base.ethUsdPriceFeed, + false, + true, + ], + "PriceFeedPair" + ); + const priceFeedPair = await ethers.getContract("PriceFeedPair"); + oracleContract = "BaseOETHOracleRouter"; + contractName = "BaseOETHOracleRouter"; + args = [priceFeedPair.address]; + + await deployWithConfirmation(contractName, args, oracleContract); + + // Main contracts + const dOETH = await deployWithConfirmation("OETH"); + /* We have wrapper contracts for all of the contracts that are shared between the + * protocols. The reason for that is that we want separate deployment artifacts and + * separate storage slot layouts for these shared contracts. + */ + const dVault = await deployWithConfirmation("OETHVault", null, null, false); + const dVaultCore = await deployWithConfirmation("OETHVaultCore", [ + assetAddresses.WETH, + ]); + const dVaultAdmin = await deployWithConfirmation("OETHVaultAdmin"); + + // Get contract instances + const cOETHProxy = await ethers.getContract("OETHProxy"); + const cVaultProxy = await ethers.getContract("OETHVaultProxy"); + const cOETH = await ethers.getContractAt("OETH", cOETHProxy.address); + const cOETHOracleRouter = await ethers.getContract("BaseOETHOracleRouter"); + const cVault = await ethers.getContractAt("OETHVault", cVaultProxy.address); + + await withConfirmation( + cOETHProxy.connect(sDeployer)[ + // eslint-disable-next-line no-unexpected-multiline + "initialize(address,address,bytes)" + ](dOETH.address, deployerAddr, []) + ); + console.log("Initialized OETHProxy"); + + // Need to call the initializer on the Vault then upgraded it to the actual + // VaultCore implementation + await withConfirmation( + cVaultProxy.connect(sDeployer)[ + // eslint-disable-next-line no-unexpected-multiline + "initialize(address,address,bytes)" + ](dVault.address, deployerAddr, []) + ); + console.log("Initialized OETHVaultProxy"); + + await withConfirmation( + cVault + .connect(sDeployer) + .initialize(cOETHOracleRouter.address, cOETHProxy.address) + ); + console.log("Initialized OETHVault"); + + await withConfirmation( + cVaultProxy.connect(sDeployer).upgradeTo(dVaultCore.address) + ); + console.log("Upgraded OETHVaultCore implementation"); + + await withConfirmation( + cVault.connect(sDeployer).setAdminImpl(dVaultAdmin.address) + ); + + await withConfirmation( + cVault + .connect(sDeployer) + .setAutoAllocateThreshold(utils.parseUnits("25", 18)) + ); + + await withConfirmation(cOETHOracleRouter.cacheDecimals(assetAddresses.AERO)); + + await withConfirmation( + cVault.connect(sDeployer).setRebaseThreshold(utils.parseUnits("5", 18)) + ); + + await withConfirmation( + cVault.connect(sDeployer).setStrategistAddr(strategistAddr) + ); + + await withConfirmation( + cVault.connect(sDeployer).setTrusteeAddress(strategistAddr) + ); + + await withConfirmation( + cVault.connect(sDeployer).setTrusteeFeeBps(0) // 0% + ); + + await withConfirmation(cVault.connect(sDeployer).unpauseCapital()); + + await withConfirmation( + // 0 stands for DECIMAL unit conversion + cVault.connect(sDeployer).supportAsset(assetAddresses.WETH, 0) + ); + + console.log("Initialized OETHVaultAdmin implementation"); + + await withConfirmation( + cOETHProxy.connect(sDeployer).transferGovernance(guardianAddr) + ); + await withConfirmation( + cVaultProxy.connect(sDeployer).transferGovernance(guardianAddr) + ); + + console.log("Governance transfer initialized"); + + // return actions to be executed by the Governor + return [ + { + // Claim Vault governance + contract: cVaultProxy, + signature: "claimGovernance()", + args: [], + }, + { + // Claim OETH governance + contract: cOETHProxy, + signature: "claimGovernance()", + args: [], + }, + { + // Upgrade OETH proxy + contract: cOETHProxy, + signature: "upgradeTo(address)", + args: [dOETH.address], + }, + { + // Initialize OETH in the proxy storage slot space + contract: cOETH, + signature: "initialize(string,string,address,uint256)", + // TODO: Verify name is ok + args: [ + "OETH Base", + "OETHbase", + cVaultProxy.address, + utils.parseUnits("1", 27).sub(BigNumber.from(1)), + ], + }, + ]; +}; + +const deployDripper = async ({ + deployWithConfirmation, + withConfirmation, + ethers, +}) => { + const { deployerAddr } = await getNamedAccounts(); + const sDeployer = await ethers.provider.getSigner(deployerAddr); + + const assetAddresses = await getAssetAddresses(deployments); + const cVaultProxy = await ethers.getContract("OETHVaultProxy"); + + // Deploy Dripper Impl + const dDripper = await deployWithConfirmation("OETHDripper", [ + cVaultProxy.address, + assetAddresses.WETH, + ]); + await deployWithConfirmation("OETHDripperProxy"); + // Deploy Dripper Proxy + const cDripperProxy = await ethers.getContract("OETHDripperProxy"); + await withConfirmation( + cDripperProxy.connect(sDeployer)[ + // eslint-disable-next-line no-unexpected-multiline + "initialize(address,address,bytes)" + ](dDripper.address, guardianAddr, []) + ); +}; + +const deployHarvester = async ({ + deployWithConfirmation, + withConfirmation, + ethers, +}) => { + const assetAddresses = await getAssetAddresses(deployments); + const { deployerAddr, governorAddr } = await getNamedAccounts(); + const sGovernor = await ethers.provider.getSigner(governorAddr); + const sDeployer = await ethers.provider.getSigner(deployerAddr); + + const cOETHVaultProxy = await ethers.getContract("OETHVaultProxy"); + const cDripper = await ethers.getContract("OETHDripperProxy"); + + const dOETHBaseHarvesterProxy = await deployWithConfirmation( + "OETHBaseHarvesterProxy", + [], + "InitializeGovernedUpgradeabilityProxy" + ); + const cOETHBaseHarvesterProxy = await ethers.getContract( + "OETHBaseHarvesterProxy" + ); + + const dOETHBaseHarvester = await deployWithConfirmation("OETHBaseHarvester", [ + cOETHVaultProxy.address, + assetAddresses.WETH, + ]); + + const cOETHBaseHarvester = await ethers.getContractAt( + "OETHBaseHarvester", + dOETHBaseHarvesterProxy.address + ); + await withConfirmation( + cOETHBaseHarvesterProxy + .connect(sDeployer) + ["initialize(address,address,bytes)"]( + dOETHBaseHarvester.address, + deployerAddr, + [] + ) + ); + console.log("Initialized OETHBaseHarvesterProxy"); + + await withConfirmation( + cOETHBaseHarvesterProxy.connect(sDeployer).transferGovernance(guardianAddr) + ); + + console.log("Governance transfer initialized"); + + const abiCoder = ethers.utils.defaultAbiCoder; + const type = { + type: "tuple[]", + name: "Route", + components: [ + { name: "from", type: "address" }, + { name: "to", type: "address" }, + { name: "stable", type: "bool" }, + { name: "factory", type: "address" }, + ], + }; + + // data for encoding + const routes = [ + { + from: addresses.base.aeroTokenAddress, + to: addresses.base.wethTokenAddress, + stable: true, + factory: addresses.base.aeroFactoryAddress, + }, + ]; + const encodedRoute = abiCoder.encode([type], [routes]); + + return [ + { + // Claim governance + contract: cOETHBaseHarvesterProxy, + signature: "claimGovernance()", + args: [], + }, + { + // Set reward token config + contract: cOETHBaseHarvester, + signature: + "setRewardTokenConfig(address,(uint16,uint16,address,bool,uint8,uint256),bytes)", + args: [ + assetAddresses.AERO, + { + allowedSlippageBps: 800, + harvestRewardBps: 100, + swapPlatform: 0, // Aerodrome + swapPlatformAddr: addresses.base.aeroRouterAddress, + liquidationLimit: 0, + doSwapRewardToken: true, + }, + encodedRoute, + ], + }, + { + // Set reward proceeds + contract: cOETHBaseHarvester, + signature: "setRewardProceedsAddress(address)", + args: [cDripper.address], + }, + ]; +}; diff --git a/contracts/deploy/092_woeth_on_base.js b/contracts/deploy/base/002_woeth_on_base.js similarity index 83% rename from contracts/deploy/092_woeth_on_base.js rename to contracts/deploy/base/002_woeth_on_base.js index feec1b8d9a..c58cbdb3b4 100644 --- a/contracts/deploy/092_woeth_on_base.js +++ b/contracts/deploy/base/002_woeth_on_base.js @@ -1,10 +1,13 @@ -const { deployOnBase } = require("../utils/delpoy-l2"); -const { deployWithConfirmation, withConfirmation } = require("../utils/deploy"); -const { getTxOpts } = require("../utils/tx"); +const { deployOnBase } = require("../../utils/delpoy-l2"); +const { + deployWithConfirmation, + withConfirmation, +} = require("../../utils/deploy"); +const { getTxOpts } = require("../../utils/tx"); module.exports = deployOnBase( { - deployName: "092_woeth_on_base", + deployName: "002_woeth_on_base", }, async ({ ethers }) => { const { deployerAddr } = await getNamedAccounts(); diff --git a/contracts/deploy/base/003_deploy_aero_strategy.js b/contracts/deploy/base/003_deploy_aero_strategy.js new file mode 100644 index 0000000000..468bd8729e --- /dev/null +++ b/contracts/deploy/base/003_deploy_aero_strategy.js @@ -0,0 +1,238 @@ +const addresses = require("../../utils/addresses.js"); +const hre = require("hardhat"); +const { + getAssetAddresses, + isFork, + oethUnits, +} = require("../../test/helpers.js"); +const { deployOnBaseWithGuardian } = require("../../utils/delpoy-l2.js"); +const { isBaseForkTest } = require("../../utils/hardhat-helpers.js"); +const { hardhatSetBalance } = require("../../test/_fund.js"); +const { impersonateAndFund } = require("../../utils/signers.js"); +const { BigNumber } = require("ethers"); + +// 5/8 multisig +const guardianAddr = addresses.base.governor; + +module.exports = deployOnBaseWithGuardian( + { deployName: "003_deploy_aero_strategy" }, + async ({ deployWithConfirmation, ethers, withConfirmation }) => { + let actions = []; + const { deployerAddr } = await getNamedAccounts(); + const oethVaultProxy = await ethers.getContract("OETHVaultProxy"); + const oethProxy = await ethers.getContract("OETHProxy"); + const oeth = await ethers.getContractAt("OETH", oethProxy.address); + const weth = await ethers.getContractAt( + "IWETH9", + addresses.base.wethTokenAddress + ); + if (isFork) { + await hardhatSetBalance(deployerAddr); + if (isBaseForkTest) { + const signers = await hre.ethers.getSigners(); + + const [minter, burner, josh, rafael, nick] = signers.slice(4); // Skip first 4 addresses to avoid conflict + const vaultSigner = await impersonateAndFund(oethVaultProxy.address); + + await oeth.connect(vaultSigner).mint(josh.address, oethUnits("250")); + await weth.connect(josh).deposit({ value: oethUnits("350") }); + + // Loading the AeroRouter instance + const aeroRouter = await ethers.getContractAt( + "IRouter", + addresses.base.aeroRouterAddress + ); + // Approve the router to spend the tokens + await weth.connect(josh).approve(aeroRouter.address, oethUnits("250")); + await oeth.connect(josh).approve(aeroRouter.address, oethUnits("250")); + + // Add initial liquidity (250 on each side) + await aeroRouter.connect(josh).addLiquidity( + weth.address, + oeth.address, + true, + oethUnits("250"), + oethUnits("250"), + // Slippage adjusted + oethUnits("250"), + oethUnits("250"), + josh.address, + parseInt(Date.now() / 1000) + ); + + let poolAddress = await aeroRouter.poolFor( + weth.address, + oeth.address, + true, + addresses.base.aeroFactoryAddress + ); + + console.log(`OETH pool created on Aerodrome: ${poolAddress}`); + + // Create gauge + const aeroVoter = await ethers.getContractAt( + "IVoter", + addresses.base.aeroVoterAddress + ); + // Create gauge for weth/oeth LP + let governor = await impersonateAndFund( + addresses.base.aeroGaugeGovernorAddress + ); + + await aeroVoter + .connect(governor) + .createGauge(addresses.base.aeroFactoryAddress, poolAddress); + + const gaugeAddress = await aeroVoter.gauges(poolAddress); + console.log( + `Gauge created for weth/oeth pool at address: ${gaugeAddress}` + ); + } + } + + console.log("Deploying Aerodrome Strategy"); + actions = await deployAerodromeStrategy({ + deployWithConfirmation, + withConfirmation, + ethers, + }); + + return { + name: "Deploy Aerodrome strategy", + actions, + }; + } +); + +/** + * Deploy the core contracts (Vault and OETH). + */ +const deployAerodromeStrategy = async ({ + deployWithConfirmation, + withConfirmation, + ethers, +}) => { + const assetAddresses = await getAssetAddresses(deployments); + const { deployerAddr, governorAddr } = await getNamedAccounts(); + + const sGovernor = await ethers.provider.getSigner(governorAddr); + const sDeployer = await ethers.provider.getSigner(deployerAddr); + + const oethVaultProxy = await ethers.getContract("OETHVaultProxy"); + const oethVault = await ethers.getContractAt( + "IVault", + oethVaultProxy.address + ); + + const oeth = await ethers.getContract("OETHProxy"); + + console.log("Deploy AerodromeEthStrategyProxy"); + const dAerodromeEthStrategyProxy = await deployWithConfirmation( + "AerodromeEthStrategyProxy" + ); + const cAerodromeEthStrategyProxy = await ethers.getContract( + "AerodromeEthStrategyProxy" + ); + // Loading the AeroRouter instance + const aeroRouter = await ethers.getContractAt( + "IRouter", + addresses.base.aeroRouterAddress + ); + let poolAddress = await aeroRouter.poolFor( + assetAddresses.WETH, + oeth.address, + true, + addresses.base.aeroFactoryAddress + ); + // Fetch Gauge address + const cAeroVoter = await ethers.getContractAt( + "IVoter", + addresses.base.aeroVoterAddress + ); + + const gaugeAddress = await cAeroVoter.gauges(poolAddress); + + console.log("Deploy AerodromeEthStrategy"); + const dStrategyImpl = await deployWithConfirmation("AerodromeEthStrategy", [ + [poolAddress, oethVault.address], + [ + addresses.base.aeroRouterAddress, + gaugeAddress, + addresses.base.aeroFactoryAddress, + poolAddress, + oeth.address, + assetAddresses.WETH, + ], + ]); + const cStrategyImpl = await ethers.getContractAt( + "AerodromeEthStrategy", + dStrategyImpl.address + ); + + console.log("Deploy encode initialize function of the strategy contract"); + const initData = cStrategyImpl.interface.encodeFunctionData( + "initialize(address[],address[])", + [ + [assetAddresses.AERO], // reward token addresses + [assetAddresses.WETH], // asset token addresses + ] + ); + + console.log( + "Initialize the proxy and execute the initialize strategy function" + ); + await withConfirmation( + cAerodromeEthStrategyProxy.connect(sDeployer)[ + // eslint-disable-next-line no-unexpected-multiline + "initialize(address,address,bytes)" + ]( + cStrategyImpl.address, // implementation address + deployerAddr, + initData // data for call to the initialize function on the strategy + ) + ); + + await withConfirmation( + cAerodromeEthStrategyProxy + .connect(sDeployer) + .transferGovernance(guardianAddr) + ); + + console.log("Set harvester address"); + const cStrategy = await ethers.getContractAt( + "AerodromeEthStrategy", + cAerodromeEthStrategyProxy.address + ); + const cHarvester = await ethers.getContract("OETHBaseHarvesterProxy"); + const fiftyMil = BigNumber.from(50000000).mul(BigNumber.from(10).pow(18)); + + // return actions to be executed by the Governor + return [ + { + // Claim Vault governance + contract: cAerodromeEthStrategyProxy, + signature: "claimGovernance()", + args: [], + }, + { + contract: cStrategy, + signature: "setHarvesterAddress(address)", + args: [cHarvester.address], + }, + { + contract: oethVault, + signature: "setOusdMetaStrategy(address)", + args: [cStrategy.address], + }, + { + contract: oethVault, + signature: "setNetOusdMintForStrategyThreshold(uint256)", + args: [fiftyMil], + }, + { + contract: oethVault, + signature: "approveStrategy(address)", + args: [cStrategy.address], + }, + ]; +}; diff --git a/contracts/deploy/deployActions.js b/contracts/deploy/deployActions.js index 2fafd7d8ee..3135769067 100644 --- a/contracts/deploy/deployActions.js +++ b/contracts/deploy/deployActions.js @@ -7,12 +7,15 @@ const { isMainnet, isMainnetOrFork, isHolesky, + isBaseOrFork, } = require("../test/helpers.js"); const { deployWithConfirmation, withConfirmation } = require("../utils/deploy"); const { metapoolLPCRVPid, lusdMetapoolLPCRVPid, } = require("../utils/constants"); +const { isBase } = require("../utils/hardhat-helpers.js"); +const { BigNumber } = require("ethers"); const log = require("../utils/logger")("deploy:core"); @@ -496,6 +499,13 @@ const configureOETHVault = async (isSimpleOETH) => { .connect(sGovernor) .setAutoAllocateThreshold(ethers.utils.parseUnits("5", 18)) ); + + if (isBase) { + // Set strategist address to governor + await withConfirmation( + cVault.connect(sGovernor).setStrategistAddr(governorAddr) + ); + } }; const deployOUSDHarvester = async (ousdDripper) => { @@ -545,9 +555,9 @@ const deployOUSDHarvester = async (ousdDripper) => { const deployOETHHarvester = async (oethDripper) => { const assetAddresses = await getAssetAddresses(deployments); - const { governorAddr } = await getNamedAccounts(); + const { deployerAddr, governorAddr } = await getNamedAccounts(); const sGovernor = await ethers.provider.getSigner(governorAddr); - const cVaultProxy = await ethers.getContract("VaultProxy"); + const sDeployer = await ethers.provider.getSigner(deployerAddr); const cOETHVaultProxy = await ethers.getContract("OETHVaultProxy"); const dOETHHarvesterProxy = await deployWithConfirmation( @@ -568,26 +578,129 @@ const deployOETHHarvester = async (oethDripper) => { ); await withConfirmation( - cOETHHarvesterProxy["initialize(address,address,bytes)"]( - dOETHHarvester.address, - governorAddr, - [] - ) + cOETHHarvesterProxy + .connect(sDeployer) + ["initialize(address,address,bytes)"]( + dOETHHarvester.address, + governorAddr, + [] + ) ); log("Initialized OETHHarvesterProxy"); + let rewardProceedsAddress; + if (isMainnet || isHolesky || isBaseOrFork) { + rewardProceedsAddress = oethDripper.address; + } else { + rewardProceedsAddress = (await ethers.getContract("VaultProxy")).address; + } + if (isBaseOrFork) { + await withConfirmation( + cOETHHarvester.connect(sGovernor).setRewardTokenConfig( + addresses.base.aeroTokenAddress, + { + allowedSlippageBps: 800, + harvestRewardBps: 100, + swapPlatform: 0, // Aerodrome + swapPlatformAddr: addresses.base.aeroRouterAddress, + liquidationLimit: 0, + doSwapRewardToken: true, + }, + [ + { + from: addresses.base.aeroTokenAddress, + to: addresses.base.wethTokenAddress, + stable: true, + factory: addresses.base.aeroFactoryAddress, + }, + ] + ) + ); + } await withConfirmation( cOETHHarvester .connect(sGovernor) - .setRewardProceedsAddress( - isMainnet || isHolesky ? oethDripper.address : cVaultProxy.address - ) + .setRewardProceedsAddress(rewardProceedsAddress) ); return dOETHHarvesterProxy; }; +const deployOETHBaseHarvester = async (oethDripper) => { + if (!isBaseOrFork) { + // Run only on base + return; + } + const assetAddresses = await getAssetAddresses(deployments); + const { deployerAddr, governorAddr } = await getNamedAccounts(); + const sGovernor = await ethers.provider.getSigner(governorAddr); + const sDeployer = await ethers.provider.getSigner(deployerAddr); + + const cOETHVaultProxy = await ethers.getContract("OETHVaultProxy"); + + const dOETHBaseHarvesterProxy = await deployWithConfirmation( + "OETHBaseHarvesterProxy", + [], + "InitializeGovernedUpgradeabilityProxy" + ); + const cOETHBaseHarvesterProxy = await ethers.getContract( + "OETHBaseHarvesterProxy" + ); + + const dOETHBaseHarvester = await deployWithConfirmation("OETHBaseHarvester", [ + cOETHVaultProxy.address, + assetAddresses.WETH, + ]); + + const cOETHBaseHarvester = await ethers.getContractAt( + "OETHBaseHarvester", + dOETHBaseHarvesterProxy.address + ); + await withConfirmation( + cOETHBaseHarvesterProxy + .connect(sDeployer) + ["initialize(address,address,bytes)"]( + dOETHBaseHarvester.address, + governorAddr, + [] + ) + ); + + log("Initialized OETHBaseHarvesterProxy"); + await withConfirmation( + cOETHBaseHarvester.connect(sGovernor).setRewardTokenConfig( + assetAddresses.AERO, + { + allowedSlippageBps: 800, + harvestRewardBps: 100, + swapPlatform: 0, // Aerodrome + swapPlatformAddr: addresses.base.aeroRouterAddress, + liquidationLimit: 0, + doSwapRewardToken: true, + }, + [ + { + from: addresses.base.aeroTokenAddress, + to: addresses.base.wethTokenAddress, + stable: true, + factory: addresses.base.aeroFactoryAddress, + }, + ] + ) + ); + + log("Reward token config set"); + + await withConfirmation( + cOETHBaseHarvester + .connect(sGovernor) + .setRewardProceedsAddress(oethDripper.address) + ); + + return dOETHBaseHarvesterProxy; +}; + /** * Deploy Harvester */ @@ -702,11 +815,13 @@ const deployOUSDDripper = async () => { }; const deployOETHDripper = async () => { - const { governorAddr } = await getNamedAccounts(); + const { deployerAddr, governorAddr } = await getNamedAccounts(); const assetAddresses = await getAssetAddresses(deployments); const cVaultProxy = await ethers.getContract("OETHVaultProxy"); + // signer + const sDeployer = await ethers.provider.getSigner(deployerAddr); // Deploy Dripper Impl const dDripper = await deployWithConfirmation("OETHDripper", [ cVaultProxy.address, @@ -717,11 +832,9 @@ const deployOETHDripper = async () => { // Deploy Dripper Proxy const cDripperProxy = await ethers.getContract("OETHDripperProxy"); await withConfirmation( - cDripperProxy["initialize(address,address,bytes)"]( - dDripper.address, - governorAddr, - [] - ) + cDripperProxy + .connect(sDeployer) + ["initialize(address,address,bytes)"](dDripper.address, governorAddr, []) ); return cDripperProxy; @@ -927,10 +1040,25 @@ const deployOracles = async () => { oracleContract = "OETHFixedOracle"; contractName = "OETHOracleRouter"; args = [addresses.zero]; + } else if (isBaseOrFork) { + await deployWithConfirmation( + "PriceFeedPair", + [ + addresses.base.aeroUsdPriceFeed, + addresses.base.ethUsdPriceFeed, + false, + true, + ], + "PriceFeedPair" + ); + const priceFeedPair = await ethers.getContract("PriceFeedPair"); + oracleContract = "BaseOETHOracleRouter"; + contractName = "BaseOETHOracleRouter"; + args = [priceFeedPair.address]; } await deployWithConfirmation(contractName, args, oracleContract); - const oracleRouter = await ethers.getContract("OracleRouter"); + const oracleRouter = await ethers.getContract(contractName); log("Deployed OracleRouter"); if (isHolesky) { @@ -941,6 +1069,12 @@ const deployOracles = async () => { } const assetAddresses = await getAssetAddresses(deployments); + + if (isBaseOrFork) { + await withConfirmation(oracleRouter.cacheDecimals(assetAddresses.AERO)); + return; + } + await deployWithConfirmation("AuraWETHPriceFeed", [ assetAddresses.auraWeightedOraclePool, governorAddr, @@ -989,12 +1123,13 @@ const deployOracles = async () => { }; const deployOETHCore = async () => { - const { governorAddr } = await hre.getNamedAccounts(); + const { deployerAddr, governorAddr } = await hre.getNamedAccounts(); const assetAddresses = await getAssetAddresses(deployments); log(`Using asset addresses: ${JSON.stringify(assetAddresses, null, 2)}`); // Signers const sGovernor = await ethers.provider.getSigner(governorAddr); + const sDeployer = await ethers.provider.getSigner(deployerAddr); // Proxies await deployWithConfirmation("OETHProxy"); @@ -1012,32 +1147,34 @@ const deployOETHCore = async () => { const cOETHProxy = await ethers.getContract("OETHProxy"); const cOETHVaultProxy = await ethers.getContract("OETHVaultProxy"); const cOETH = await ethers.getContractAt("OETH", cOETHProxy.address); - const cOracleRouter = await ethers.getContract("OracleRouter"); + // const cOracleRouter = await ethers.getContract("OracleRouter"); const cOETHOracleRouter = isMainnet ? await ethers.getContract("OETHOracleRouter") - : cOracleRouter; + : isBaseOrFork + ? await ethers.getContract("BaseOETHOracleRouter") + : await ethers.getContract("OracleRouter"); const cOETHVault = await ethers.getContractAt( "IVault", cOETHVaultProxy.address ); - await withConfirmation( - cOETHProxy["initialize(address,address,bytes)"]( - dOETH.address, - governorAddr, - [] - ) + cOETHProxy + .connect(sDeployer) + ["initialize(address,address,bytes)"](dOETH.address, governorAddr, []) ); log("Initialized OETHProxy"); await withConfirmation( - cOETHVaultProxy["initialize(address,address,bytes)"]( - dOETHVault.address, - governorAddr, - [] - ) + cOETHVaultProxy + .connect(sDeployer) + ["initialize(address,address,bytes)"]( + dOETHVault.address, + governorAddr, + [] + ) ); + log("Initialized OETHVaultProxy"); await withConfirmation( @@ -1074,10 +1211,16 @@ const deployOETHCore = async () => { * Latter seems more fitting - due to mimicking production better as already mentioned. */ const resolution = ethers.utils.parseUnits("1", 27); + let name = "Origin Ether"; + let symbol = "OETH"; + if (isBase) { + name = "OETH Base"; + symbol = "OETHbase"; + } await withConfirmation( cOETH .connect(sGovernor) - .initialize("Origin Ether", "OETH", cOETHVaultProxy.address, resolution) + .initialize(name, symbol, cOETHVaultProxy.address, resolution) ); log("Initialized OETH"); }; @@ -1474,6 +1617,94 @@ const deployOUSDSwapper = async () => { await vault.connect(sGovernor).setOracleSlippage(assetAddresses.USDT, 50); }; +const deployAerodromeStrategy = async (poolAddress, gaugeAddress) => { + const assetAddresses = await getAssetAddresses(deployments); + const { deployerAddr, governorAddr } = await getNamedAccounts(); + + const sGovernor = await ethers.provider.getSigner(governorAddr); + const sDeployer = await ethers.provider.getSigner(deployerAddr); + + const oethVaultProxy = await ethers.getContract("OETHVaultProxy"); + const oethVault = await ethers.getContractAt( + "IVault", + oethVaultProxy.address + ); + + const oeth = await ethers.getContract("OETHProxy"); + + log("Deploy AerodromeEthStrategyProxy"); + const dAerodromeEthStrategyProxy = await deployWithConfirmation( + "AerodromeEthStrategyProxy" + ); + const cAerodromeEthStrategyProxy = await ethers.getContract( + "AerodromeEthStrategyProxy" + ); + + log("Deploy AerodromeEthStrategy"); + const dStrategyImpl = await deployWithConfirmation("AerodromeEthStrategy", [ + [poolAddress, oethVault.address], + [ + addresses.base.aeroRouterAddress, + gaugeAddress, + addresses.base.aeroFactoryAddress, + poolAddress, + oeth.address, + assetAddresses.WETH, + ], + ]); + const cStrategyImpl = await ethers.getContractAt( + "AerodromeEthStrategy", + dStrategyImpl.address + ); + + log("Deploy encode initialize function of the strategy contract"); + const initData = cStrategyImpl.interface.encodeFunctionData( + "initialize(address[],address[])", + [ + [assetAddresses.AERO], // reward token addresses + [assetAddresses.WETH], // asset token addresses + ] + ); + + log("Initialize the proxy and execute the initialize strategy function"); + await withConfirmation( + cAerodromeEthStrategyProxy.connect(sDeployer)[ + // eslint-disable-next-line no-unexpected-multiline + "initialize(address,address,bytes)" + ]( + cStrategyImpl.address, // implementation address + governorAddr, // governance + initData // data for call to the initialize function on the strategy + ) + ); + log("Set harvester address"); + const cStrategy = await ethers.getContractAt( + "AerodromeEthStrategy", + cAerodromeEthStrategyProxy.address + ); + const cHarvester = await ethers.getContract("OETHBaseHarvesterProxy"); + await withConfirmation( + cStrategy.connect(sGovernor).setHarvesterAddress(cHarvester.address) + ); + + await withConfirmation( + oethVault.connect(sGovernor).setOusdMetaStrategy(cStrategy.address) + ); + + // Set mint threshold to 50m (arbitrary) + const fiftyMil = BigNumber.from(50000000).mul(BigNumber.from(10).pow(18)); + await withConfirmation( + oethVault.connect(sGovernor).setNetOusdMintForStrategyThreshold(fiftyMil) + ); + + // Approve strategy + await withConfirmation( + oethVault.connect(sGovernor).approveStrategy(cStrategy.address) + ); + + return dAerodromeEthStrategyProxy; +}; + module.exports = { deployOracles, deployCore, @@ -1506,4 +1737,6 @@ module.exports = { deployOETHSwapper, deployOUSDSwapper, upgradeNativeStakingSSVStrategy, + deployAerodromeStrategy, + deployOETHBaseHarvester, }; diff --git a/contracts/deployments/base/.migrations.json b/contracts/deployments/base/.migrations.json index cd1d461e5f..5ca24c1ec2 100644 --- a/contracts/deployments/base/.migrations.json +++ b/contracts/deployments/base/.migrations.json @@ -1,3 +1,3 @@ { - "092_woeth_on_base": 1713443798 + "002_woeth_on_base": 1713443798 } \ No newline at end of file diff --git a/contracts/fork-test.sh b/contracts/fork-test.sh index 9c308913df..2776a53588 100755 --- a/contracts/fork-test.sh +++ b/contracts/fork-test.sh @@ -80,7 +80,7 @@ main() # Run all files with `.holesky.fork-test.js` suffix when no file name param is given # pass all other params along params+="test/**/*.holesky.fork-test.js" - elif [[ $FORK_NETWORK_NAME == "holesky" ]]; then + elif [[ $FORK_NETWORK_NAME == "base" ]]; then # Run all files with `.base.fork-test.js` suffix when no file name param is given # pass all other params along params+="test/**/*.base.fork-test.js" @@ -105,7 +105,7 @@ main() FORK=true IS_TEST=true npx --no-install hardhat coverage --testfiles "${params[@]}" else echo "Running fork tests..." - FORK=true IS_TEST=true npx --no-install hardhat test ${params[@]} --show-stack-traces + FORK=true IS_TEST=true npx --no-install hardhat test ${params[@]} fi if [ ! $? -eq 0 ] && $is_ci; then diff --git a/contracts/hardhat.config.js b/contracts/hardhat.config.js index 7b88004c7f..ab2e6faf7e 100644 --- a/contracts/hardhat.config.js +++ b/contracts/hardhat.config.js @@ -1,3 +1,4 @@ +require("dotenv").config(); const ethers = require("ethers"); const { task } = require("hardhat/config"); const { @@ -15,6 +16,8 @@ const { getHardhatNetworkProperties, isBaseFork, baseProviderUrl, + isBase, + isBaseForkTest, } = require("./utils/hardhat-helpers.js"); require("@nomiclabs/hardhat-etherscan"); @@ -45,7 +48,8 @@ const MAINNET_MULTISIG = "0xbe2AB3d3d8F6a32b96414ebbd865dBD276d3d899"; const MAINNET_CLAIM_ADJUSTER = MAINNET_DEPLOYER; const MAINNET_STRATEGIST = "0xf14bbdf064e3f67f51cd9bd646ae3716ad938fdc"; const HOLESKY_DEPLOYER = "0x1b94CA50D3Ad9f8368851F8526132272d1a5028C"; - +const BASE_DEPLOYER = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; +const BASE_GOVERNOR = "0x92A19381444A001d62cE67BaFF066fA1111d7202"; const mnemonic = "replace hover unaware super where filter stone fine garlic address matrix basic"; @@ -68,10 +72,13 @@ const paths = {}; if (isHolesky || isHoleskyForkTest || isHoleskyFork) { // holesky deployment files are in contracts/deploy/holesky paths.deploy = "deploy/holesky"; +} else if (isBase || isBaseForkTest || isBaseFork) { + // base deployment files are in contracts/deploy/base + paths.deploy = "deploy/base"; } else { - // holesky deployment files are in contracts/deploy/mainnet paths.deploy = "deploy/mainnet"; } + if (process.env.HARDHAT_CACHE_DIR) { paths.cache = process.env.HARDHAT_CACHE_DIR; } @@ -189,6 +196,7 @@ module.exports = { mainnet: MAINNET_DEPLOYER, arbitrumOne: MAINNET_DEPLOYER, holesky: HOLESKY_DEPLOYER, + base: BASE_DEPLOYER, }, governorAddr: { default: 1, @@ -197,17 +205,21 @@ module.exports = { process.env.FORK === "true" ? isHoleskyFork ? HOLESKY_DEPLOYER + : isBaseFork + ? BASE_GOVERNOR : MAINNET_GOVERNOR : 1, hardhat: process.env.FORK === "true" ? isHoleskyFork ? HOLESKY_DEPLOYER + : isBaseFork + ? BASE_GOVERNOR : MAINNET_GOVERNOR : 1, mainnet: MAINNET_GOVERNOR, holesky: HOLESKY_DEPLOYER, // on Holesky the deployer is also the governor - base: MAINNET_GOVERNOR, // TODO: change this + base: BASE_GOVERNOR, }, /* Local node environment currently has no access to Decentralized governance * address, since the contract is in another repo. Once we merge the ousd-governance @@ -273,6 +285,7 @@ module.exports = { : 0, mainnet: MAINNET_STRATEGIST, holesky: HOLESKY_DEPLOYER, // on Holesky the deployer is also the strategist + base: BASE_GOVERNOR, }, }, contractSizer: { diff --git a/contracts/package.json b/contracts/package.json index 4f79a35511..4f93969ce7 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -15,6 +15,7 @@ "node:fork": "./node.sh fork", "node:arb": "FORK_NETWORK_NAME=arbitrumOne yarn run node:fork", "node:hol": "FORK_NETWORK_NAME=holesky yarn run node:fork", + "node:base": "FORK_NETWORK_NAME=base yarn run node:fork", "lint": "yarn run lint:js && yarn run lint:sol", "lint:js": "eslint \"test/**/*.js\" \"tasks/**/*.js\" \"deploy/**/*.js\"", "lint:sol": "solhint \"contracts/**/*.sol\"", diff --git a/contracts/tasks/aerodrome.js b/contracts/tasks/aerodrome.js index fbb159179c..9ef926ff59 100644 --- a/contracts/tasks/aerodrome.js +++ b/contracts/tasks/aerodrome.js @@ -207,7 +207,7 @@ async function aeroContracts(oTokenSymbol, fixture) { ); fixture.oeth = await ethers.getContractAt("IERC20", fixture.oeth.address); fixture.oethVault = await ethers.getContractAt( - "MockVaultForBase", + "IVault", fixture.oethVault.address ); fixture.aeroRouter = await ethers.getContractAt( @@ -265,9 +265,10 @@ function displayProperty( } function displayPortion(amount, total, units, comparison, precision = 2) { - const basisPoints = amount - .mul(BigNumber.from(10).pow(2 + precision)) - .div(total); + const basisPoints = + amount.gt(0) && total.gt(0) + ? amount.mul(BigNumber.from(10).pow(2 + precision)).div(total) + : BigNumber.from(0); return `${formatUnits(amount)} ${units} ${formatUnits( basisPoints, precision diff --git a/contracts/test/_fixture-base.js b/contracts/test/_fixture-base.js index 9a80f241c0..ad859aa197 100644 --- a/contracts/test/_fixture-base.js +++ b/contracts/test/_fixture-base.js @@ -1,9 +1,10 @@ const hre = require("hardhat"); const { ethers } = hre; const mocha = require("mocha"); -const { isFork, isBaseFork, oethUnits } = require("./helpers"); +const { isFork, isBaseFork, oethUnits, fundAccount } = require("./helpers"); const { impersonateAndFund } = require("../utils/signers"); const { nodeRevert, nodeSnapshot } = require("./_fixture"); +const addresses = require("../utils/addresses"); const log = require("../utils/logger")("test:fixtures-base"); @@ -26,6 +27,14 @@ const defaultBaseFixture = deployments.createFixture(async () => { log( `Before deployments with param "${isFork ? ["base"] : ["base_unit_tests"]}"` ); + const { deployerAddr, governorAddr } = await hre.getNamedAccounts(); + + await fundAccount(deployerAddr); + await fundAccount(governorAddr); + + const sGovernor = await ethers.getSigner(governorAddr); + const sDeployer = await ethers.getSigner(deployerAddr); + // Run the contract deployments await deployments.fixture(isFork ? ["base"] : ["base_unit_tests"], { keepExistingDeployments: true, @@ -35,9 +44,49 @@ const defaultBaseFixture = deployments.createFixture(async () => { const woethProxy = await ethers.getContract("BridgedBaseWOETHProxy"); const woeth = await ethers.getContractAt("BridgedWOETH", woethProxy.address); + const oethProxy = await ethers.getContract("OETHProxy"); + const oeth = await ethers.getContractAt("OETH", oethProxy.address); + const weth = await ethers.getContractAt( + "IWETH9", + addresses.base.wethTokenAddress + ); + + const oethDripperProxy = await ethers.getContract("OETHDripperProxy"); + const oethDripper = await ethers.getContractAt( + "OETHDripper", + oethDripperProxy.address + ); + + const oethVaultProxy = await ethers.getContract("OETHVaultProxy"); + const oethVault = await ethers.getContractAt( + "IVault", + oethVaultProxy.address + ); + const oethVaultSigner = await impersonateAndFund(oethVault.address); + + const oethVaultCore = await ethers.getContract("OETHVaultCore"); + + const oethBaseHarvesterProxy = await ethers.getContract( + "OETHBaseHarvesterProxy" + ); + const oethBaseHarvester = await ethers.getContractAt( + "OETHBaseHarvester", + oethBaseHarvesterProxy.address + ); + + const oracleRouter = await ethers.getContract("BaseOETHOracleRouter"); + + const aerodromeEthStrategyProxy = await ethers.getContract( + "AerodromeEthStrategyProxy" + ); + const aerodromeEthStrategy = await ethers.getContractAt( + "AerodromeEthStrategy", + aerodromeEthStrategyProxy.address + ); + const signers = await hre.ethers.getSigners(); - const [minter, burner, rafael, nick] = signers.slice(4); // Skip first 4 addresses to avoid conflict + const [minter, burner, josh, rafael, nick] = signers.slice(4); // Skip first 4 addresses to avoid conflict const governor = await ethers.getSigner(await woeth.governor()); if (isBaseFork) { @@ -49,6 +98,9 @@ const defaultBaseFixture = deployments.createFixture(async () => { if (woethImplAddr != latestImplAddr) { await woethProxy.connect(governor).upgradeTo(latestImplAddr); } + await oethBaseHarvester + .connect(governor) + .setSupportedStrategy(aerodromeEthStrategy.address, true); } await woeth.connect(governor).grantRole(MINTER_ROLE, minter.address); @@ -58,16 +110,84 @@ const defaultBaseFixture = deployments.createFixture(async () => { await woeth.connect(minter).mint(rafael.address, oethUnits("1")); await woeth.connect(minter).mint(nick.address, oethUnits("1")); + // Loading the AeroRouter instance + const aeroRouter = await ethers.getContractAt( + "IRouter", + addresses.base.aeroRouterAddress + ); + let poolAddress = await aeroRouter.poolFor( + weth.address, + oeth.address, + true, + addresses.base.aeroFactoryAddress + ); + let pool = await ethers.getContractAt("IPool", poolAddress, josh); + // Create gauge + const aeroVoter = await ethers.getContractAt( + "IVoter", + addresses.base.aeroVoterAddress + ); + + const gaugeAddress = await aeroVoter.gauges(poolAddress); + const aeroGauge = await ethers.getContractAt("IGauge", gaugeAddress, josh); + const wethReserveIndex = + weth.address === (await pool.token0()) ? "_reserve0" : "_reserve1"; + + const oethReserveIndex = + wethReserveIndex === "_reserve1" ? "_reserve0" : "_reserve1"; + + if (config?.wethMintAmount > 0) { + const wethAmount = parseUnits(config.wethMintAmount.toString()); + + // Set vault balance. This will sit in the vault, not the strategy + await weth.connect(josh).transfer(oethVault.address, wethAmount); + + log(`Vault weth balance set to: ${wethAmount}`); + // Add ETH to the pool + if (config?.depositToStrategy) { + // The strategist deposits the WETH to the AMO strategy + await oethVault + .connect(josh) + .depositToStrategy( + aerodromeEthStrategy.address, + [weth.address], + [wethAmount] + ); + log(`Deposited ${wethAmount} WETH to the strategy contract`); + } + } + return { woeth, woethProxy, - + oeth, + oethProxy, + oethDripper, + oethDripperProxy, + oethVault, + oracleRouter, + oethVaultProxy, + oethVaultCore, + oethBaseHarvester, + oethBaseHarvesterProxy, + weth, + aerodromeEthStrategy, governor, minter, burner, rafael, nick, + josh, + + pool, + wethReserveIndex, + oethReserveIndex, + aeroRouter, + aeroGauge, + oethVaultSigner, + sGovernor, + sDeployer, }; }); diff --git a/contracts/test/_fixture.js b/contracts/test/_fixture.js index 0a3cf0678a..107dc93e7c 100644 --- a/contracts/test/_fixture.js +++ b/contracts/test/_fixture.js @@ -48,6 +48,7 @@ const sfrxETHAbi = require("./abi/sfrxETH.json"); const { defaultAbiCoder, parseUnits, parseEther } = require("ethers/lib/utils"); const balancerStrategyDeployment = require("../utils/balancerStrategyDeployment"); const { impersonateAndFund } = require("../utils/signers"); +const { defaultBaseFixture } = require("./_fixture-base.js"); const log = require("../utils/logger")("test:fixtures"); @@ -1728,243 +1729,32 @@ async function aeroOETHAMOFixture( balancePool: false, } ) { - let fixture = {}; - const MockWETH = await ethers.getContractFactory("MockWETH"); - const MockOETH = await ethers.getContractFactory("MockOETH"); - - const wETH = await MockWETH.deploy(); - await wETH.deployed(); - - const oETH = await MockOETH.deploy(); - await oETH.deployed(); - - fixture.weth = wETH; - fixture.oeth = oETH; - const [defaultSigner, josh, governorAddr, rewardHarvester] = - await ethers.getSigners(); - const { strategistAddr, timelockAddr } = await getNamedAccounts(); - - fixture.rewardHarvester = rewardHarvester; - fixture.strategist = ethers.provider.getSigner(strategistAddr); - fixture.timelock = ethers.provider.getSigner(timelockAddr); - - log(`wETH mock token address: ${wETH.address}`); - log(`oETH mock token address: ${oETH.address}`); - - log("Getting signers..."); - - // Deploy mock vault - const MockVaultForBase = await ethers.getContractFactory("MockVaultForBase"); - - const mockVault = await MockVaultForBase.deploy( - josh.address, - oETH.address, - wETH.address - ); - await mockVault.deployed(); - log(`Mock Vault deployed: ${mockVault.address}`); - - // Mint one token each to the vault for the task - await oETH.mintTo(mockVault.address, parseUnits("1")); - await wETH.mintTo(mockVault.address, parseUnits("1")); - - fixture.oethVaultSigner = await impersonateAndFund(mockVault.address); - - fixture.josh = josh; - fixture.governor = governorAddr; - // Minting tokens to Josh's wallet - await oETH.mintTo(josh.address, parseEther("15000")); - await wETH.mintTo(josh.address, parseEther("15000")); - - // Loading the AeroRouter instance - const aeroRouter = await ethers.getContractAt( - "IRouter", - addresses.base.aeroRouterAddress - ); - - // // Approve the router to spend the tokens - await wETH - .connect(josh) - .approve(aeroRouter.address, ethers.utils.parseEther("5000")); - await oETH - .connect(josh) - .approve(aeroRouter.address, ethers.utils.parseEther("5000")); - - // Add initial liquidity (100 * 1e18 on each side) - await aeroRouter.connect(josh).addLiquidity( - wETH.address, - oETH.address, - true, - ethers.utils.parseEther("5000"), - ethers.utils.parseEther("5000"), - // Slippage adjusted amounts - ethers.utils.parseEther("5000"), - ethers.utils.parseEther("5000"), - josh.address, - parseInt(Date.now() / 1000) + 5 * 360 - ); - //await aeroRouter.connect(josh).swapExactTokenForTokens(parseUnits("100"),0,[[oeth.address,weth.address,true,addresses.base.aeroFactoryAddress]],josh.address,parseInt(Date.now() / 1000) + 5 * 360); - - // Fetch wETH/oETH pool address - let poolAddress = await aeroRouter.poolFor( - wETH.address, - oETH.address, - true, - addresses.base.aeroFactoryAddress - ); - let pool = await ethers.getContractAt("IPool", poolAddress, josh); - const lpBalance = (await pool.balanceOf(josh.address)).toString(); - log("Received LP tokens: ", formatUnits(lpBalance, 18)); - - // We need to do this as the order will be different for each run. - const wethReserveIndex = - wETH.address === (await pool.token0()) ? "_reserve0" : "_reserve1"; - const oethReserveIndex = - wethReserveIndex === "_reserve1" ? "_reserve0" : "_reserve1"; - - fixture.pool = pool; - fixture.aeroRouter = aeroRouter; - fixture.wethReserveIndex = wethReserveIndex; - fixture.oethReserveIndex = oethReserveIndex; - - // Create gauge - const aeroVoter = await ethers.getContractAt( - "IVoter", - addresses.base.aeroVoterAddress - ); - // Create gauge for weth/oETH LP - let governor = await impersonateAndFund( - addresses.base.aeroGaugeGovernorAddress, - "2" - ); - - // Do a static call to fetch the gauge address first - const gaugeAddress = await aeroVoter - .connect(governor) - .callStatic.createGauge(addresses.base.aeroFactoryAddress, poolAddress); - - await aeroVoter - .connect(governor) - .createGauge(addresses.base.aeroFactoryAddress, poolAddress); - log(`Aero Gauge created for wETH/oETH pool at address: ${gaugeAddress}`); - - fixture.routerAddress = addresses.base.aeroRouterAddress; - - log("Deploying AerodromeEthStrategy with a mock vault"); - - const AerodromeEthStrategy = await ethers.getContractFactory( - "AerodromeEthStrategy" - ); - - // TODO: replace mockVault with actual vault address. - const aerodromeEthStrategy = await AerodromeEthStrategy.connect( - governorAddr - ).deploy( - [poolAddress, mockVault.address], - [ - addresses.base.aeroRouterAddress, - gaugeAddress, - addresses.base.aeroFactoryAddress, - poolAddress, - oETH.address, - wETH.address, - ] - ); - await aerodromeEthStrategy.deployed(); - log("oETH/wETH Pool address", await aerodromeEthStrategy.lpTokenAddress()); - - await aerodromeEthStrategy.initialize( - [addresses.base.aeroTokenAddress], - [wETH.address] - ); - // await vault.approveStrategy(aerodromeEthStrategy.address); - // log("AerodromeEthStrategy strategy approved in OETHVault"); - - fixture.aerodromeEthStrategy = aerodromeEthStrategy; - fixture.oethVault = mockVault; - - // Deposit LP Tokens to the Gauge onbehalf of the strategy contract - const gauge = await ethers.getContractAt("IGauge", gaugeAddress, josh); - await pool.approve(gaugeAddress, parseEther(lpBalance)); - await gauge["deposit(uint256,address)"]( - lpBalance, - aerodromeEthStrategy.address - ); - log(`LP Tokens added to the gauge`); - - fixture.aeroGauge = gauge; + const baseFixture = createFixtureLoader(defaultBaseFixture); + const fixture = await baseFixture(); + const { josh, oethVault, weth, aerodromeEthStrategy, sGovernor } = fixture; // Conditional actions based on input params // mint some OETH using WETH is configured if (config?.wethMintAmount > 0) { const wethAmount = parseUnits(config.wethMintAmount.toString()); // Set vault balance. This will sit in the vault, not the strategy - await setERC20TokenBalance(mockVault.address, wETH, wethAmount); + await weth.connect(josh).transfer(oethVault.address, wethAmount); - log(`MockVault weth balance set to: ${wethAmount}`); + log(`OETHVault weth balance set to: ${wethAmount}`); // Add ETH to the pool if (config?.depositToStrategy) { - // The strategist deposits the WETH to the AMO strategy - await mockVault - .connect(josh) + // The governor deposits the WETH to the AMO strategy + await oethVault + .connect(sGovernor) .depositToStrategy( aerodromeEthStrategy.address, - [wETH.address], + [weth.address], [wethAmount] ); log(`Deposited ${wethAmount} WETH to the strategy contract`); } } - const AeroWethFeed = await ethers.getContractFactory("PriceFeedPair"); - const aeroWethFeed = await AeroWethFeed.deploy( - addresses.base.aeroUsdPriceFeed, - addresses.base.ethUsdPriceFeed, - false, - true - ); - await aeroWethFeed.deployed(); - - const OracleRouter = await ethers.getContractFactory("BaseOETHOracleRouter"); - const oracleRouter = await OracleRouter.deploy(aeroWethFeed.address); - await oracleRouter.deployed(); - await oracleRouter.cacheDecimals(addresses.base.aeroTokenAddress); - - fixture.oracleRouter = oracleRouter; - - const AeroHarvester = await ethers.getContractFactory("AeroHarvester"); - const harvester = await AeroHarvester.deploy( - oracleRouter.address, - addresses.base.wethTokenAddress - ); - await harvester.deployed(); - await harvester.setRewardTokenConfig( - addresses.base.aeroTokenAddress, - { - allowedSlippageBps: 800, - harvestRewardBps: 100, - swapPlatform: 0, // Aerodrome - swapPlatformAddr: addresses.base.aeroRouterAddress, - liquidationLimit: 0, - doSwapRewardToken: true, - }, - [ - { - from: addresses.base.aeroTokenAddress, - to: addresses.base.wethTokenAddress, - stable: true, - factory: addresses.base.aeroFactoryAddress, - }, - ] - ); - - await harvester.setSupportedStrategy(aerodromeEthStrategy.address, true); - await harvester.setRewardProceedsAddress(rewardHarvester.address); - - fixture.harvester = harvester; - - await aerodromeEthStrategy.setHarvesterAddress(harvester.address); - return fixture; } diff --git a/contracts/test/_global-hooks.js b/contracts/test/_global-hooks.js index 4bb5a14d7b..8ae376d1b4 100644 --- a/contracts/test/_global-hooks.js +++ b/contracts/test/_global-hooks.js @@ -1,6 +1,11 @@ const mocha = require("mocha"); -const { isForkTest, isArbFork, isBaseFork } = require("./helpers"); +const { + isArbFork, + isHoleskyFork, + isBaseFork, + isForkTest, +} = require("./helpers"); const _chunkId = Number(process.env.CHUNK_ID); const _maxChunks = Number(process.env.MAX_CHUNKS); @@ -34,12 +39,25 @@ mocha.before(function () { // If you are running unit tests, scrape out all fork tests. // For fork tests, scrape out all unit tests. - root.suites = root.suites.filter( - (s) => - s.file.endsWith(".fork-test.js") == isForkTest && - s.file.endsWith(".arb.fork-test.js") == isArbFork && - s.file.endsWith(".base.fork-test.js") == isBaseFork - ); + root.suites = root.suites.filter((s) => { + const isMainnetForkTestFile = s.file.endsWith(".fork-test.js"); + const isHoleskyTestFile = s.file.endsWith(".holesky-fork-test.js"); + const isArbTestFile = s.file.endsWith(".arb.fork-test.js"); + const isBaseTestFile = s.file.endsWith(".base.fork-test.js"); + + if (isHoleskyFork) { + return isHoleskyTestFile; + } else if (isArbFork) { + return isArbTestFile; + } else if (isBaseFork) { + return isBaseTestFile; + } else if (isForkTest) { + return isMainnetForkTestFile && !isArbTestFile && !isBaseTestFile; + } else { + // else is unit test + return !isMainnetForkTestFile && !isHoleskyTestFile; + } + }); if (!runTestsParallely) { // When running serially diff --git a/contracts/test/harvest/aero-harvester.base.fork-test.js b/contracts/test/harvest/aero-harvester.base.fork-test.js index aecc56dc56..8ddf8c033d 100644 --- a/contracts/test/harvest/aero-harvester.base.fork-test.js +++ b/contracts/test/harvest/aero-harvester.base.fork-test.js @@ -1,23 +1,26 @@ const { expect } = require("chai"); const addresses = require("../../utils/addresses"); -const { aeroOETHAMOFixture } = require("../_fixture"); +const { createFixtureLoader } = require("../_fixture"); +const { defaultBaseFixture } = require("../_fixture-base"); const { impersonateAndFund } = require("../../utils/signers"); const { parseEther } = require("ethers/lib/utils"); const { BigNumber } = require("ethers"); -describe("ForkTest: Harvest AERO", function () { +const baseFixture = createFixtureLoader(defaultBaseFixture); + +describe("ForkTest: Harvest (Base)", function () { this.timeout(0); let fixture; beforeEach(async () => { - fixture = await aeroOETHAMOFixture(); + fixture = await baseFixture(); }); it("config", async function () { - const { harvester, aerodromeEthStrategy } = fixture; + const { oethBaseHarvester, aerodromeEthStrategy } = fixture; - const aeroTokenConfig = await harvester.rewardTokenConfigs( + const aeroTokenConfig = await oethBaseHarvester.rewardTokenConfigs( addresses.base.aeroTokenAddress ); expect(aeroTokenConfig.liquidationLimit.toString()).to.be.equal("0"); @@ -25,12 +28,16 @@ describe("ForkTest: Harvest AERO", function () { expect(aeroTokenConfig.harvestRewardBps.toString()).to.be.equal("100"); expect( - await harvester.supportedStrategies(aerodromeEthStrategy.address) + await oethBaseHarvester.supportedStrategies(aerodromeEthStrategy.address) ).to.be.eq(true); }); it("should harvest and swap", async function () { - const { harvester, aerodromeEthStrategy, oracleRouter, rewardHarvester } = - fixture; + const { + oethBaseHarvester, + aerodromeEthStrategy, + oracleRouter, + oethDripper, + } = fixture; const yieldAccrued = "1000"; // AERO tokens // Mock accrue yield @@ -43,7 +50,7 @@ describe("ForkTest: Harvest AERO", function () { ); await aeroTokenInstance .connect(minter) - .mint(harvester.address, parseEther(yieldAccrued)); + .mint(oethBaseHarvester.address, parseEther(yieldAccrued)); // find signer balance before const wethTokenInstance = await ethers.getContractAt( @@ -51,14 +58,14 @@ describe("ForkTest: Harvest AERO", function () { addresses.base.wethTokenAddress ); const wethBalanceBefore = await wethTokenInstance.balanceOf( - rewardHarvester.address + oethDripper.address ); - await harvester["harvestAndSwap(address,address)"]( + await oethBaseHarvester["harvestAndSwap(address,address)"]( aerodromeEthStrategy.address, - rewardHarvester.address + oethDripper.address ); const wethBalanceAfter = await wethTokenInstance.balanceOf( - rewardHarvester.address + oethDripper.address ); const rate = await oracleRouter.price(addresses.base.aeroTokenAddress); diff --git a/contracts/test/helpers.js b/contracts/test/helpers.js index 2b65492ed9..4e96a76ead 100644 --- a/contracts/test/helpers.js +++ b/contracts/test/helpers.js @@ -260,6 +260,7 @@ const isTest = process.env.IS_TEST === "true"; const isSmokeTest = process.env.SMOKE_TEST === "true"; const isMainnetOrFork = isMainnet || isFork; const isForkTest = isFork && isTest; +const isMainnetForkTest = isForkTest && hre.network.config.chainId == 1; const isForkWithLocalNode = isFork && process.env.LOCAL_PROVIDER_URL; const isArbitrumOne = hre.network.name == "arbitrumOne"; const isTestnetSimplifiedDeploy = isHolesky; @@ -268,6 +269,8 @@ const isHoleskyFork = isFork && process.env.FORK_NETWORK_NAME == "holesky"; const isArbitrumOneOrFork = isArbitrumOne || isArbFork; const isBase = hre.network.name == "base"; const isBaseFork = isFork && process.env.FORK_NETWORK_NAME == "base"; +const isBaseOrFork = isBase || isBaseFork; +const isBaseForkTest = isForkTest && hre.network.config.chainId == 8543; const isCI = process.env.GITHUB_ACTIONS; /// Advances the EVM time by the given number of seconds @@ -389,7 +392,7 @@ const getOracleAddresses = async (deployments) => { }; const getAssetAddresses = async (deployments) => { - if (isMainnetOrFork) { + if (isMainnet || isMainnetForkTest) { return { USDT: addresses.mainnet.USDT, USDC: addresses.mainnet.USDC, @@ -432,6 +435,11 @@ const getAssetAddresses = async (deployments) => { AURA: addresses.mainnet.AURA, BAL: addresses.mainnet.BAL, }; + } else if (isBaseOrFork) { + return { + WETH: addresses.base.wethTokenAddress, + AERO: addresses.base.aeroTokenAddress, + }; } else { const addressMap = { USDT: (await deployments.get("MockUSDT")).address, @@ -776,6 +784,7 @@ module.exports = { isLocalhost, isMainnetOrFork, isForkTest, + isMainnetForkTest, isForkWithLocalNode, isArbitrumOne, isHolesky, @@ -785,6 +794,7 @@ module.exports = { isArbFork, isBase, isBaseFork, + isBaseOrFork, isCI, getOracleAddress, setOracleTokenPriceUsd, diff --git a/contracts/test/oracle/aero-weth-oracle.base.fork-test.js b/contracts/test/oracle/aero-weth-oracle.base.fork-test.js index 92b747fe99..0679ef9e69 100644 --- a/contracts/test/oracle/aero-weth-oracle.base.fork-test.js +++ b/contracts/test/oracle/aero-weth-oracle.base.fork-test.js @@ -34,6 +34,6 @@ describe("ForkTest: Aero WETH Oracle", function () { parseUnits("1"), addresses.base.aeroTokenAddress ); - expect(price).to.approxEqualTolerance(ammPrice, 1); + expect(price).to.approxEqualTolerance(ammPrice, 15); }); }); diff --git a/contracts/test/strategies/aero-oeth-amo.base.fork-test.js b/contracts/test/strategies/aero-oeth-amo.base.fork-test.js index d173a71d70..c19250677b 100644 --- a/contracts/test/strategies/aero-oeth-amo.base.fork-test.js +++ b/contracts/test/strategies/aero-oeth-amo.base.fork-test.js @@ -5,11 +5,15 @@ const { run } = require("hardhat"); const addresses = require("../../utils/addresses"); const { units, oethUnits, isCI } = require("../helpers"); const { aeroOETHAMOFixture } = require("../_fixture"); +const { createFixtureLoader } = require("../_fixture"); +const { defaultBaseFixture } = require("../_fixture-base"); const { impersonateAndFund } = require("../../utils/signers"); const { BigNumber, ethers } = require("ethers"); const log = require("../../utils/logger")("test:fork:aero-oeth:metapool"); +const baseFixture = createFixtureLoader(defaultBaseFixture); + describe("ForkTest: OETH AMO Aerodrome Strategy", function () { this.timeout(0); // Retry up to 3 times on CI @@ -19,7 +23,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { describe("", () => { beforeEach(async () => { - fixture = await aeroOETHAMOFixture(); + fixture = await baseFixture(); }); it("Should have constants and immutables set", async () => { const { aerodromeEthStrategy, oethReserveIndex, wethReserveIndex } = @@ -57,7 +61,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { const balance = await aerodromeEthStrategy.checkBalance(weth.address); log(`check balance ${balance}`); - expect(balance).gt(0); + expect(balance).to.eq(0); // will be 0 initially as there are no deposits // This uses a transaction to call a view function so the gas usage can be reported. const tx = await aerodromeEthStrategy @@ -68,21 +72,12 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { }); describe("with some WETH in the vault", () => { beforeEach(async () => { - fixture = await aeroOETHAMOFixture(); + fixture = await baseFixture(); }); it("Vault should deposit some WETH to AMO strategy", async function () { - const { - aerodromeEthStrategy, - oeth, - pool, - weth, - josh, - oethVault, - oethReserveIndex, - wethReserveIndex, - } = fixture; + const { aerodromeEthStrategy, oeth, weth, josh, oethVault } = fixture; - const wethDepositAmount = await units("1000", weth); + const wethDepositAmount = await units("100", weth); // Vault transfers WETH to strategy await weth @@ -141,8 +136,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { ); }); it("Only vault can deposit some WETH to AMO strategy", async function () { - const { aerodromeEthStrategy, josh, weth, strategist, timelock } = - fixture; + const { aerodromeEthStrategy, josh, weth } = fixture; const depositAmount = await units("50", weth); @@ -164,15 +158,8 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { await expect(tx).to.revertedWith("Caller is not the Vault"); }); it("Only vault can deposit all WETH to AMO strategy", async function () { - const { - aerodromeEthStrategy, - pool, - josh, - weth, - strategist, - timelock, - oethVaultSigner, - } = fixture; + const { aerodromeEthStrategy, pool, josh, weth, oethVaultSigner } = + fixture; const depositAmount = parseUnits("50"); await weth @@ -184,7 +171,6 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { .deposit(weth.address, depositAmount); await expect(tx).to.revertedWith("Caller is not the Vault"); - // for (const signer of [strategist, timelock, josh]) { -> Check why this fails for (const signer of [josh]) { const tx = aerodromeEthStrategy.connect(signer).depositAll(); await expect(tx).to.revertedWith("Caller is not the Vault"); @@ -198,7 +184,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { describe("with the strategy having some OETH and WETH in the Pool", () => { beforeEach(async () => { fixture = await aeroOETHAMOFixture({ - wethMintAmount: 5000, + wethMintAmount: 50, depositToStrategy: true, balancePool: true, }); @@ -288,7 +274,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { wethReserveIndex, } = fixture; - const withdrawAmount = oethUnits("1000"); + const withdrawAmount = oethUnits("30"); const { oethBurnAmount, aeroBalances: aeroBalancesBefore } = await calcOethWithdrawAmount(fixture, withdrawAmount); @@ -381,29 +367,35 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { }); }); describe("with pool rebalance", () => { + const oethToSwap = parseUnits("100"); beforeEach(async () => { fixture = await aeroOETHAMOFixture(); }); it("Should be able to mint OETH and send received weth to recipient", async function () { - const { oeth, weth, josh, aeroRouter, aerodromeEthStrategy, oethVault } = - fixture; + const { + oeth, + weth, + josh, + aeroRouter, + aerodromeEthStrategy, + oethVault, + oethVaultSigner, + } = fixture; let joshWethBalanceBefore = await weth.balanceOf(josh.address); - let netOEthMintedBefore = await oethVault.netOusdMintedForStrategy(); - - const wethToSwap = parseUnits("1000"); - await weth.connect(josh).approve(aeroRouter.address, wethToSwap); + await oeth.connect(oethVaultSigner).mint(josh.address, oethUnits("100")); + await oeth.connect(josh).approve(aeroRouter.address, oethToSwap); // Perform swap to imbalance the pool await aeroRouter .connect(josh) .swapExactTokensForTokens( - wethToSwap, + oethToSwap, 0, [ [ - weth.address, oeth.address, + weth.address, true, addresses.base.aeroFactoryAddress, ], @@ -426,9 +418,11 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { fixture: JSON.stringify(fixture), output: false, }); + const strategistAddress = await oethVault.strategistAddr(); + const sStrategist = await impersonateAndFund(strategistAddress); // Rebalance pool tx = await aerodromeEthStrategy - .connect(josh) + .connect(sStrategist) .swapAndRebalancePool(amountIn, 0, tokenIn, josh.address); const receipt = await tx.wait(); @@ -442,10 +436,8 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { }); let joshWethBalanceAfter = await weth.balanceOf(josh.address); - let netOEthMintedAfter = await oethVault.netOusdMintedForStrategy(); expect(joshWethBalanceAfter).to.gt(joshWethBalanceBefore); - expect(netOEthMintedAfter).to.gt(netOEthMintedBefore); }); it("Should be able to burn OETH when rebalancing", async function () { const { oethVault } = fixture; @@ -460,49 +452,47 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { }); it("Should not rebalance pool by making the WETH reserve > OETH reserve", async function () { - const { oeth, weth, josh, aeroRouter, aerodromeEthStrategy } = fixture; - const oethToSwap = parseUnits("1000"); - await oeth.connect(josh).approve(aeroRouter.address, oethToSwap); - - // Perform swap to imbalance the pool - await aeroRouter - .connect(josh) - .swapExactTokensForTokens( - oethToSwap, - 0, - [ - [ - oeth.address, - weth.address, - true, - addresses.base.aeroFactoryAddress, - ], - ], - josh.address, - parseInt(Date.now() / 1000) + 5 * 360 - ); + const { + oeth, + weth, + josh, + aeroRouter, + aerodromeEthStrategy, + oethVaultSigner, + oethVault, + } = fixture; // Try to make the pool balance even worse (should revert) const { tokenIn, amountIn } = await getParamsForPoolRebalance( fixture, - 49, - 51 + 48, + 52 ); if (tokenIn == weth.address) { await weth .connect(josh) .transfer(aerodromeEthStrategy.address, amountIn); } - + const strategistAddress = await oethVault.strategistAddr(); + const sStrategist = await impersonateAndFund(strategistAddress); // Rebalance pool should revert with error message tx = aerodromeEthStrategy - .connect(josh) + .connect(sStrategist) .swapAndRebalancePool(amountIn, 0, tokenIn, josh.address); + await expect(tx).to.revertedWith("WETH reserves exceeds OETH"); }); it("Should not rebalance pool more than allowed threshold", async function () { - const { oeth, weth, josh, aeroRouter, aerodromeEthStrategy } = fixture; - const oethToSwap = parseUnits("1000"); + const { + oeth, + weth, + josh, + aeroRouter, + aerodromeEthStrategy, + oethVault, + oethVaultSigner, + } = fixture; + await oeth.connect(oethVaultSigner).mint(josh.address, oethToSwap); await oeth.connect(josh).approve(aeroRouter.address, oethToSwap); // Perform swap to imbalance the pool @@ -536,12 +526,15 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { .transfer(aerodromeEthStrategy.address, amountIn); } + const strategistAddress = await oethVault.strategistAddr(); + const sStrategist = await impersonateAndFund(strategistAddress); + // Rebalance pool await aerodromeEthStrategy - .connect(josh) + .connect(sStrategist) .swapAndRebalancePool(amountIn, 0, tokenIn, josh.address); // Try to make the pool balance even worse (should revert) const { tokenIn: tokenIn2, amountIn: amountIn2 } = - await getParamsForPoolRebalance(fixture, 57, 43); + await getParamsForPoolRebalance(fixture, 60, 40); if (tokenIn2 == weth.address) { await weth .connect(josh) @@ -550,7 +543,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { // Rebalance pool should revert with error message tx = aerodromeEthStrategy - .connect(josh) + .connect(sStrategist) .swapAndRebalancePool(amountIn2, 0, tokenIn2, josh.address); await expect(tx).to.revertedWith("Pool imbalance worsened"); }); @@ -562,6 +555,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { const wethDepositAmount = await units("100", weth); // Vault transfers WETH to strategy + await weth.connect(josh).deposit({ value: wethDepositAmount }); await weth .connect(josh) .transfer(aerodromeEthStrategy.address, wethDepositAmount); @@ -620,6 +614,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { await rebalancePool(fixture); const depositAmount = parseUnits("50"); + await weth.connect(josh).deposit({ value: depositAmount }); await weth .connect(josh) .transfer(aerodromeEthStrategy.address, depositAmount); @@ -652,6 +647,7 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { aerodromeEthStrategy, pool, oeth, + josh, oethVaultSigner, weth, oethVault, @@ -659,9 +655,22 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { wethReserveIndex, } = fixture; + // deposit first + const wethDepositAmount = await units("100", weth); + + // Vault transfers WETH to strategy + await weth.connect(josh).deposit({ value: wethDepositAmount }); + await weth + .connect(josh) + .transfer(aerodromeEthStrategy.address, wethDepositAmount); + + await aerodromeEthStrategy + .connect(oethVaultSigner) + .deposit(weth.address, wethDepositAmount); + await rebalancePool(fixture); - const withdrawAmount = oethUnits("1000"); + const withdrawAmount = oethUnits("80"); const { oethBurnAmount, aeroBalances: aeroBalancesBefore } = await calcOethWithdrawAmount(fixture, withdrawAmount); @@ -729,7 +738,20 @@ describe("ForkTest: OETH AMO Aerodrome Strategy", function () { weth, oethReserveIndex, wethReserveIndex, + josh, } = fixture; + // deposit first + const wethDepositAmount = await units("100", weth); + + // Vault transfers WETH to strategy + await weth.connect(josh).deposit({ value: wethDepositAmount }); + await weth + .connect(josh) + .transfer(aerodromeEthStrategy.address, wethDepositAmount); + + await aerodromeEthStrategy + .connect(oethVaultSigner) + .deposit(weth.address, wethDepositAmount); await rebalancePool(fixture); @@ -962,13 +984,6 @@ async function getParamsForPoolRebalance( oethReserveIndex, wethReserveIndex, } = fixture; - await oeth - .connect(josh) - .approve(aeroRouter.address, ethers.utils.parseUnits("1000")); - - await weth - .connect(josh) - .approve(aeroRouter.address, ethers.utils.parseUnits("1000")); log( "Stable liq ratio before", @@ -1064,10 +1079,18 @@ async function getParamsForPoolRebalance( } async function rebalancePool(fixture) { - const { oeth, weth, josh, aeroRouter, aerodromeEthStrategy } = fixture; - const oethToSwap = parseUnits("1000"); + const { + oeth, + weth, + josh, + aeroRouter, + aerodromeEthStrategy, + oethVaultSigner, + oethVault, + } = fixture; + const oethToSwap = parseUnits("100"); + await oeth.connect(oethVaultSigner).mint(josh.address, oethUnits("100")); await oeth.connect(josh).approve(aeroRouter.address, oethToSwap); - // Perform swap to imbalance the pool await aeroRouter .connect(josh) @@ -1090,9 +1113,11 @@ async function rebalancePool(fixture) { fixture: JSON.stringify(fixture), output: false, }); + const strategistAddress = await oethVault.strategistAddr(); + const sStrategist = await impersonateAndFund(strategistAddress); // Rebalance pool tx = await aerodromeEthStrategy - .connect(josh) + .connect(sStrategist) .swapAndRebalancePool(amountIn, 0, tokenIn, josh.address); const receipt = await tx.wait(); diff --git a/contracts/test/vault/oeth-vault.base.fork-test.js b/contracts/test/vault/oeth-vault.base.fork-test.js new file mode 100644 index 0000000000..e09bf4aca3 --- /dev/null +++ b/contracts/test/vault/oeth-vault.base.fork-test.js @@ -0,0 +1,246 @@ +const { expect } = require("chai"); +const { + formatUnits, + parseUnits, + parseEther, + formatEther, +} = require("ethers/lib/utils"); + +const addresses = require("../../utils/addresses"); +const { createFixtureLoader } = require("../_fixture"); +const { defaultBaseFixture } = require("../_fixture-base"); + +const { isCI, oethUnits } = require("../helpers"); +const { impersonateAndFund } = require("../../utils/signers"); +const { setERC20TokenBalance } = require("../_fund"); + +const log = require("../../utils/logger")("test:fork:oeth:vault"); + +const { oethWhaleAddress } = addresses.mainnet; + +const baseFixture = createFixtureLoader(defaultBaseFixture); +describe("ForkTest: OETH Vault Base", function () { + this.timeout(0); + + // Retry up to 3 times on CI + this.retries(isCI ? 3 : 0); + + let fixture; + beforeEach(async () => { + fixture = await baseFixture(); + }); + + describe("post deployment", () => { + it("Should have the correct governor address set", async () => { + const { oethVault, oethDripper, oeth, woeth, oethBaseHarvester } = + fixture; + + const oethContracts = [ + oethVault, + oethDripper, + oeth, + woeth, + oethBaseHarvester, + ]; + + for (let i = 0; i < oethContracts.length; i++) { + expect(await oethContracts[i].governor()).to.equal( + addresses.base.governor + ); + } + }); + + it("Should have correct WETH asset index cached", async () => { + const { oethVault, weth } = fixture; + const index = await oethVault.wethAssetIndex(); + const assets = await oethVault.getAllAssets(); + + expect(assets[index]).to.equal(weth.address); + }); + }); + + describe("user operations", () => { + let oethWhaleSigner; + beforeEach(async () => { + oethWhaleSigner = await impersonateAndFund(oethWhaleAddress); + }); + + it("should mint with WETH", async () => { + const { oethVault, weth, josh } = fixture; + + const amount = parseUnits("1", 18); + const minOeth = parseUnits("0.8", 18); + + await weth.connect(josh).approve(oethVault.address, amount); + await setERC20TokenBalance(josh.address, weth); + const tx = await oethVault + .connect(josh) + .mint(weth.address, amount, minOeth); + + await expect(tx) + .to.emit(oethVault, "Mint") + .withArgs(josh.address, amount); + }); + + it("should not mint with any other asset", async () => { + const { oethVault, oeth, josh } = fixture; + + const amount = parseUnits("1", 18); + const minOeth = parseUnits("0.8", 18); + + await oeth.connect(josh).approve(oethVault.address, amount); + const tx = oethVault.connect(josh).mint(oeth.address, amount, minOeth); + + await expect(tx).to.be.revertedWith("Unsupported asset for minting"); + }); + + it("should have 0% redeem fee", async () => { + const { oethVault } = fixture; + + expect(await oethVault.redeemFeeBps()).to.equal(0); + }); + it("should return only WETH in redeem calculations", async () => { + const { oethVault } = fixture; + + const output = await oethVault.calculateRedeemOutputs(oethUnits("123")); + const index = await oethVault.wethAssetIndex(); + + expect(output[index]).to.equal(oethUnits("123")); + + output.map((x, i) => { + if (i !== index.toNumber()) { + expect(x).to.equal("0"); + } + }); + }); + + it("should partially redeem", async () => { + const { oeth, oethVault, weth } = fixture; + const amountToMint = parseUnits("11", 18); + const minOethAmount = parseUnits("10", 18); + + await weth + .connect(oethWhaleSigner) + .approve(oethVault.address, amountToMint); + await setERC20TokenBalance(oethWhaleAddress, weth); + await oethVault + .connect(oethWhaleSigner) + .mint(weth.address, amountToMint, minOethAmount); + + expect(await oeth.balanceOf(oethWhaleAddress)).to.gt(10); + + const amount = parseUnits("10", 18); + const minEth = parseUnits("9.94", 18); + + const tx = await oethVault + .connect(oethWhaleSigner) + .redeem(amount, minEth); + await expect(tx) + .to.emit(oethVault, "Redeem") + .withNamedArgs({ _addr: oethWhaleAddress }); + }); + it("OETH whale can not redeem due to no strategy and liquidity", async () => { + const { oethVault } = fixture; + + const tx = oethVault.connect(oethWhaleSigner).redeem(parseUnits("10"), 0); + await expect(tx).to.revertedWith("Liquidity error"); + }); + it.skip("OETH whale can redeem after withdraw from all strategies", async () => { + const { oeth, oethVault, timelock, domen, strategist, frxETH } = fixture; + + const allStrats = await oethVault.getAllStrategies(); + if ( + allStrats + .map((x) => x.toLowerCase()) + .includes(addresses.mainnet.FraxETHStrategy.toLowerCase()) + ) { + // Remove fraxETH strategy if it exists + // Because it no longer holds assets and causes this test to fail + + // Send some dust to that first + await frxETH.connect(domen).transfer(oethVault.address, oethUnits("1")); + + // Now make sure it's deposited + await oethVault + .connect(strategist) + .depositToStrategy( + addresses.mainnet.FraxETHStrategy, + [frxETH.address], + [oethUnits("1")] + ); + + await oethVault + .connect(timelock) + .setAssetDefaultStrategy(frxETH.address, addresses.zero); + await oethVault + .connect(timelock) + .removeStrategy(addresses.mainnet.FraxETHStrategy); + } + + const oethWhaleBalance = await oeth.balanceOf(oethWhaleAddress); + log(`OETH whale balance: ${formatUnits(oethWhaleBalance)}`); + expect(oethWhaleBalance, "no longer an OETH whale").to.gt( + parseUnits("1000", 18) + ); + + await oethVault.connect(timelock).withdrawAllFromStrategies(); + + const tx = await oethVault + .connect(oethWhaleSigner) + .redeem(oethWhaleBalance, 0); + await expect(tx) + .to.emit(oethVault, "Redeem") + .withNamedArgs({ _addr: oethWhaleAddress }); + }); + it("OETH whale redeem 100 OETH", async () => { + const { oethVault, weth } = fixture; + const amountToMint = parseUnits("110", 18); + const minOethAmount = parseUnits("100", 18); + + await weth + .connect(oethWhaleSigner) + .approve(oethVault.address, amountToMint); + await setERC20TokenBalance(oethWhaleAddress, weth); + await oethVault + .connect(oethWhaleSigner) + .mint(weth.address, amountToMint, minOethAmount); + + const amount = parseUnits("100", 18); + const minEth = parseUnits("99.4", 18); + + const tx = await oethVault + .connect(oethWhaleSigner) + .redeem(amount, minEth); + await expect(tx) + .to.emit(oethVault, "Redeem") + .withNamedArgs({ _addr: oethWhaleAddress }); + }); + it("Vault should have the right WETH address", async () => { + const { oethVault } = fixture; + + expect((await oethVault.weth()).toLowerCase()).to.equal( + addresses.base.wethTokenAddress.toLowerCase() + ); + }); + it("Should return a price for minting with WETH", async () => { + const { oethVault, weth } = fixture; + const price = await oethVault.priceUnitMint(weth.address); + + log(`Price for minting with WETH: ${formatEther(price, 6)}`); + + expect(price).to.be.lte(parseEther("1")); + expect(price).to.be.gt(parseEther("0.998")); + }); + }); + describe("Rebase", () => { + it(`Shouldn't be paused`, async () => { + const { oethVault } = fixture; + expect(await oethVault.rebasePaused()).to.be.false; + }); + + it(`Should rebase`, async () => { + const { oethVault } = fixture; + await oethVault.rebase(); + }); + }); +}); diff --git a/contracts/utils/addresses.js b/contracts/utils/addresses.js index db0a72a6c2..ac0581ea8e 100644 --- a/contracts/utils/addresses.js +++ b/contracts/utils/addresses.js @@ -266,4 +266,6 @@ addresses.base.aeroUsdPriceFeed = "0x4EC5970fC728C5f65ba413992CD5fF6FD70fcfF0"; addresses.base.wethTokenAddress = "0x4200000000000000000000000000000000000006"; addresses.base.wethAeroPoolAddress = "0x80aBe24A3ef1fc593aC5Da960F232ca23B2069d0"; +addresses.base.governor = "0x92A19381444A001d62cE67BaFF066fA1111d7202"; + module.exports = addresses; diff --git a/contracts/utils/delpoy-l2.js b/contracts/utils/delpoy-l2.js index dd893af979..59ce3ddbcf 100644 --- a/contracts/utils/delpoy-l2.js +++ b/contracts/utils/delpoy-l2.js @@ -1,8 +1,23 @@ -const { isFork, isArbFork } = require("../test/helpers"); -const { deployWithConfirmation, withConfirmation } = require("./deploy"); +const { isFork, isArbFork, isBaseFork } = require("../test/helpers"); +const addresses = require("./addresses"); +const { + deployWithConfirmation, + withConfirmation, + impersonateGuardian, +} = require("./deploy"); const { impersonateAndFund } = require("./signers"); const { getTxOpts } = require("./tx"); +function log(msg, deployResult = null) { + if (isBaseFork || isArbFork || process.env.VERBOSE) { + if (deployResult && deployResult.receipt) { + const gasUsed = Number(deployResult.receipt.gasUsed.toString()); + msg += ` Address: ${deployResult.address} Gas Used: ${gasUsed}`; + } + console.log("INFO:", msg); + } +} + function deployOnArb(opts, fn) { const { deployName, dependencies } = opts; @@ -83,15 +98,87 @@ function deployOnBase(opts, fn) { main.skip = () => !( - isArbFork || + isBaseFork || hre.network.name == "base" || hre.network.config.chainId == 8453 ); return main; } +function deployOnBaseWithGuardian(opts, fn) { + const { deployName, dependencies, forceDeploy, onlyOnFork, forceSkip } = opts; + + const runDeployment = async (hre) => { + const tools = { + deployWithConfirmation, + ethers: hre.ethers, + getTxOpts: getTxOpts, + withConfirmation, + }; + if (isFork) { + const { deployerAddr } = await getNamedAccounts(); + await impersonateAndFund(deployerAddr); + } + + const proposal = await fn(tools); + + const guardianAddr = addresses.base.governor; + await impersonateGuardian(guardianAddr); + + const sGuardian = await ethers.provider.getSigner(guardianAddr); + console.log("guardianAddr", guardianAddr); + + const guardianActions = []; + for (const action of proposal.actions) { + const { contract, signature, args } = action; + log(`Sending governance action ${signature} to ${contract.address}`); + const result = await withConfirmation( + contract.connect(sGuardian)[signature](...args, await getTxOpts()) + ); + guardianActions.push({ + sig: signature, + args: args, + to: contract.address, + data: result.data, + value: result.value.toString(), + }); + + console.log(`... ${signature} completed`); + } + + console.log( + "Execute the following actions using guardian safe: ", + guardianActions + ); + }; + + const main = async (hre) => { + console.log(`Running ${deployName} deployment...`); + if (!hre) { + hre = require("hardhat"); + } + await runDeployment(hre); + console.log(`${deployName} deploy done.`); + return true; + }; + + main.id = deployName; + main.dependencies = dependencies || []; + + main.tags = ["base"]; + + main.skip = () => + !( + isBaseFork || + hre.network.name == "base" || + hre.network.config.chainId == 8453 + ); + + return main; +} module.exports = { deployOnArb, deployOnBase, + deployOnBaseWithGuardian, }; diff --git a/contracts/yarn.lock b/contracts/yarn.lock index 70dc9dc588..f4e00c3ae8 100644 --- a/contracts/yarn.lock +++ b/contracts/yarn.lock @@ -34,13 +34,6 @@ dependencies: tslib "^2.3.1" -"@babel/code-frame@^7.0.0": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" @@ -48,6 +41,13 @@ dependencies: "@babel/highlight" "^7.10.4" +"@babel/code-frame@^7.0.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + "@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" @@ -113,22 +113,6 @@ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" @@ -241,14 +225,6 @@ lru-cache "^5.1.1" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5", "@ethereumjs/common@2.6.5": - version "2.6.5" - resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - "@ethereumjs/common@2.6.0": version "2.6.0" resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz" @@ -257,6 +233,14 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.3" +"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + "@ethereumjs/ethash@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz" @@ -273,14 +257,6 @@ resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz" integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2", "@ethereumjs/tx@3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - "@ethereumjs/tx@3.4.0": version "3.4.0" resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz" @@ -289,6 +265,14 @@ "@ethereumjs/common" "^2.6.0" ethereumjs-util "^7.1.3" +"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz" @@ -316,7 +300,7 @@ merkle-patricia-tree "^4.2.2" rustbn.js "~0.2.0" -"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -331,7 +315,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@^5.6.1", "@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -344,7 +328,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@^5.6.2", "@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -355,7 +339,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -366,14 +350,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -381,7 +365,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -390,21 +374,21 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@^5.7.0", "@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -420,7 +404,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@^5.6.1", "@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -435,7 +419,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -453,7 +437,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -472,7 +456,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -480,19 +464,19 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@^5.7.0", "@ethersproject/networks@^5.7.1", "@ethersproject/networks@5.7.1": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0", "@ethersproject/networks@^5.7.1": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -500,14 +484,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.6.8", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2", "@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -533,7 +517,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -541,7 +525,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -549,7 +533,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -558,7 +542,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -570,7 +554,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@^5.7.0", "@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -582,7 +566,7 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -591,7 +575,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -615,7 +599,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@^5.7.0", "@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -636,7 +620,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -647,7 +631,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -745,24 +729,24 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/curves@~1.3.0", "@noble/curves@1.3.0": +"@noble/curves@1.3.0", "@noble/curves@~1.3.0": version "1.3.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz" integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== dependencies: "@noble/hashes" "1.3.3" -"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/hashes@~1.3.2", "@noble/hashes@1.3.3": +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.2": version "1.3.3" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== -"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== @@ -775,7 +759,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -934,6 +918,51 @@ resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz" integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.1" resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz" @@ -950,12 +979,12 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" -"@nomiclabs/hardhat-ethers@^2.0.0", "@nomiclabs/hardhat-ethers@^2.0.2": +"@nomiclabs/hardhat-ethers@^2.0.2": version "2.2.3" resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== -"@nomiclabs/hardhat-etherscan@^3.1.0", "@nomiclabs/hardhat-etherscan@^3.1.7": +"@nomiclabs/hardhat-etherscan@^3.1.7": version "3.1.7" resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== @@ -993,11 +1022,6 @@ resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz" integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== -"@openzeppelin/contracts@~4.3.3": - version "4.3.3" - resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz" - integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== - "@openzeppelin/contracts@3.4.2-solc-0.7": version "3.4.2-solc-0.7" resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz" @@ -1008,6 +1032,11 @@ resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.4.2.tgz" integrity sha512-NyJV7sJgoGYqbtNUWgzzOGW4T6rR19FmX1IJgXGdapGPWsuMelGJn9h03nos0iqfforCbCB0iYIR0MtIuIFLLw== +"@openzeppelin/contracts@~4.3.3": + version "4.3.3" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz" + integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== + "@openzeppelin/defender-sdk-action-client@^1.3.0": version "1.3.0" resolved "https://registry.npmjs.org/@openzeppelin/defender-sdk-action-client/-/defender-sdk-action-client-1.3.0.tgz" @@ -1288,10 +1317,10 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== +"@solidity-parser/parser@0.12.1": + version "0.12.1" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.1.tgz" + integrity sha512-ikxVpwskNxEp2fvYS1BdRImnevHmM97zdPFBa1cVtjtNpoqCm/EmljATTZk0s9G/zsN5ZbPf9OAIAW4gbBJiRA== "@solidity-parser/parser@^0.13.2": version "0.13.2" @@ -1314,25 +1343,6 @@ dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@0.12.1": - version "0.12.1" - resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.12.1.tgz" - integrity sha512-ikxVpwskNxEp2fvYS1BdRImnevHmM97zdPFBa1cVtjtNpoqCm/EmljATTZk0s9G/zsN5ZbPf9OAIAW4gbBJiRA== - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz" @@ -1367,28 +1377,13 @@ dependencies: "@types/node" "*" -"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": +"@types/bn.js@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" -"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": - version "6.0.3" - resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/chai@*": - version "4.3.14" - resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz" - integrity sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w== - "@types/concat-stream@^1.6.0": version "1.6.1" resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" @@ -1411,18 +1406,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/http-cache-semantics@*": - version "4.0.4" - resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - "@types/level-errors@*": version "3.0.0" resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz" @@ -1437,12 +1420,7 @@ "@types/level-errors" "*" "@types/node" "*" -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/lru-cache@5.1.1": +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== @@ -1472,26 +1450,21 @@ resolved "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz" integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.12.6": - version "12.20.55" - resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - "@types/node@^8.0.0": version "8.10.66" resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== -"@types/node@11.11.6": - version "11.11.6" - resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" - integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== - "@types/pbkdf2@^3.0.0": version "3.1.0" resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" @@ -1517,13 +1490,6 @@ "@types/node" "*" safe-buffer "~5.1.1" -"@types/responselike@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz" - integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== - dependencies: - "@types/node" "*" - "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" @@ -1536,26 +1502,6 @@ resolved "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== -"@types/sinon-chai@^3.2.3": - version "3.2.12" - resolved "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz" - integrity sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "17.0.3" - resolved "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz" - integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "8.1.5" - resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz" - integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== - "@uniswap/lib@^4.0.1-alpha": version "4.0.1-alpha" resolved "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz" @@ -1566,16 +1512,16 @@ resolved "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz" integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== -"@uniswap/v3-core@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz" - integrity sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ== - "@uniswap/v3-core@1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz" integrity sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA== +"@uniswap/v3-core@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz" + integrity sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ== + "@uniswap/v3-periphery@^1.1.1": version "1.4.3" resolved "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz" @@ -1604,11 +1550,6 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abortcontroller-polyfill@^1.7.5: - version "1.7.5" - resolved "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" @@ -1656,29 +1597,21 @@ abstract-leveldown@~6.2.1: level-supports "~1.0.0" xtend "~4.0.0" -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^6.0.7: version "6.4.2" resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + address@^1.0.1: version "1.2.2" resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" @@ -1745,11 +1678,6 @@ amdefine@>=0.0.4: resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" @@ -1760,6 +1688,11 @@ ansi-colors@4.1.1: resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" @@ -1772,11 +1705,6 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" @@ -1806,16 +1734,16 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -antlr4@^4.11.0: - version "4.13.0" - resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.13.0.tgz" - integrity sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew== - antlr4@4.7.1: version "4.7.1" resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz" integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== +antlr4@^4.11.0: + version "4.13.0" + resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.13.0.tgz" + integrity sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew== + antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" @@ -1846,12 +1774,7 @@ array-back@^3.0.1, array-back@^3.1.0: resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" - integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== - -array-back@^4.0.2: +array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== @@ -1864,11 +1787,6 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" @@ -1902,7 +1820,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@^1.0.0, assert-plus@1.0.0: +assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -1934,11 +1852,6 @@ async-eventemitter@^0.2.4: dependencies: async "^2.4.0" -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async-retry@^1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" @@ -1946,6 +1859,11 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" +async@1.x: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + async@^2.4.0: version "2.6.4" resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" @@ -1953,11 +1871,6 @@ async@^2.4.0: dependencies: lodash "^4.17.14" -async@1.x: - version "1.5.2" - resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" @@ -1978,14 +1891,7 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^0.21.2: +axios@^0.21.1, axios@^0.21.2: version "0.21.4" resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== @@ -2006,7 +1912,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2, base-x@^3.0.8: +base-x@^3.0.2: version "3.0.9" resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -2065,54 +1971,21 @@ blakejs@^1.1.0: resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.0, bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -bn.js@^5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -bn.js@^5.2.1: +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - -body-parser@^1.16.0, body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2188,11 +2061,6 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz" - integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" @@ -2205,7 +2073,16 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2221,16 +2098,7 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -bufferutil@^4.0.1, bufferutil@4.0.5: +bufferutil@4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz" integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== @@ -2254,29 +2122,6 @@ bytes@3.1.2: resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-lookup@^6.0.4: - version "6.1.0" - resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz" - integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== - -cacheable-request@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" - integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" @@ -2309,11 +2154,6 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - camelcase@^5.0.0: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -2334,12 +2174,7 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -catering@^2.0.0: - version "2.1.0" - dependencies: - queue-tick "^1.0.0" - -catering@^2.1.0, catering@^2.1.1: +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== @@ -2351,7 +2186,7 @@ cbor@^8.0.0, cbor@^8.1.0: dependencies: nofilter "^3.1.0" -chai@^4.3.4, chai@4.x: +chai@^4.3.4: version "4.3.7" resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== @@ -2373,23 +2208,7 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2412,21 +2231,6 @@ check-error@^1.0.2: resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@^3.4.0, chokidar@^3.5.2, chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - chokidar@3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" @@ -2442,27 +2246,26 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" ci-info@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" @@ -2471,11 +2274,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - classic-level@^1.2.0: version "1.3.0" resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz" @@ -2523,15 +2321,6 @@ cli-width@^2.0.0: resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" @@ -2550,18 +2339,6 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -2576,17 +2353,17 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -colors@^1.1.2, colors@1.4.0: +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -2623,16 +2400,6 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^8.1.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - commander@2.18.0: version "2.18.0" resolved "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz" @@ -2643,6 +2410,16 @@ commander@3.0.2: resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + compare-versions@^5.0.0: version "5.0.3" resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz" @@ -2663,64 +2440,25 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - cookie@^0.4.1: version "0.4.2" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - core-js-pure@^3.0.1: version "3.31.0" resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.0.tgz" integrity sha512-/AnE9Y4OsJZicCzIe97JP5XoPKQJfTuEG43aEVLFJGOJpyqELod+pE6LEl63DfG1Mp8wX97LDaDpy1GmLEUxlg== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^5.0.7: version "5.2.1" @@ -2770,13 +2508,6 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-fetch@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz" - integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== - dependencies: - node-fetch "^2.6.12" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" @@ -2802,14 +2533,6 @@ cross-spawn@^7.0.2: resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -d@^1.0.1, d@^1.0.2, d@1: - version "1.0.2" - resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz" - integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== - dependencies: - es5-ext "^0.10.64" - type "^2.7.2" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" @@ -2822,42 +2545,35 @@ death@^1.1.0: resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== +debug@3.2.6: + version "3.2.6" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4, debug@4.3.4: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@2.6.9: +debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.2.6: - version "3.2.6" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -2867,25 +2583,6 @@ decamelize@^4.0.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - deep-eql@^4.1.2: version "4.1.3" resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" @@ -2914,11 +2611,6 @@ defender-base-client@^1.44.0: lodash "^4.17.19" node-fetch "^2.6.0" -defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz" @@ -2945,11 +2637,6 @@ depd@2.0.0: resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - detect-port@^1.3.0: version "1.5.1" resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" @@ -2989,11 +2676,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - dotenv@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" @@ -3007,12 +2689,7 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -3050,11 +2727,6 @@ encode-utf8@^1.0.2: resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - encoding-down@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz" @@ -3065,13 +2737,6 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" @@ -3091,7 +2756,7 @@ errno@~0.1.1: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -3161,59 +2826,17 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: - version "0.10.64" - resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz" - integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - esniff "^2.0.1" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.4" - resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz" - integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== - dependencies: - d "^1.0.2" - ext "^1.7.0" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5, escape-string-regexp@1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -3358,16 +2981,6 @@ eslint@^7.32.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -esniff@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz" - integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== - dependencies: - d "^1.0.1" - es5-ext "^0.10.62" - event-emitter "^0.3.5" - type "^2.7.2" - espree@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz" @@ -3386,7 +2999,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^2.7.1, esprima@2.7.x: +esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== @@ -3420,12 +3033,7 @@ estraverse@^4.1.1: resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -3435,19 +3043,6 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eth-ens-namehash@^2.0.8, eth-ens-namehash@2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - eth-gas-reporter@^0.2.25: version "0.2.25" resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" @@ -3469,27 +3064,6 @@ eth-gas-reporter@^0.2.25: sha1 "^1.1.1" sync-request "^6.0.0" -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - ethereum-bloom-filters@^1.0.6: version "1.0.10" resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" @@ -3497,7 +3071,7 @@ ethereum-bloom-filters@^1.0.6: dependencies: js-sha3 "^0.8.0" -ethereum-cryptography@^0.1.3, ethereum-cryptography@0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -3528,17 +3102,7 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -ethereum-cryptography@^2.0.0: - version "2.1.3" - resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz" - integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== - dependencies: - "@noble/curves" "1.3.0" - "@noble/hashes" "1.3.3" - "@scure/bip32" "1.3.3" - "@scure/bip39" "1.2.2" - -ethereum-cryptography@^2.1.2: +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: version "2.1.3" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz" integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== @@ -3548,7 +3112,7 @@ ethereum-cryptography@^2.1.2: "@scure/bip32" "1.3.3" "@scure/bip39" "1.2.2" -ethereum-waffle@*, ethereum-waffle@^4.0.10: +ethereum-waffle@^4.0.10: version "4.0.10" resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz" integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== @@ -3560,7 +3124,7 @@ ethereum-waffle@*, ethereum-waffle@^4.0.10: solc "0.8.15" typechain "^8.0.0" -ethereumjs-abi@^0.6.8, ethereumjs-abi@0.6.8: +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== @@ -3568,20 +3132,18 @@ ethereumjs-abi@^0.6.8, ethereumjs-abi@0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-util@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== +ethereumjs-util@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" create-hash "^1.1.2" - elliptic "^6.5.2" ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" + rlp "^2.2.4" -ethereumjs-util@^6.2.1: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -3605,18 +3167,22 @@ ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethereumjs-util@7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== +ethers@^4.0.40: + version "4.0.49" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" + aes-js "3.0.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" -ethers@*, ethers@^5, ethers@^5.0.0, ethers@^5.0.5, ethers@^5.1.3, ethers@^5.4.6, ethers@^5.5.3, ethers@^5.6.1, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: +ethers@^5.4.6, ethers@^5.5.3, ethers@^5.6.1, ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -3652,21 +3218,6 @@ ethers@*, ethers@^5, ethers@^5.0.0, ethers@^5.0.5, ethers@^5.1.3, ethers@^5.4.6, "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" @@ -3675,7 +3226,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@^0.1.6, ethjs-util@0.1.6: +ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -3683,24 +3234,11 @@ ethjs-util@^0.1.6, ethjs-util@0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - event-target-shim@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" @@ -3709,50 +3247,6 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -express@^4.14.0: - version "4.19.2" - resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - extend@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" @@ -3767,19 +3261,19 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== -fast-base64-decode@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz" +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz" integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: @@ -3848,19 +3342,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - find-replace@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" @@ -3868,22 +3349,7 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0, find-up@3.0.0: +find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== @@ -3898,6 +3364,13 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" @@ -3961,11 +3434,6 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data-encoder@1.7.1: - version "1.7.1" - resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz" - integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== - form-data@^2.2.0: version "2.5.1" resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" @@ -4002,25 +3470,15 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - fp-ts@1.19.3: version "1.19.3" resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== fs-extra@^0.30.0: version "0.30.0" @@ -4042,15 +3500,6 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" @@ -4069,13 +3518,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" @@ -4138,11 +3580,6 @@ ganache@7.4.3: bufferutil "4.0.5" utf-8-validate "5.0.7" -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" @@ -4168,18 +3605,6 @@ get-port@^3.1.0: resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" @@ -4210,75 +3635,75 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== +glob@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.1.1" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^5.0.1" + minimatch "^3.0.4" once "^1.3.0" + path-is-absolute "^1.0.0" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" global-modules@^2.0.0: version "2.0.0" @@ -4296,14 +3721,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.7.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -4344,42 +3761,6 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^11.8.5: - version "11.8.6" - resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -got@12.1.0: - version "12.1.0" - resolved "https://registry.npmjs.org/got/-/got-12.1.0.tgz" - integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== - dependencies: - "@sindresorhus/is" "^4.6.0" - "@szmarczak/http-timer" "^5.0.1" - "@types/cacheable-request" "^6.0.2" - "@types/responselike" "^1.0.0" - cacheable-lookup "^6.0.4" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - form-data-encoder "1.7.1" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^2.0.0" - graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" @@ -4476,7 +3857,7 @@ hardhat-tracer@^2.3.2: chalk "^4.1.2" ethers "^5.6.1" -hardhat@^2.0.0, hardhat@^2.0.2, hardhat@^2.0.4, hardhat@^2.11.0, hardhat@^2.14.1, hardhat@^2.9.5, hardhat@2.x: +hardhat@^2.14.1: version "2.15.0" resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.15.0.tgz" integrity sha512-cC9tM/N10YaES04zPOp7yR13iX3YibqaNmi0//Ep40Nt9ELIJx3kFpQmucur0PAIfXYpGnw5RuXHNLkxpnVHEw== @@ -4592,14 +3973,6 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7, hash.js@1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - hash.js@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" @@ -4608,6 +3981,14 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + he@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" @@ -4627,7 +4008,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: +hosted-git-info@^2.6.0: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== @@ -4642,11 +4023,6 @@ http-basic@^8.1.1: http-response-object "^3.0.1" parse-cache-control "^1.0.1" -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -4658,11 +4034,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" - integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== - http-response-object@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" @@ -4679,22 +4050,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -http2-wrapper@^2.1.10: - version "2.2.1" - resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" @@ -4708,20 +4063,13 @@ husky@^7.0.2: resolved "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== -iconv-lite@^0.4.24, iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" @@ -4732,12 +4080,7 @@ ignore@^4.0.6: resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -ignore@^5.2.4: +ignore@^5.1.1, ignore@^5.2.4: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -4801,7 +4144,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4844,11 +4187,6 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - io-ts@1.10.4: version "1.10.4" resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" @@ -4856,19 +4194,6 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" @@ -4939,13 +4264,6 @@ is-extglob@^2.1.1: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" @@ -4956,18 +4274,6 @@ is-fullwidth-code-point@^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== -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" @@ -5031,7 +4337,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -5042,7 +4348,7 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -5057,11 +4363,6 @@ is-url@^1.2.4: resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" @@ -5107,41 +4408,21 @@ js-sdsl@^4.1.4: resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz" integrity sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA== -js-sha3@^0.5.7: +js-sha3@0.5.7: version "0.5.7" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== -js-sha3@^0.8.0, js-sha3@0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@3.x: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js-yaml@3.13.1: version "3.13.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" @@ -5150,7 +4431,15 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@4.1.0: +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -5169,11 +4458,6 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" @@ -5257,15 +4541,6 @@ jszip@^3.8.0: readable-stream "~2.3.6" setimmediate "^1.0.5" -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - keccak@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" @@ -5283,12 +4558,14 @@ keccak@3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keyv@^4.0.0: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: - json-buffer "3.0.1" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" kind-of@^6.0.2: version "6.0.3" @@ -5302,13 +4579,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - level-codec@^9.0.0: version "9.0.2" resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" @@ -5450,17 +4720,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" @@ -5484,11 +4743,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" @@ -5531,21 +4785,6 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -5560,6 +4799,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + ltgt@~2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" @@ -5589,11 +4833,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - memdown@^5.0.0: version "5.1.0" resolved "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz" @@ -5620,11 +4859,6 @@ memorystream@^0.3.1: resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" @@ -5642,11 +4876,6 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - micro-ftch@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz" @@ -5673,64 +4902,35 @@ mime-db@1.52.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-response@^1.0.0: +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, "minimatch@2 || 3": +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - minimatch@3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" @@ -5745,34 +4945,26 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz" - integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - mkdirp "*" + minimist "^1.2.5" -mkdirp@*, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@0.5.x: +mkdirp@0.5.x, mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -5784,13 +4976,6 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" @@ -5798,6 +4983,36 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + mocha@^10.0.0, mocha@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" @@ -5855,51 +5070,11 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== -ms@^2.1.1, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -5915,45 +5090,10 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== murmur-128@^0.2.1: version "0.2.1" @@ -5969,11 +5109,6 @@ mute-stream@0.0.7: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz" - integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== - nanoid@3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" @@ -5994,21 +5129,11 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - neo-async@^2.6.0: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" @@ -6034,18 +5159,13 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - node-gyp-build@4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz" @@ -6056,6 +5176,11 @@ node-gyp-build@4.4.0: resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + nofilter@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" @@ -6068,31 +5193,11 @@ nopt@3.x: dependencies: abbrev "1" -normalize-package-data@^2.3.2: - 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== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" @@ -6106,7 +5211,7 @@ oauth-sign@~0.9.0: resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -6121,16 +5226,6 @@ object-keys@^1.0.11, object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - object.assign@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" @@ -6141,6 +5236,16 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + object.getownpropertydescriptors@^2.0.3: version "2.1.6" resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz" @@ -6157,21 +5262,7 @@ obliterator@^2.0.0: resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz" - integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0, once@1.x: +once@1.x, once@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -6209,28 +5300,11 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" @@ -6312,18 +5386,6 @@ parse-cache-control@^1.0.1: resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" @@ -6342,23 +5404,11 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" @@ -6394,20 +5444,6 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" @@ -6439,28 +5475,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - pify@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - platform-deploy-client@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.6.0.tgz" @@ -6504,7 +5523,7 @@ prettier@^1.14.3: resolved "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prettier@^2.3.0, prettier@^2.3.1, prettier@^2.3.2, prettier@^2.8.3: +prettier@^2.3.1, prettier@^2.3.2, prettier@^2.8.3: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -6514,11 +5533,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - progress@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" @@ -6540,14 +5554,6 @@ proper-lockfile@^4.1.1: retry "^0.12.0" signal-exit "^3.0.2" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" @@ -6563,14 +5569,6 @@ psl@^1.1.28: resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" @@ -6581,11 +5579,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - qs@^6.11.0, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: version "6.11.2" resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" @@ -6598,35 +5591,11 @@ qs@~6.5.2: resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.0: - version "1.0.0" - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" @@ -6634,12 +5603,7 @@ randombytes@^2.0.1, randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@^2.4.1, raw-body@2.5.2: +raw-body@^2.4.1: version "2.5.2" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -6649,24 +5613,7 @@ raw-body@^2.4.1, raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^2.2.2: +readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -6688,19 +5635,6 @@ readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readdirp@~3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" @@ -6783,7 +5717,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.34, request@^2.79.0, request@^2.85.0, request@^2.88.0: +request@^2.85.0, request@^2.88.0: version "2.88.2" resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -6814,31 +5748,16 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== - require-from-string@^2.0.0, require-from-string@^2.0.2: 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== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - require-main-filename@^2.0.0: 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-alpn@^1.0.0, resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" @@ -6849,33 +5768,26 @@ resolve-from@^4.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.1.6: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -resolve@^1.10.0, resolve@1.17.0: +resolve@1.17.0: version "1.17.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== +resolve@^1.1.6: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - lowercase-keys "^2.0.0" + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" @@ -6885,21 +5797,28 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - retry@0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@^2.2.8: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" @@ -6914,13 +5833,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" @@ -6929,13 +5841,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3, rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - rlp@2.2.6: version "2.2.6" resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz" @@ -6943,6 +5848,13 @@ rlp@2.2.6: dependencies: bn.js "^4.11.1" +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + run-async@^2.2.0: version "2.4.1" resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" @@ -6984,7 +5896,7 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0, safe-buffer@5.2.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7003,7 +5915,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -7028,26 +5940,17 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@^3.0.0, scrypt-js@^3.0.1, scrypt-js@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - scrypt-js@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -secp256k1@4.0.3: +secp256k1@4.0.3, secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== @@ -7066,12 +5969,7 @@ semaphore-async-await@^1.5.1: resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== -semver@^5.3.0, semver@^5.5.0, semver@^5.7.0, "semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.5.1: +semver@^5.5.0, semver@^5.5.1, semver@^5.7.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -7081,46 +5979,13 @@ semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1: - version "7.5.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.4: +semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: version "7.5.1" resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" -semver@^7.3.5: - version "7.5.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" @@ -7128,42 +5993,21 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setimmediate@1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" @@ -7232,20 +6076,6 @@ signal-exit@^3.0.2: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.2" - resolved "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - slash@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" @@ -7274,42 +6104,31 @@ solady@^0.0.181: resolved "https://registry.npmjs.org/solady/-/solady-0.0.181.tgz" integrity sha512-uxMny+zHi9xrsKaoZoLliBkKBz00i7bWLHt2YMYjgsh7zKcQHWcONzY0zQB7qaGDzvxf4m/jFv8XiWpcP+0Pig== -solc@*, solc@0.8.15: - version "0.8.15" - resolved "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz" - integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== +solc@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" - commander "^8.1.0" + commander "3.0.2" follow-redirects "^1.12.1" - js-sha3 "0.8.0" - memorystream "^0.3.1" - semver "^5.5.0" - tmp "0.0.33" - -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: fs-extra "^0.30.0" + js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +solc@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz" + integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" 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" @@ -7436,32 +6255,6 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" @@ -7504,56 +6297,12 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -string_decoder@^1.1.1: - 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== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - string-format@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7561,16 +6310,7 @@ string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^3.1.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -7615,12 +6355,19 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== +string_decoder@^1.1.1: + 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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: - ansi-regex "^2.0.0" + safe-buffer "~5.1.0" strip-ansi@^4.0.0: version "4.0.0" @@ -7643,13 +6390,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" @@ -7657,25 +6397,29 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@^2.0.1, strip-json-comments@2.0.1: +strip-json-comments@2.0.1, strip-json-comments@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@^3.1.0: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 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== -strip-json-comments@^3.1.1: - 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@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" -strip-json-comments@3.1.1: - 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@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" supports-color@^3.1.0: version "3.2.3" @@ -7698,42 +6442,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swarm-js@^0.1.40: - version "0.1.42" - resolved "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz" - integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^11.8.5" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - sync-fetch@^0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.5.2.tgz" @@ -7788,24 +6501,6 @@ table@^6.0.9, table@^6.8.0, table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -7833,12 +6528,7 @@ through@^2.3.6: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -tmp@^0.0.33, tmp@0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -7890,12 +6580,7 @@ tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.3.1: - version "2.5.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tslib@^2.5.0: +tslib@^2.3.1, tslib@^2.5.0: version "2.5.3" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== @@ -7961,20 +6646,7 @@ type-fest@^0.7.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -typechain@^8.0.0, typechain@^8.1.1: +typechain@^8.0.0: version "8.2.0" resolved "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz" integrity sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg== @@ -7999,23 +6671,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@*, typescript@>=3.7.0, typescript@>=4.3.0: - version "5.4.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== - typical@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" @@ -8031,11 +6691,6 @@ uglify-js@^3.1.4: resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" @@ -8068,7 +6723,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -8080,11 +6735,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz" - integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== - url@^0.11.0: version "0.11.1" resolved "https://registry.npmjs.org/url/-/url-0.11.1.tgz" @@ -8093,7 +6743,7 @@ url@^0.11.0: punycode "^1.4.1" qs "^6.11.0" -utf-8-validate@^5.0.2, utf-8-validate@5.0.7: +utf-8-validate@5.0.7: version "5.0.7" resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz" integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== @@ -8110,21 +6760,10 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.5: - version "0.12.5" - resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== uuid@^3.3.2: version "3.4.0" @@ -8136,39 +6775,11 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -validate-npm-package-license@^3.0.1: - 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== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - verror@1.10.0: version "1.10.0" resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" @@ -8178,210 +6789,7 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -web3-bzz@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.4.tgz" - integrity sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw== - dependencies: - "@types/node" "^12.12.6" - got "12.1.0" - swarm-js "^0.1.40" - -web3-core-helpers@^1.8.2, web3-core-helpers@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz" - integrity sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g== - dependencies: - web3-eth-iban "1.10.4" - web3-utils "1.10.4" - -web3-core-method@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.4.tgz" - integrity sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.10.4" - web3-core-promievent "1.10.4" - web3-core-subscriptions "1.10.4" - web3-utils "1.10.4" - -web3-core-promievent@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz" - integrity sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz" - integrity sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg== - dependencies: - util "^0.12.5" - web3-core-helpers "1.10.4" - web3-providers-http "1.10.4" - web3-providers-ipc "1.10.4" - web3-providers-ws "1.10.4" - -web3-core-subscriptions@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz" - integrity sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.4" - -web3-core@^1.8.2, web3-core@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-core/-/web3-core-1.10.4.tgz" - integrity sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww== - dependencies: - "@types/bn.js" "^5.1.1" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-core-requestmanager "1.10.4" - web3-utils "1.10.4" - -web3-eth-abi@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz" - integrity sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.10.4" - -web3-eth-accounts@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz" - integrity sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg== - dependencies: - "@ethereumjs/common" "2.6.5" - "@ethereumjs/tx" "3.5.2" - "@ethereumjs/util" "^8.1.0" - eth-lib "0.2.8" - scrypt-js "^3.0.1" - uuid "^9.0.0" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-utils "1.10.4" - -web3-eth-contract@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz" - integrity sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A== - dependencies: - "@types/bn.js" "^5.1.1" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-core-promievent "1.10.4" - web3-core-subscriptions "1.10.4" - web3-eth-abi "1.10.4" - web3-utils "1.10.4" - -web3-eth-ens@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz" - integrity sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-promievent "1.10.4" - web3-eth-abi "1.10.4" - web3-eth-contract "1.10.4" - web3-utils "1.10.4" - -web3-eth-iban@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz" - integrity sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw== - dependencies: - bn.js "^5.2.1" - web3-utils "1.10.4" - -web3-eth-personal@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz" - integrity sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-net "1.10.4" - web3-utils "1.10.4" - -web3-eth@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.4.tgz" - integrity sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA== - dependencies: - web3-core "1.10.4" - web3-core-helpers "1.10.4" - web3-core-method "1.10.4" - web3-core-subscriptions "1.10.4" - web3-eth-abi "1.10.4" - web3-eth-accounts "1.10.4" - web3-eth-contract "1.10.4" - web3-eth-ens "1.10.4" - web3-eth-iban "1.10.4" - web3-eth-personal "1.10.4" - web3-net "1.10.4" - web3-utils "1.10.4" - -web3-net@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-net/-/web3-net-1.10.4.tgz" - integrity sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow== - dependencies: - web3-core "1.10.4" - web3-core-method "1.10.4" - web3-utils "1.10.4" - -web3-providers-http@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.4.tgz" - integrity sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ== - dependencies: - abortcontroller-polyfill "^1.7.5" - cross-fetch "^4.0.0" - es6-promise "^4.2.8" - web3-core-helpers "1.10.4" - -web3-providers-ipc@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz" - integrity sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.10.4" - -web3-providers-ws@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz" - integrity sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.10.4" - websocket "^1.0.32" - -web3-shh@1.10.4: - version "1.10.4" - resolved "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.4.tgz" - integrity sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw== - dependencies: - web3-core "1.10.4" - web3-core-method "1.10.4" - web3-core-subscriptions "1.10.4" - web3-net "1.10.4" - -web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6, web3-utils@^1.5.2, web3-utils@^1.8.2, web3-utils@1.10.4: +web3-utils@^1.3.6, web3-utils@^1.5.2: version "1.10.4" resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz" integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== @@ -8395,36 +6803,11 @@ web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6, web3-utils@^1.5.2, web3-utils@^1.8 randombytes "^2.1.0" utf8 "3.0.0" -web3@^1.8.2: - version "1.10.4" - resolved "https://registry.npmjs.org/web3/-/web3-1.10.4.tgz" - integrity sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA== - dependencies: - web3-bzz "1.10.4" - web3-core "1.10.4" - web3-eth "1.10.4" - web3-eth-personal "1.10.4" - web3-net "1.10.4" - web3-shh "1.10.4" - web3-utils "1.10.4" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" @@ -8444,17 +6827,12 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - which-module@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== @@ -8466,7 +6844,7 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@^1.1.1, which@^1.2.9, which@^1.3.1, which@1.3.1: +which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -8487,11 +6865,6 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== - word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" @@ -8515,14 +6888,6 @@ workerpool@6.2.1: resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" @@ -8553,70 +6918,26 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^7.4.6: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - ws@7.4.6: version "7.4.6" resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr@^2.0.4, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: +xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" @@ -8627,12 +6948,7 @@ y18n@^5.0.5: resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz" - integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -8642,7 +6958,7 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^13.1.2, yargs-parser@13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -8650,24 +6966,16 @@ yargs-parser@^13.1.2, yargs-parser@13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" @@ -8687,7 +6995,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@^13.3.0, yargs@13.3.2: +yargs@13.3.2, yargs@^13.3.0: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -8703,26 +7011,6 @@ yargs@^13.3.0, yargs@13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" - integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - yargs@16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"