diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..88753ab --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,50 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Install npm dependencies + run: | + npm install + id: npmi + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/.gitignore b/.gitignore index b743379..b271229 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,12 @@ cache artifacts .DS_Store -.idea/ \ No newline at end of file +.idea/ + +# crytic +crytic-export/ +echidna/ +medusa/ + +# python +venv/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9726790 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "lib/chimera"] + path = lib/chimera + url = https://github.com/recon-fuzz/chimera +[submodule "lib/properties"] + path = lib/properties + url = https://github.com/crytic/properties diff --git a/README.md b/README.md index 2110e47..8376db4 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,73 @@ # The Standard: Smart Vaults ## Installation +### Hardhat If you have npm installed, you can install the required project dependencies ``` npm install ``` +### Foundry +If you have Foundry installed, you can install the required project dependencies +``` +forge install +``` + ## Testing +### Hardhat If you are in root, you can run the project's full test suite ``` npx hardhat test ``` Since this project uses Hardhat, you can use its default ways to run tests, should you prefer it. + +### Foundry +``` +forge test +``` + ## Coverage +### Hardhat Run the code coverage suite with ``` npx hardhat coverage ``` +### Foundry +``` +forge coverage +``` + ## Contract size benchmark Run the contract sizer with ``` npx hardhat size-contracts ``` +## Format +Format using the forge formatter with +``` +forge fmt +``` + +## Gas Snapshots +Output gas usage snapshots with +``` +forge snapshot +``` + +## Anvil +Run a local chain with +``` +anvil +``` + +## Chisel +Open a Solidity REPL with +``` +chisel +``` + ## Documentation - [Testnet guide](docs/TESTNET) - [Deployed addresses](docs/addresses.json) diff --git a/contracts/PriceCalculator.sol b/contracts/PriceCalculator.sol index 4e95914..9da789c 100644 --- a/contracts/PriceCalculator.sol +++ b/contracts/PriceCalculator.sol @@ -5,10 +5,12 @@ import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol" as C import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "contracts/interfaces/IPriceCalculator.sol"; +import {console} from "forge-std/console.sol"; + contract PriceCalculator is IPriceCalculator { bytes32 private immutable NATIVE; - constructor (bytes32 _native) { + constructor(bytes32 _native) { NATIVE = _native; } @@ -19,13 +21,14 @@ contract PriceCalculator is IPriceCalculator { function tokenToUSD(ITokenManager.Token memory _token, uint256 _tokenValue) external view returns (uint256) { Chainlink.AggregatorV3Interface tokenUsdClFeed = Chainlink.AggregatorV3Interface(_token.clAddr); uint256 scaledCollateral = _tokenValue * 10 ** getTokenScaleDiff(_token.symbol, _token.addr); - (,int256 _tokenUsdPrice,,,) = tokenUsdClFeed.latestRoundData(); + (, int256 _tokenUsdPrice,,,) = tokenUsdClFeed.latestRoundData(); return scaledCollateral * uint256(_tokenUsdPrice) / 10 ** _token.clDec; } function USDToToken(ITokenManager.Token memory _token, uint256 _usdValue) external view returns (uint256) { Chainlink.AggregatorV3Interface tokenUsdClFeed = Chainlink.AggregatorV3Interface(_token.clAddr); (, int256 tokenUsdPrice,,,) = tokenUsdClFeed.latestRoundData(); - return _usdValue * 10 ** _token.clDec / uint256(tokenUsdPrice) / 10 ** getTokenScaleDiff(_token.symbol, _token.addr); + return _usdValue * 10 ** _token.clDec / uint256(tokenUsdPrice) + / 10 ** getTokenScaleDiff(_token.symbol, _token.addr); } -} \ No newline at end of file +} diff --git a/contracts/SmartVaultDeployerV4.sol b/contracts/SmartVaultDeployerV4.sol index 5ce9794..a125edf 100644 --- a/contracts/SmartVaultDeployerV4.sol +++ b/contracts/SmartVaultDeployerV4.sol @@ -5,7 +5,7 @@ import "contracts/SmartVaultV4.sol"; import "contracts/PriceCalculator.sol"; import "contracts/interfaces/ISmartVaultDeployer.sol"; -contract SmartVaultDeployerV4 is ISmartVaultDeployer { +contract SmartVaultDeployerV4 is ISmartVaultDeployer { bytes32 private immutable NATIVE; address private immutable priceCalculator; @@ -13,7 +13,7 @@ contract SmartVaultDeployerV4 is ISmartVaultDeployer { NATIVE = _native; priceCalculator = address(new PriceCalculator(_native)); } - + function deploy(address _manager, address _owner, address _usds) external returns (address) { return address(new SmartVaultV4(NATIVE, _manager, _owner, _usds, priceCalculator)); } diff --git a/contracts/SmartVaultIndex.sol b/contracts/SmartVaultIndex.sol index 3f8b108..e873af8 100644 --- a/contracts/SmartVaultIndex.sol +++ b/contracts/SmartVaultIndex.sol @@ -9,7 +9,7 @@ contract SmartVaultIndex is ISmartVaultIndex, Ownable { mapping(address => uint256[]) private tokenIds; mapping(uint256 => address payable) private vaultAddresses; - modifier onlyManager { + modifier onlyManager() { require(msg.sender == manager, "err-unauthorised"); _; } diff --git a/contracts/SmartVaultManagerV6.sol b/contracts/SmartVaultManagerV6.sol index cdd8791..71dde7a 100644 --- a/contracts/SmartVaultManagerV6.sol +++ b/contracts/SmartVaultManagerV6.sol @@ -17,9 +17,15 @@ import "contracts/interfaces/IUSDs.sol"; // TODO describe changes // TODO upgraded zz/zz/zz // -contract SmartVaultManagerV6 is ISmartVaultManager, ISmartVaultManagerV2, Initializable, ERC721Upgradeable, OwnableUpgradeable { +contract SmartVaultManagerV6 is + ISmartVaultManager, + ISmartVaultManagerV2, + Initializable, + ERC721Upgradeable, + OwnableUpgradeable +{ using SafeERC20 for IERC20; - + uint256 public constant HUNDRED_PC = 1e5; address public protocol; @@ -43,16 +49,32 @@ contract SmartVaultManagerV6 is ISmartVaultManager, ISmartVaultManagerV2, Initia event VaultLiquidated(address indexed vaultAddress); event VaultTransferred(uint256 indexed tokenId, address from, address to); - struct SmartVaultData { - uint256 tokenId; uint256 collateralRate; uint256 mintFeeRate; - uint256 burnFeeRate; ISmartVault.Status status; + struct SmartVaultData { + uint256 tokenId; + uint256 collateralRate; + uint256 mintFeeRate; + uint256 burnFeeRate; + ISmartVault.Status status; } function initialize( - uint256 _collateralRate, uint256 _feeRate, address _usds, address _protocol, address _liquidator, address _tokenManager, - address _smartVaultDeployer, address _smartVaultIndex, address _nftMetadataGenerator, address _yieldManager, uint16 _userVaultLimit, - address _swapRouter, address _weth - ) initializer public { + uint256 _collateralRate, + uint256 _feeRate, + address _usds, + address _protocol, + address _liquidator, + address _tokenManager, + address _smartVaultDeployer, + address _smartVaultIndex, + address _nftMetadataGenerator, + // address _yieldManager, + uint16 _userVaultLimit + ) + // address _swapRouter, + // address _weth + public + initializer + { __ERC721_init("The Standard Smart Vault Manager (USDs)", "TS-VAULTMAN-USDs"); __Ownable_init(); collateralRate = _collateralRate; @@ -66,13 +88,13 @@ contract SmartVaultManagerV6 is ISmartVaultManager, ISmartVaultManagerV2, Initia smartVaultDeployer = _smartVaultDeployer; smartVaultIndex = ISmartVaultIndex(_smartVaultIndex); nftMetadataGenerator = _nftMetadataGenerator; - yieldManager = _yieldManager; + // yieldManager = _yieldManager; userVaultLimit = _userVaultLimit; - swapRouter = _swapRouter; - weth = _weth; + // swapRouter = _swapRouter; + // weth = _weth; } - modifier onlyLiquidator { + modifier onlyLiquidator() { require(msg.sender == liquidator, "err-invalid-liquidator"); _; } @@ -129,42 +151,42 @@ contract SmartVaultManagerV6 is ISmartVaultManager, ISmartVaultManagerV2, Initia } function setBurnFeeRate(uint256 _rate) external onlyOwner { - burnFeeRate = _rate; + burnFeeRate = _rate; } function setSwapFeeRate(uint256 _rate) external onlyOwner { swapFeeRate = _rate; } - function setWethAddress(address _weth) external onlyOwner() { + function setWethAddress(address _weth) external onlyOwner { weth = _weth; } - function setSwapRouter(address _swapRouter) external onlyOwner() { + function setSwapRouter(address _swapRouter) external onlyOwner { swapRouter = _swapRouter; } - function setNFTMetadataGenerator(address _nftMetadataGenerator) external onlyOwner() { + function setNFTMetadataGenerator(address _nftMetadataGenerator) external onlyOwner { nftMetadataGenerator = _nftMetadataGenerator; } - function setSmartVaultDeployer(address _smartVaultDeployer) external onlyOwner() { + function setSmartVaultDeployer(address _smartVaultDeployer) external onlyOwner { smartVaultDeployer = _smartVaultDeployer; } - function setProtocolAddress(address _protocol) external onlyOwner() { + function setProtocolAddress(address _protocol) external onlyOwner { protocol = _protocol; } - function setLiquidatorAddress(address _liquidator) external onlyOwner() { + function setLiquidatorAddress(address _liquidator) external onlyOwner { liquidator = _liquidator; } - function setUserVaultLimit(uint16 _userVaultLimit) external onlyOwner() { + function setUserVaultLimit(uint16 _userVaultLimit) external onlyOwner { userVaultLimit = _userVaultLimit; } - function setYieldManager(address _yieldManager) external onlyOwner() { + function setYieldManager(address _yieldManager) external onlyOwner { yieldManager = _yieldManager; } @@ -175,4 +197,4 @@ contract SmartVaultManagerV6 is ISmartVaultManager, ISmartVaultManagerV2, Initia if (address(_from) != address(0)) ISmartVault(smartVaultIndex.getVaultAddress(_tokenId)).setOwner(_to); emit VaultTransferred(_tokenId, _from, _to); } -} \ No newline at end of file +} diff --git a/contracts/SmartVaultV4.sol b/contracts/SmartVaultV4.sol index c804322..14df82e 100644 --- a/contracts/SmartVaultV4.sol +++ b/contracts/SmartVaultV4.sol @@ -14,6 +14,8 @@ import "contracts/interfaces/ITokenManager.sol"; import "contracts/interfaces/IUSDs.sol"; import "contracts/interfaces/IWETH.sol"; +import {console} from "forge-std/console.sol"; + contract SmartVaultV4 is ISmartVault { using SafeERC20 for IERC20; @@ -29,7 +31,13 @@ contract SmartVaultV4 is ISmartVault { uint256 private minted; bool private liquidated; - struct YieldPair { address hypervisor; address token0; uint256 amount0; address token1; uint256 amount1; } + struct YieldPair { + address hypervisor; + address token0; + uint256 amount0; + address token1; + uint256 amount1; + } event CollateralRemoved(bytes32 symbol, uint256 amount, address to); event AssetRemoved(address token, uint256 amount, address to); @@ -52,12 +60,12 @@ contract SmartVaultV4 is ISmartVault { calculator = IPriceCalculator(_priceCalculator); } - modifier onlyVaultManager { + modifier onlyVaultManager() { if (msg.sender != manager) revert InvalidUser(); _; } - modifier onlyOwner { + modifier onlyOwner() { if (msg.sender != owner) revert InvalidUser(); _; } @@ -67,7 +75,7 @@ contract SmartVaultV4 is ISmartVault { _; } - modifier ifNotLiquidated { + modifier ifNotLiquidated() { if (liquidated) revert VaultLiquidated(); _; } @@ -101,7 +109,7 @@ contract SmartVaultV4 is ISmartVault { } } } - + function usdCollateral() private view returns (uint256 _usds) { ITokenManager tokenManager = ITokenManager(ISmartVaultManagerV3(manager).tokenManager()); ITokenManager.Token[] memory acceptedTokens = tokenManager.getAcceptedTokens(); @@ -135,8 +143,9 @@ contract SmartVaultV4 is ISmartVault { function status() external view returns (Status memory) { uint256 _collateral = usdCollateral(); - return Status(address(this), minted, maxMintable(_collateral), _collateral, - getAssets(), liquidated, version, vaultType); + return Status( + address(this), minted, maxMintable(_collateral), _collateral, getAssets(), liquidated, version, vaultType + ); } function undercollateralised() public view returns (bool) { @@ -151,7 +160,9 @@ contract SmartVaultV4 is ISmartVault { } function liquidateERC20(IERC20 _token) private { - if (_token.balanceOf(address(this)) != 0) _token.safeTransfer(ISmartVaultManagerV3(manager).protocol(), _token.balanceOf(address(this))); + if (_token.balanceOf(address(this)) != 0) { + _token.safeTransfer(ISmartVaultManagerV3(manager).protocol(), _token.balanceOf(address(this))); + } } function liquidate() external onlyVaultManager { @@ -159,7 +170,8 @@ contract SmartVaultV4 is ISmartVault { liquidated = true; minted = 0; liquidateNative(); - ITokenManager.Token[] memory tokens = ITokenManager(ISmartVaultManagerV3(manager).tokenManager()).getAcceptedTokens(); + ITokenManager.Token[] memory tokens = + ITokenManager(ISmartVaultManagerV3(manager).tokenManager()).getAcceptedTokens(); for (uint256 i = 0; i < tokens.length; i++) { if (tokens[i].symbol != NATIVE) liquidateERC20(IERC20(tokens[i].addr)); } @@ -216,9 +228,9 @@ contract SmartVaultV4 is ISmartVault { emit USDsBurned(_amount, fee); } - function getToken(bytes32 _symbol) private view returns (ITokenManager.Token memory _token) { - ITokenManager.Token[] memory tokens = ITokenManager(ISmartVaultManagerV3(manager).tokenManager()).getAcceptedTokens(); + ITokenManager.Token[] memory tokens = + ITokenManager(ISmartVaultManagerV3(manager).tokenManager()).getAcceptedTokens(); for (uint256 i = 0; i < tokens.length; i++) { if (tokens[i].symbol == _symbol) _token = tokens[i]; } @@ -247,33 +259,40 @@ contract SmartVaultV4 is ISmartVault { if (wethBalance > 0) weth.withdraw(wethBalance); } - function calculateMinimumAmountOut(bytes32 _inTokenSymbol, bytes32 _outTokenSymbol, uint256 _amount) private view returns (uint256) { + function calculateMinimumAmountOut(bytes32 _inTokenSymbol, bytes32 _outTokenSymbol, uint256 _amount) + private + view + returns (uint256) + { ISmartVaultManagerV3 _manager = ISmartVaultManagerV3(manager); uint256 requiredCollateralValue = minted * _manager.collateralRate() / _manager.HUNDRED_PC(); // add 1% min collateral buffer - uint256 collateralValueMinusSwapValue = usdCollateral() - calculator.tokenToUSD(getToken(_inTokenSymbol), _amount * 101 / 100); - return collateralValueMinusSwapValue >= requiredCollateralValue ? - 0 : calculator.USDToToken(getToken(_outTokenSymbol), requiredCollateralValue - collateralValueMinusSwapValue); + uint256 collateralValueMinusSwapValue = + usdCollateral() - calculator.tokenToUSD(getToken(_inTokenSymbol), _amount * 101 / 100); + return collateralValueMinusSwapValue >= requiredCollateralValue + ? 0 + : calculator.USDToToken(getToken(_outTokenSymbol), requiredCollateralValue - collateralValueMinusSwapValue); } function swap(bytes32 _inToken, bytes32 _outToken, uint256 _amount, uint256 _requestedMinOut) external onlyOwner { - uint256 swapFee = _amount * ISmartVaultManagerV3(manager).swapFeeRate() / ISmartVaultManagerV3(manager).HUNDRED_PC(); + uint256 swapFee = + _amount * ISmartVaultManagerV3(manager).swapFeeRate() / ISmartVaultManagerV3(manager).HUNDRED_PC(); address inToken = getTokenisedAddr(_inToken); uint256 minimumAmountOut = calculateMinimumAmountOut(_inToken, _outToken, _amount + swapFee); if (_requestedMinOut > minimumAmountOut) minimumAmountOut = _requestedMinOut; ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ - tokenIn: inToken, - tokenOut: getTokenisedAddr(_outToken), - fee: 3000, - recipient: address(this), - deadline: block.timestamp + 60, - amountIn: _amount - swapFee, - amountOutMinimum: minimumAmountOut, - sqrtPriceLimitX96: 0 - }); - inToken == ISmartVaultManagerV3(manager).weth() ? - executeNativeSwapAndFee(params, swapFee) : - executeERC20SwapAndFee(params, swapFee); + tokenIn: inToken, + tokenOut: getTokenisedAddr(_outToken), + fee: 3000, + recipient: address(this), + deadline: block.timestamp + 60, + amountIn: _amount - swapFee, + amountOutMinimum: minimumAmountOut, + sqrtPriceLimitX96: 0 + }); + inToken == ISmartVaultManagerV3(manager).weth() + ? executeNativeSwapAndFee(params, swapFee) + : executeERC20SwapAndFee(params, swapFee); } function addUniqueHypervisor(address _hypervisor) private { @@ -292,7 +311,11 @@ contract SmartVaultV4 is ISmartVault { } } - function significantCollateralDrop(uint256 _preCollateralValue, uint256 _postCollateralValue) private pure returns (bool) { + function significantCollateralDrop(uint256 _preCollateralValue, uint256 _postCollateralValue) + private + pure + returns (bool) + { return _postCollateralValue < 9 * _preCollateralValue / 10; } @@ -303,22 +326,29 @@ contract SmartVaultV4 is ISmartVault { if (_balance == 0) revert InvalidToken(); IERC20(_token).safeApprove(ISmartVaultManagerV3(manager).yieldManager(), _balance); uint256 _preDepositCollateral = usdCollateral(); - (address _hypervisor1, address _hypervisor2) = ISmartVaultYieldManager(ISmartVaultManagerV3(manager).yieldManager()).deposit(_token, _stablePercentage); + (address _hypervisor1, address _hypervisor2) = + ISmartVaultYieldManager(ISmartVaultManagerV3(manager).yieldManager()).deposit(_token, _stablePercentage); addUniqueHypervisor(_hypervisor1); if (_hypervisor2 != address(0)) addUniqueHypervisor(_hypervisor2); - if (undercollateralised() || significantCollateralDrop(_preDepositCollateral, usdCollateral())) revert Undercollateralised(); + if (undercollateralised() || significantCollateralDrop(_preDepositCollateral, usdCollateral())) { + revert Undercollateralised(); + } } function withdrawYield(address _hypervisor, bytes32 _symbol) external onlyOwner { address _token = getTokenisedAddr(_symbol); - IERC20(_hypervisor).safeApprove(ISmartVaultManagerV3(manager).yieldManager(), IERC20(_hypervisor).balanceOf(address(this))); + IERC20(_hypervisor).safeApprove( + ISmartVaultManagerV3(manager).yieldManager(), IERC20(_hypervisor).balanceOf(address(this)) + ); uint256 _preWithdrawCollateral = usdCollateral(); ISmartVaultYieldManager(ISmartVaultManagerV3(manager).yieldManager()).withdraw(_hypervisor, _token); removeHypervisor(_hypervisor); if (_symbol == NATIVE) { IWETH(_token).withdraw(getAssetBalance(_token)); } - if (undercollateralised() || significantCollateralDrop(_preWithdrawCollateral, usdCollateral())) revert Undercollateralised(); + if (undercollateralised() || significantCollateralDrop(_preWithdrawCollateral, usdCollateral())) { + revert Undercollateralised(); + } } function yieldAssets() external view returns (YieldPair[] memory _yieldPairs) { diff --git a/contracts/SmartVaultYieldManager.sol b/contracts/SmartVaultYieldManager.sol index 4e2b85e..3733971 100644 --- a/contracts/SmartVaultYieldManager.sol +++ b/contracts/SmartVaultYieldManager.sol @@ -2,13 +2,28 @@ pragma solidity 0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "contracts/uniswap/FullMath.sol"; +import "contracts/uniswap/PoolAddress.sol"; import "contracts/interfaces/IHypervisor.sol"; +import "contracts/interfaces/IPeripheryImmutableState.sol"; import "contracts/interfaces/ISmartVaultYieldManager.sol"; import "contracts/interfaces/ISmartVaultManager.sol"; import "contracts/interfaces/ISwapRouter.sol"; import "contracts/interfaces/IUniProxy.sol"; +import "contracts/interfaces/IUniswapV3Pool.sol"; import "contracts/interfaces/IWETH.sol"; +import "contracts/interfaces/IPeripheryImmutableState.sol"; +import "contracts/interfaces/IUniswapV3Pool.sol"; + +import {PoolAddress} from "contracts/uniswap/PoolAddress.sol"; +import {FullMath} from "contracts/uniswap/FullMath.sol"; +import {IPeripheryImmutableState} from "contracts/interfaces/IPeripheryImmutableState.sol"; +import {IUniswapV3Pool} from "contracts/interfaces/IUniswapV3Pool.sol"; + +import {console} from "forge-std/console.sol"; contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { using SafeERC20 for IERC20; @@ -27,16 +42,30 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { uint256 public feeRate; mapping(address => HypervisorData) private hypervisorData; - struct HypervisorData { address hypervisor; uint24 poolFee; bytes pathToUSDC; bytes pathFromUSDC; } + struct HypervisorData { + address hypervisor; + uint24 poolFee; + bytes pathToUSDC; + bytes pathFromUSDC; + } event Deposit(address indexed smartVault, address indexed token, uint256 amount, uint256 usdPercentage); event Withdraw(address indexed smartVault, address indexed token, address hypervisor, uint256 amount); + error RatioError(); error StablePoolPercentageError(); error HypervisorDataError(); error IncompatibleHypervisor(); - constructor(address _USDs, address _USDC, address _WETH, address _uniProxy, address _ramsesRouter, address _usdsHypervisor, address _uniswapRouter) { + constructor( + address _USDs, + address _USDC, + address _WETH, + address _uniProxy, + address _ramsesRouter, + address _usdsHypervisor, + address _uniswapRouter + ) { USDs = _USDs; USDC = _USDC; WETH = _WETH; @@ -50,96 +79,159 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { return IERC20(_token).balanceOf(address(this)); } - function _withinRatio(uint256 _tokenBBalance, uint256 _requiredStart, uint256 _requiredEnd) private pure returns (bool) { + function _withinRatio(uint256 _tokenBBalance, uint256 _requiredStart, uint256 _requiredEnd) + private + pure + returns (bool) + { return _tokenBBalance >= _requiredStart && _tokenBBalance <= _requiredEnd; } function _swapToRatio(address _tokenA, address _hypervisor, address _swapRouter, uint24 _fee) private { - address _tokenB = _tokenA == IHypervisor(_hypervisor).token0() ? - IHypervisor(_hypervisor).token1() : IHypervisor(_hypervisor).token0(); + address _token0 = IHypervisor(_hypervisor).token0(); + address _token1 = IHypervisor(_hypervisor).token1(); + + address _tokenB = _tokenA == _token0 ? _token1 : _token0; + + uint160 _sqrtPriceX96; + { + PoolAddress.PoolKey memory poolKey = PoolAddress.getPoolKey(_token0, _token1, _fee); + address factory = IPeripheryImmutableState(_swapRouter).factory(); + (_sqrtPriceX96,,,,,,) = _swapRouter == uniswapRouter + ? IUniswapV3Pool(PoolAddress.computeAddressUniswap(factory, poolKey)).slot0() + : IUniswapV3Pool(PoolAddress.computeAddressRamses(factory, poolKey)).slot0(); + } + + uint256 _midRatio; + { + (uint256 _amountStart, uint256 _amountEnd) = + IUniProxy(uniProxy).getDepositAmount(_hypervisor, _tokenA, _thisBalanceOf(_tokenA)); + if (_withinRatio(_thisBalanceOf(_tokenB), _amountStart, _amountEnd)) return; + + _midRatio = (_amountStart + _amountEnd) / 2; + } + + bool _tokenAIs0 = _tokenA == _token0; uint256 _tokenBBalance = _thisBalanceOf(_tokenB); - (uint256 _amountStart, uint256 _amountEnd) = IUniProxy(uniProxy).getDepositAmount(_hypervisor, _tokenA, _thisBalanceOf(_tokenA)); - uint256 _divisor = 2; - bool _tokenBTooLarge; - for (uint256 index = 0; index < 20; index++) { - if (_withinRatio(_tokenBBalance, _amountStart, _amountEnd)) break; - uint256 _midRatio = (_amountStart + _amountEnd) / 2; - if (_tokenBBalance < _midRatio) { - if (_tokenBTooLarge) { - _divisor++; - _tokenBTooLarge = false; - } - IERC20(_tokenA).safeApprove(_swapRouter, _thisBalanceOf(_tokenA)); - try ISwapRouter(_swapRouter).exactOutputSingle(ISwapRouter.ExactOutputSingleParams({ - tokenIn: _tokenA, - tokenOut: _tokenB, + uint256 _tokenABalance = _thisBalanceOf(_tokenA); + + uint256 _amountIn; + uint256 _amountOut; + + // Push _fee back on to the stack + uint24 _fee = _fee; + + { + uint256 aDec = ERC20(_tokenA).decimals(); + uint256 bDec = ERC20(_tokenB).decimals(); + + uint256 price36; + { + uint256 priceX192 = uint256(_sqrtPriceX96) * _sqrtPriceX96; + price36 = _tokenAIs0 + ? FullMath.mulDiv((10 ** aDec) * (10 ** (36 - bDec)), 1 << 192, priceX192) + : FullMath.mulDiv((10 ** bDec) * (10 ** (36 - aDec)), priceX192, 1 << 192); + } + + uint256 _ratio = + FullMath.mulDiv(_tokenABalance * (10 ** (36 - aDec)), 1e36, _midRatio * (10 ** (36 - bDec))); + uint256 _rb = FullMath.mulDiv(_tokenBBalance * (10 ** (36 - bDec)), _ratio, 1e36); + + if (_tokenABalance * (10 ** (36 - aDec)) > _rb) { + // a -> b + + uint256 _denominator = + 1e36 + FullMath.mulDiv(_ratio - FullMath.mulDiv(_ratio, _fee, 1e6), 1e36, price36); + // a - rb / (1 + (1-f) * ratio / price) + _amountIn = + FullMath.mulDiv(_tokenABalance * (10 ** (36 - aDec)) - _rb, 1e36, _denominator) / 10 ** (36 - aDec); + } else { + // b -> a + + uint256 _denominator = + 1e36 + FullMath.mulDiv(_ratio, 1e36, price36 + FullMath.mulDiv(price36, _fee, 1e6)); + // rb - a / (1 + ratio / ((1+f) * price)) + _amountOut = + FullMath.mulDiv(_rb - _tokenABalance * (10 ** (36 - aDec)), 1e36, _denominator) / 10 ** (36 - aDec); + } + } + + if (_tokenBBalance < _midRatio) { + // we want more tokenB + + address _tokenIn = _tokenAIs0 ? _token0 : _token1; + address _tokenOut = _tokenAIs0 ? _token1 : _token0; + + IERC20(_tokenIn).safeApprove(_swapRouter, _tokenABalance); + ISwapRouter(_swapRouter).exactInputSingle( + ISwapRouter.ExactInputSingleParams({ + tokenIn: _tokenIn, + tokenOut: _tokenOut, fee: _fee, recipient: address(this), - deadline: block.timestamp + 60, - amountOut: (_midRatio - _tokenBBalance) / _divisor, - amountInMaximum: _thisBalanceOf(_tokenA), + deadline: block.timestamp, + amountIn: _amountIn, + amountOutMinimum: 0, sqrtPriceLimitX96: 0 - })) returns (uint256) {} catch { - _divisor++; - } - IERC20(_tokenA).safeApprove(_swapRouter, 0); - } else { - if (!_tokenBTooLarge) { - _divisor++; - _tokenBTooLarge = true; - } - IERC20(_tokenB).safeApprove(_swapRouter, (_tokenBBalance - _midRatio) / _divisor); - try ISwapRouter(_swapRouter).exactInputSingle(ISwapRouter.ExactInputSingleParams({ - tokenIn: _tokenB, - tokenOut: _tokenA, + }) + ); + IERC20(_tokenIn).safeApprove(_swapRouter, 0); + } else { + // we want more tokenA + + address _tokenIn = _tokenAIs0 ? _token1 : _token0; + address _tokenOut = _tokenAIs0 ? _token0 : _token1; + + IERC20(_tokenIn).safeApprove(_swapRouter, _tokenBBalance); + ISwapRouter(_swapRouter).exactOutputSingle( + ISwapRouter.ExactOutputSingleParams({ + tokenIn: _tokenIn, + tokenOut: _tokenOut, fee: _fee, recipient: address(this), - deadline: block.timestamp + 60, - amountIn: (_tokenBBalance - _midRatio) / _divisor, - amountOutMinimum: 0, + deadline: block.timestamp, + amountOut: _amountOut, + amountInMaximum: _tokenBBalance, sqrtPriceLimitX96: 0 - })) returns (uint256) {} catch { - _divisor++; - } - IERC20(_tokenB).safeApprove(_swapRouter, 0); - } - _tokenBBalance = _thisBalanceOf(_tokenB); - (_amountStart, _amountEnd) = IUniProxy(uniProxy).getDepositAmount(_hypervisor, _tokenA, _thisBalanceOf(_tokenA)); + }) + ); + IERC20(_tokenIn).safeApprove(_swapRouter, 0); } - - if (!_withinRatio(_tokenBBalance, _amountStart, _amountEnd)) revert RatioError(); } function _swapToSingleAsset(address _hypervisor, address _wantedToken, address _swapRouter, uint24 _fee) private { address _token0 = IHypervisor(_hypervisor).token0(); - address _unwantedToken = IHypervisor(_hypervisor).token0() == _wantedToken ? - IHypervisor(_hypervisor).token1() : - _token0; + address _unwantedToken = + IHypervisor(_hypervisor).token0() == _wantedToken ? IHypervisor(_hypervisor).token1() : _token0; uint256 _balance = _thisBalanceOf(_unwantedToken); IERC20(_unwantedToken).safeApprove(_swapRouter, _balance); - ISwapRouter(_swapRouter).exactInputSingle(ISwapRouter.ExactInputSingleParams({ - tokenIn: _unwantedToken, - tokenOut: _wantedToken, - fee: _fee, - recipient: address(this), - deadline: block.timestamp + 60, - amountIn: _balance, - amountOutMinimum: 0, - sqrtPriceLimitX96: 0 - })); + ISwapRouter(_swapRouter).exactInputSingle( + ISwapRouter.ExactInputSingleParams({ + tokenIn: _unwantedToken, + tokenOut: _wantedToken, + fee: _fee, + recipient: address(this), + deadline: block.timestamp + 60, + amountIn: _balance, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }) + ); IERC20(_unwantedToken).safeApprove(_swapRouter, 0); } function _swapToUSDC(address _collateralToken, uint256 _usdPercentage, bytes memory _pathToUSDC) private { uint256 _usdYieldPortion = _thisBalanceOf(_collateralToken) * _usdPercentage / HUNDRED_PC; IERC20(_collateralToken).safeApprove(uniswapRouter, _usdYieldPortion); - ISwapRouter(uniswapRouter).exactInput(ISwapRouter.ExactInputParams({ - path: _pathToUSDC, - recipient: address(this), - deadline: block.timestamp + 60, - amountIn: _usdYieldPortion, - amountOutMinimum: 1 - })); + ISwapRouter(uniswapRouter).exactInput( + ISwapRouter.ExactInputParams({ + path: _pathToUSDC, + recipient: address(this), + deadline: block.timestamp + 60, + amountIn: _usdYieldPortion, + amountOutMinimum: 1 + }) + ); IERC20(_collateralToken).safeApprove(uniswapRouter, 0); } @@ -148,7 +240,13 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { address _token1 = IHypervisor(_hypervisor).token1(); IERC20(_token0).safeApprove(_hypervisor, _thisBalanceOf(_token0)); IERC20(_token1).safeApprove(_hypervisor, _thisBalanceOf(_token1)); - IUniProxy(uniProxy).deposit(_thisBalanceOf(_token0), _thisBalanceOf(_token1), msg.sender, _hypervisor, [uint256(0),uint256(0),uint256(0),uint256(0)]); + IUniProxy(uniProxy).deposit( + _thisBalanceOf(_token0), + _thisBalanceOf(_token1), + msg.sender, + _hypervisor, + [uint256(0), uint256(0), uint256(0), uint256(0)] + ); IERC20(_token0).safeApprove(_hypervisor, 0); IERC20(_token1).safeApprove(_hypervisor, 0); } @@ -164,7 +262,10 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { _deposit(_hypervisorData.hypervisor); } - function deposit(address _collateralToken, uint256 _usdPercentage) external returns (address _hypervisor0, address _hypervisor1) { + function deposit(address _collateralToken, uint256 _usdPercentage) + external + returns (address _hypervisor0, address _hypervisor1) + { if (_usdPercentage < MIN_USDS_PERCENTAGE) revert StablePoolPercentageError(); uint256 _balance = IERC20(_collateralToken).balanceOf(address(msg.sender)); IERC20(_collateralToken).safeTransferFrom(msg.sender, address(this), _balance); @@ -183,18 +284,22 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { bytes memory _pathFromUSDC = hypervisorData[_token].pathFromUSDC; uint256 _balance = _thisBalanceOf(USDC); IERC20(USDC).safeApprove(uniswapRouter, _balance); - ISwapRouter(uniswapRouter).exactInput(ISwapRouter.ExactInputParams({ - path: _pathFromUSDC, - recipient: address(this), - deadline: block.timestamp + 60, - amountIn: _balance, - amountOutMinimum: 0 - })); + ISwapRouter(uniswapRouter).exactInput( + ISwapRouter.ExactInputParams({ + path: _pathFromUSDC, + recipient: address(this), + deadline: block.timestamp + 60, + amountIn: _balance, + amountOutMinimum: 0 + }) + ); IERC20(USDs).safeApprove(uniswapRouter, 0); } function _withdrawUSDsDeposit(address _hypervisor, address _token) private { - IHypervisor(_hypervisor).withdraw(_thisBalanceOf(_hypervisor), address(this), address(this), [uint256(0),uint256(0),uint256(0),uint256(0)]); + IHypervisor(_hypervisor).withdraw( + _thisBalanceOf(_hypervisor), address(this), address(this), [uint256(0), uint256(0), uint256(0), uint256(0)] + ); _swapToSingleAsset(usdsHypervisor, USDC, ramsesRouter, 500); _sellUSDC(_token); } @@ -202,15 +307,17 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { function _withdrawOtherDeposit(address _hypervisor, address _token) private { HypervisorData memory _hypervisorData = hypervisorData[_token]; if (_hypervisorData.hypervisor != _hypervisor) revert IncompatibleHypervisor(); - IHypervisor(_hypervisor).withdraw(_thisBalanceOf(_hypervisor), address(this), address(this), [uint256(0),uint256(0),uint256(0),uint256(0)]); + IHypervisor(_hypervisor).withdraw( + _thisBalanceOf(_hypervisor), address(this), address(this), [uint256(0), uint256(0), uint256(0), uint256(0)] + ); _swapToSingleAsset(_hypervisor, _token, uniswapRouter, _hypervisorData.poolFee); } function withdraw(address _hypervisor, address _token) external { IERC20(_hypervisor).safeTransferFrom(msg.sender, address(this), IERC20(_hypervisor).balanceOf(msg.sender)); - _hypervisor == usdsHypervisor ? - _withdrawUSDsDeposit(_hypervisor, _token) : - _withdrawOtherDeposit(_hypervisor, _token); + _hypervisor == usdsHypervisor + ? _withdrawUSDsDeposit(_hypervisor, _token) + : _withdrawOtherDeposit(_hypervisor, _token); uint256 _withdrawn = _thisBalanceOf(_token); uint256 _fee = _withdrawn * feeRate / HUNDRED_PC; _withdrawn = _withdrawn - _fee; @@ -219,14 +326,20 @@ contract SmartVaultYieldManager is ISmartVaultYieldManager, Ownable { emit Withdraw(msg.sender, _token, _hypervisor, _withdrawn); } - function addHypervisorData(address _collateralToken, address _hypervisor, uint24 _poolFee, bytes memory _pathToUSDC, bytes memory _pathFromUSDC) external onlyOwner { + function addHypervisorData( + address _collateralToken, + address _hypervisor, + uint24 _poolFee, + bytes memory _pathToUSDC, + bytes memory _pathFromUSDC + ) external onlyOwner { hypervisorData[_collateralToken] = HypervisorData(_hypervisor, _poolFee, _pathToUSDC, _pathFromUSDC); } function removeHypervisorData(address _collateralToken) external onlyOwner { delete hypervisorData[_collateralToken]; } - + function setFeeData(uint256 _feeRate, address _smartVaultManager) external onlyOwner { feeRate = _feeRate; smartVaultManager = _smartVaultManager; diff --git a/contracts/TokenManager.sol b/contracts/TokenManager.sol index 2683b77..f08bc78 100644 --- a/contracts/TokenManager.sol +++ b/contracts/TokenManager.sol @@ -12,12 +12,15 @@ contract TokenManager is ITokenManager, Ownable { Token[] private acceptedTokens; error TokenExists(bytes32 symbol, address token); + event TokenAdded(bytes32 symbol, address token); event TokenRemoved(bytes32 symbol); constructor(bytes32 _native, address _clNativeUsd) { NATIVE = _native; - acceptedTokens.push(Token(NATIVE, address(0), 18, _clNativeUsd, Chainlink.AggregatorV3Interface(_clNativeUsd).decimals())); + acceptedTokens.push( + Token(NATIVE, address(0), 18, _clNativeUsd, Chainlink.AggregatorV3Interface(_clNativeUsd).decimals()) + ); } function getAcceptedTokens() external view returns (Token[] memory) { @@ -25,18 +28,24 @@ contract TokenManager is ITokenManager, Ownable { } function getToken(bytes32 _symbol) external view returns (Token memory token) { - for (uint256 i = 0; i < acceptedTokens.length; i++) if (acceptedTokens[i].symbol == _symbol) token = acceptedTokens[i]; + for (uint256 i = 0; i < acceptedTokens.length; i++) { + if (acceptedTokens[i].symbol == _symbol) token = acceptedTokens[i]; + } require(token.symbol == _symbol, "err-invalid-token"); } function getTokenIfExists(address _tokenAddr) external view returns (Token memory token) { - for (uint256 i = 0; i < acceptedTokens.length; i++) if (acceptedTokens[i].addr == _tokenAddr) token = acceptedTokens[i]; + for (uint256 i = 0; i < acceptedTokens.length; i++) { + if (acceptedTokens[i].addr == _tokenAddr) token = acceptedTokens[i]; + } } function addAcceptedToken(address _token, address _chainlinkFeed) external onlyOwner { ERC20 token = ERC20(_token); bytes32 symbol = bytes32(bytes(token.symbol())); - for (uint256 i = 0; i < acceptedTokens.length; i++) if (acceptedTokens[i].symbol == symbol) revert TokenExists(symbol, _token); + for (uint256 i = 0; i < acceptedTokens.length; i++) { + if (acceptedTokens[i].symbol == symbol) revert TokenExists(symbol, _token); + } Chainlink.AggregatorV3Interface dataFeed = Chainlink.AggregatorV3Interface(_chainlinkFeed); acceptedTokens.push(Token(symbol, _token, token.decimals(), _chainlinkFeed, dataFeed.decimals())); emit TokenAdded(symbol, _token); diff --git a/contracts/interfaces/IClearing.sol b/contracts/interfaces/IClearing.sol new file mode 100644 index 0000000..bfc1740 --- /dev/null +++ b/contracts/interfaces/IClearing.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +interface IClearing { + function owner() external view returns (address); + function addPosition(address pos, uint8 version) external; + function setTwapCheck(bool check) external; +} diff --git a/contracts/interfaces/IHypervisor.sol b/contracts/interfaces/IHypervisor.sol index 21c2fd0..e9972f0 100644 --- a/contracts/interfaces/IHypervisor.sol +++ b/contracts/interfaces/IHypervisor.sol @@ -7,18 +7,23 @@ interface IHypervisor is IERC20 { function token0() external view returns (address); function token1() external view returns (address); function getTotalAmounts() external view returns (uint256 total0, uint256 total1); - function deposit( - uint256 deposit0, - uint256 deposit1, - address to, - address from, - uint256[4] memory inMin - ) external returns (uint256 shares); + function deposit(uint256 deposit0, uint256 deposit1, address to, address from, uint256[4] memory inMin) + external + returns (uint256 shares); - function withdraw( - uint256 shares, - address to, - address from, - uint256[4] memory minAmounts - ) external returns (uint256 amount0, uint256 amount1); -} \ No newline at end of file + function withdraw(uint256 shares, address to, address from, uint256[4] memory minAmounts) + external + returns (uint256 amount0, uint256 amount1); + + function rebalance( + int24 baseLower, + int24 baseUpper, + int24 limitLower, + int24 limitUpper, + address feeRecipient, + uint256[4] memory baseFees, + uint256[4] memory limitFees + ) external; + + function setWhitelist(address _address) external; +} diff --git a/contracts/interfaces/INFTMetadataGenerator.sol b/contracts/interfaces/INFTMetadataGenerator.sol index 3d3ddb5..e78e54a 100644 --- a/contracts/interfaces/INFTMetadataGenerator.sol +++ b/contracts/interfaces/INFTMetadataGenerator.sol @@ -4,5 +4,8 @@ pragma solidity 0.8.17; import "contracts/interfaces/ISmartVault.sol"; interface INFTMetadataGenerator { - function generateNFTMetadata(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) external view returns (string memory); -} \ No newline at end of file + function generateNFTMetadata(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) + external + view + returns (string memory); +} diff --git a/contracts/interfaces/IPeripheryImmutableState.sol b/contracts/interfaces/IPeripheryImmutableState.sol new file mode 100644 index 0000000..62944fd --- /dev/null +++ b/contracts/interfaces/IPeripheryImmutableState.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity >=0.5.0; + +/// @title Immutable state +/// @notice Functions that return immutable state of the router +interface IPeripheryImmutableState { + /// @return Returns the address of the Uniswap V3 factory + function factory() external view returns (address); +} diff --git a/contracts/interfaces/IPriceCalculator.sol b/contracts/interfaces/IPriceCalculator.sol index 583932a..31c3cc5 100644 --- a/contracts/interfaces/IPriceCalculator.sol +++ b/contracts/interfaces/IPriceCalculator.sol @@ -6,4 +6,4 @@ import "contracts/interfaces/ITokenManager.sol"; interface IPriceCalculator { function tokenToUSD(ITokenManager.Token memory _token, uint256 _amount) external view returns (uint256); function USDToToken(ITokenManager.Token memory _token, uint256 _amount) external view returns (uint256); -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVault.sol b/contracts/interfaces/ISmartVault.sol index 78cb52a..c8b54a1 100644 --- a/contracts/interfaces/ISmartVault.sol +++ b/contracts/interfaces/ISmartVault.sol @@ -4,14 +4,25 @@ pragma solidity 0.8.17; import "contracts/interfaces/ITokenManager.sol"; interface ISmartVault { - struct Asset { ITokenManager.Token token; uint256 amount; uint256 collateralValue; } - struct Status { - address vaultAddress; uint256 minted; uint256 maxMintable; uint256 totalCollateralValue; - Asset[] collateral; bool liquidated; uint8 version; bytes32 vaultType; + struct Asset { + ITokenManager.Token token; + uint256 amount; + uint256 collateralValue; + } + + struct Status { + address vaultAddress; + uint256 minted; + uint256 maxMintable; + uint256 totalCollateralValue; + Asset[] collateral; + bool liquidated; + uint8 version; + bytes32 vaultType; } function status() external view returns (Status memory); function undercollateralised() external view returns (bool); function setOwner(address _newOwner) external; function liquidate() external; -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVaultDeployer.sol b/contracts/interfaces/ISmartVaultDeployer.sol index 7bb3045..c186a76 100644 --- a/contracts/interfaces/ISmartVaultDeployer.sol +++ b/contracts/interfaces/ISmartVaultDeployer.sol @@ -3,4 +3,4 @@ pragma solidity 0.8.17; interface ISmartVaultDeployer { function deploy(address _manager, address _owner, address _usds) external returns (address); -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVaultIndex.sol b/contracts/interfaces/ISmartVaultIndex.sol index 5c7946e..6db437c 100644 --- a/contracts/interfaces/ISmartVaultIndex.sol +++ b/contracts/interfaces/ISmartVaultIndex.sol @@ -6,4 +6,4 @@ interface ISmartVaultIndex { function getVaultAddress(uint256 _tokenId) external view returns (address payable); function addVaultAddress(uint256 _tokenId, address payable _vault) external; function transferTokenId(address _from, address _to, uint256 _tokenId) external; -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVaultManager.sol b/contracts/interfaces/ISmartVaultManager.sol index 1303206..8d5ce10 100644 --- a/contracts/interfaces/ISmartVaultManager.sol +++ b/contracts/interfaces/ISmartVaultManager.sol @@ -8,4 +8,4 @@ interface ISmartVaultManager { function burnFeeRate() external view returns (uint256); function mintFeeRate() external view returns (uint256); function collateralRate() external view returns (uint256); -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVaultManagerV2.sol b/contracts/interfaces/ISmartVaultManagerV2.sol index 1e2ea97..128518e 100644 --- a/contracts/interfaces/ISmartVaultManagerV2.sol +++ b/contracts/interfaces/ISmartVaultManagerV2.sol @@ -5,4 +5,4 @@ interface ISmartVaultManagerV2 { function weth() external view returns (address); function swapRouter() external view returns (address); function swapFeeRate() external view returns (uint256); -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVaultManagerV3.sol b/contracts/interfaces/ISmartVaultManagerV3.sol index d3ec482..9a5e4b3 100644 --- a/contracts/interfaces/ISmartVaultManagerV3.sol +++ b/contracts/interfaces/ISmartVaultManagerV3.sol @@ -6,4 +6,4 @@ import "contracts/interfaces/ISmartVaultManagerV2.sol"; interface ISmartVaultManagerV3 is ISmartVaultManagerV2, ISmartVaultManager { function yieldManager() external view returns (address); -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISmartVaultYieldManager.sol b/contracts/interfaces/ISmartVaultYieldManager.sol index 34e2a77..1e505a3 100644 --- a/contracts/interfaces/ISmartVaultYieldManager.sol +++ b/contracts/interfaces/ISmartVaultYieldManager.sol @@ -2,6 +2,8 @@ pragma solidity 0.8.17; interface ISmartVaultYieldManager { - function deposit(address _collateralToken, uint256 _usdPercentage) external returns (address vault0, address vault1); + function deposit(address _collateralToken, uint256 _usdPercentage) + external + returns (address vault0, address vault1); function withdraw(address _vault, address _token) external; -} \ No newline at end of file +} diff --git a/contracts/interfaces/ISwapRouter.sol b/contracts/interfaces/ISwapRouter.sol index bca6e1c..a903691 100644 --- a/contracts/interfaces/ISwapRouter.sol +++ b/contracts/interfaces/ISwapRouter.sol @@ -12,7 +12,7 @@ interface ISwapRouter { uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } - + struct ExactInputParams { bytes path; address recipient; diff --git a/contracts/interfaces/ITokenManager.sol b/contracts/interfaces/ITokenManager.sol index bf97b76..30ab47a 100644 --- a/contracts/interfaces/ITokenManager.sol +++ b/contracts/interfaces/ITokenManager.sol @@ -2,11 +2,17 @@ pragma solidity 0.8.17; interface ITokenManager { - struct Token { bytes32 symbol; address addr; uint8 dec; address clAddr; uint8 clDec; } + struct Token { + bytes32 symbol; + address addr; + uint8 dec; + address clAddr; + uint8 clDec; + } function getAcceptedTokens() external view returns (Token[] memory); function getToken(bytes32 _symbol) external view returns (Token memory); function getTokenIfExists(address _tokenAddr) external view returns (Token memory); -} \ No newline at end of file +} diff --git a/contracts/interfaces/IUSDs.sol b/contracts/interfaces/IUSDs.sol index 5249e75..b8d821c 100644 --- a/contracts/interfaces/IUSDs.sol +++ b/contracts/interfaces/IUSDs.sol @@ -9,4 +9,4 @@ interface IUSDs is IERC20, IAccessControl { function BURNER_ROLE() external view returns (bytes32); function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; -} \ No newline at end of file +} diff --git a/contracts/interfaces/IUniProxy.sol b/contracts/interfaces/IUniProxy.sol index 8ef6cf2..9977a6b 100644 --- a/contracts/interfaces/IUniProxy.sol +++ b/contracts/interfaces/IUniProxy.sol @@ -2,6 +2,11 @@ pragma solidity 0.8.17; interface IUniProxy { - function getDepositAmount(address pos, address token, uint256 _deposit) external view returns (uint256 amountStart, uint256 amountEnd); - function deposit(uint256 deposit0, uint256 deposit1, address to, address pos, uint256[4] memory minIn) external returns (uint256 shares); -} \ No newline at end of file + function getDepositAmount(address pos, address token, uint256 _deposit) + external + view + returns (uint256 amountStart, uint256 amountEnd); + function deposit(uint256 deposit0, uint256 deposit1, address to, address pos, uint256[4] memory minIn) + external + returns (uint256 shares); +} diff --git a/contracts/interfaces/IUniswapV3Factory.sol b/contracts/interfaces/IUniswapV3Factory.sol new file mode 100644 index 0000000..e6e8843 --- /dev/null +++ b/contracts/interfaces/IUniswapV3Factory.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +interface IUniswapV3Factory { + function createPool(address tokenA, address tokenB, uint24 fee) external returns (address pool); +} diff --git a/contracts/interfaces/IUniswapV3Pool.sol b/contracts/interfaces/IUniswapV3Pool.sol new file mode 100644 index 0000000..0f08d5e --- /dev/null +++ b/contracts/interfaces/IUniswapV3Pool.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +interface IUniswapV3Pool { + function slot0() + external + view + returns ( + uint160 sqrtPriceX96, + int24 tick, + uint16 observationIndex, + uint16 observationCardinality, + uint16 observationCardinalityNext, + uint8 feeProtocol, + bool unlocked + ); + + function initialize(uint160 sqrtPriceX96) external; + + function mint(address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data) + external + returns (uint256 amount0, uint256 amount1); + + function tickSpacing() external view returns (int24); + + function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external; +} diff --git a/contracts/interfaces/IWETH.sol b/contracts/interfaces/IWETH.sol index b800463..5fc998b 100644 --- a/contracts/interfaces/IWETH.sol +++ b/contracts/interfaces/IWETH.sol @@ -6,4 +6,4 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint256) external; -} \ No newline at end of file +} diff --git a/contracts/nfts/DefGenerator.sol b/contracts/nfts/DefGenerator.sol index fddad9d..37b20ff 100644 --- a/contracts/nfts/DefGenerator.sol +++ b/contracts/nfts/DefGenerator.sol @@ -1,95 +1,131 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.17; +// // SPDX-License-Identifier: UNLICENSED +// pragma solidity 0.8.17; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "contracts/nfts/NFTUtils.sol"; +// import "@openzeppelin/contracts/utils/Strings.sol"; +// import "contracts/nfts/NFTUtils.sol"; -contract DefGenerator { - using Strings for uint256; - using Strings for uint16; +// contract DefGenerator { +// using Strings for uint256; +// using Strings for uint16; - struct Gradient { bytes32 colour1; bytes32 colour2; bytes32 colour3; } +// struct Gradient { +// bytes32 colour1; +// bytes32 colour2; +// bytes32 colour3; +// } - function getGradient(uint256 _tokenId) private pure returns (Gradient memory) { - bytes32[25] memory colours = [ - bytes32("#FF69B4"), bytes32("#9B00FF"), bytes32("#00FFFF"), bytes32("#0000FF"), bytes32("#333333"), bytes32("#FFD700"), bytes32("#00FFFF"), - bytes32("#9B00FF"), bytes32("#C0C0C0"), bytes32("#0000A0"), bytes32("#CCFF00"), bytes32("#FFFF33"), bytes32("#FF0000"), bytes32("#800080"), - bytes32("#4B0082"), bytes32("#6F00FF"), bytes32("#FF1493"), bytes32("#FFAA1D"), bytes32("#FF7E00"), bytes32("#00FF00"), bytes32("#FF6EC7"), - bytes32("#8B00FF"), bytes32("#FFA07A"), bytes32("#FE4164"), bytes32("#008080") - ]; - return Gradient( - colours[_tokenId % colours.length], - colours[(_tokenId % colours.length + _tokenId / colours.length + 1) % colours.length], - colours[(_tokenId % colours.length + _tokenId / colours.length + _tokenId / colours.length ** 2 + 2) % colours.length] - ); - } +// function getGradient(uint256 _tokenId) private pure returns (Gradient memory) { +// bytes32[25] memory colours = [ +// bytes32("#FF69B4"), +// bytes32("#9B00FF"), +// bytes32("#00FFFF"), +// bytes32("#0000FF"), +// bytes32("#333333"), +// bytes32("#FFD700"), +// bytes32("#00FFFF"), +// bytes32("#9B00FF"), +// bytes32("#C0C0C0"), +// bytes32("#0000A0"), +// bytes32("#CCFF00"), +// bytes32("#FFFF33"), +// bytes32("#FF0000"), +// bytes32("#800080"), +// bytes32("#4B0082"), +// bytes32("#6F00FF"), +// bytes32("#FF1493"), +// bytes32("#FFAA1D"), +// bytes32("#FF7E00"), +// bytes32("#00FF00"), +// bytes32("#FF6EC7"), +// bytes32("#8B00FF"), +// bytes32("#FFA07A"), +// bytes32("#FE4164"), +// bytes32("#008080") +// ]; +// return Gradient( +// colours[_tokenId % colours.length], +// colours[(_tokenId % colours.length + _tokenId / colours.length + 1) % colours.length], +// colours[(_tokenId % colours.length + _tokenId / colours.length + _tokenId / colours.length ** 2 + 2) +// % colours.length] +// ); +// } - function generateDefs(uint256 _tokenId) external pure returns (string memory) { - Gradient memory gradient = getGradient(_tokenId); - return - string( - abi.encodePacked( - "", - "", - "", - "", - "", - "", - "", - "" - ) - ); - } - -} \ No newline at end of file +// function generateDefs(uint256 _tokenId) external pure returns (string memory) { +// Gradient memory gradient = getGradient(_tokenId); +// return string( +// abi.encodePacked( +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "" +// ) +// ); +// } +// } diff --git a/contracts/nfts/NFTMetadataGenerator.sol b/contracts/nfts/NFTMetadataGenerator.sol index 2e426d2..6c6b51d 100644 --- a/contracts/nfts/NFTMetadataGenerator.sol +++ b/contracts/nfts/NFTMetadataGenerator.sol @@ -1,53 +1,94 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.17; +// // SPDX-License-Identifier: UNLICENSED +// pragma solidity 0.8.17; -import "@openzeppelin/contracts/utils/Base64.sol"; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "contracts/interfaces/ISmartVault.sol"; -import "contracts/interfaces/INFTMetadataGenerator.sol"; -import "contracts/nfts/SVGGenerator.sol"; -import "contracts/nfts/NFTUtils.sol"; +// import "@openzeppelin/contracts/utils/Base64.sol"; +// import "@openzeppelin/contracts/utils/Strings.sol"; +// import "contracts/interfaces/ISmartVault.sol"; +// import "contracts/interfaces/INFTMetadataGenerator.sol"; +// import "contracts/nfts/SVGGenerator.sol"; +// import "contracts/nfts/NFTUtils.sol"; -contract NFTMetadataGenerator is INFTMetadataGenerator { - using Strings for uint256; - using Strings for uint16; +// contract NFTMetadataGenerator is INFTMetadataGenerator { +// using Strings for uint256; +// using Strings for uint16; - SVGGenerator private immutable svgGenerator; +// SVGGenerator private immutable svgGenerator; - constructor() { - svgGenerator = new SVGGenerator(); - } +// constructor() { +// svgGenerator = new SVGGenerator(); +// } - function mapCollateralForJSON(ISmartVault.Asset[] memory _collateral) private pure returns (string memory collateralTraits) { - collateralTraits = ""; - for (uint256 i = 0; i < _collateral.length; i++) { - ISmartVault.Asset memory asset = _collateral[i]; - collateralTraits = string(abi.encodePacked(collateralTraits, '{"trait_type":"', NFTUtils.toShortString(asset.token.symbol), '", ','"display_type": "number",','"value": ',NFTUtils.toDecimalString(asset.amount, asset.token.dec),'},')); - } - } +// function mapCollateralForJSON(ISmartVault.Asset[] memory _collateral) +// private +// pure +// returns (string memory collateralTraits) +// { +// collateralTraits = ""; +// for (uint256 i = 0; i < _collateral.length; i++) { +// ISmartVault.Asset memory asset = _collateral[i]; +// collateralTraits = string( +// abi.encodePacked( +// collateralTraits, +// '{"trait_type":"', +// NFTUtils.toShortString(asset.token.symbol), +// '", ', +// '"display_type": "number",', +// '"value": ', +// NFTUtils.toDecimalString(asset.amount, asset.token.dec), +// "}," +// ) +// ); +// } +// } - function generateNFTMetadata(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) external view returns (string memory) { - return string( - abi.encodePacked( - "data:application/json;base64,", - Base64.encode(abi.encodePacked( - "{", - '"name": "The Standard Smart Vault #',_tokenId.toString(),'",', - '"description": "The Standard Smart Vault (',NFTUtils.toShortString(_vaultStatus.vaultType),')",', - '"attributes": [', - '{"trait_type": "Status", "value": "',_vaultStatus.liquidated ?"liquidated":"active",'"},', - '{"trait_type": "Debt", "display_type": "number", "value": ', NFTUtils.toDecimalString(_vaultStatus.minted, 18),'},', - '{"trait_type": "Max Borrowable Amount", "display_type": "number", "value": "',NFTUtils.toDecimalString(_vaultStatus.maxMintable, 18),'"},', - '{"trait_type": "Collateral Value in USDs", "display_type": "number", "value": ',NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue, 18),'},', - '{"trait_type": "Value minus debt", "display_type": "number", "value": ',NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue - _vaultStatus.minted, 18),'},', - mapCollateralForJSON(_vaultStatus.collateral), - '{"trait_type": "Version", "value": "',uint256(_vaultStatus.version).toString(),'"},', - '{"trait_type": "Vault Type", "value": "',NFTUtils.toShortString(_vaultStatus.vaultType),'"}', - '],', - '"image_data": "',svgGenerator.generateSvg(_tokenId, _vaultStatus),'"', - "}" - )) - ) - ); - } -} +// function generateNFTMetadata(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) +// external +// view +// returns (string memory) +// { +// return string( +// abi.encodePacked( +// "data:application/json;base64,", +// Base64.encode( +// abi.encodePacked( +// "{", +// '"name": "The Standard Smart Vault #', +// _tokenId.toString(), +// '",', +// '"description": "The Standard Smart Vault (', +// NFTUtils.toShortString(_vaultStatus.vaultType), +// ')",', +// '"attributes": [', +// '{"trait_type": "Status", "value": "', +// _vaultStatus.liquidated ? "liquidated" : "active", +// '"},', +// '{"trait_type": "Debt", "display_type": "number", "value": ', +// NFTUtils.toDecimalString(_vaultStatus.minted, 18), +// "},", +// '{"trait_type": "Max Borrowable Amount", "display_type": "number", "value": "', +// NFTUtils.toDecimalString(_vaultStatus.maxMintable, 18), +// '"},', +// '{"trait_type": "Collateral Value in USDs", "display_type": "number", "value": ', +// NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue, 18), +// "},", +// '{"trait_type": "Value minus debt", "display_type": "number", "value": ', +// NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue - _vaultStatus.minted, 18), +// "},", +// mapCollateralForJSON(_vaultStatus.collateral), +// '{"trait_type": "Version", "value": "', +// uint256(_vaultStatus.version).toString(), +// '"},', +// '{"trait_type": "Vault Type", "value": "', +// NFTUtils.toShortString(_vaultStatus.vaultType), +// '"}', +// "],", +// '"image_data": "', +// svgGenerator.generateSvg(_tokenId, _vaultStatus), +// '"', +// "}" +// ) +// ) +// ) +// ); +// } +// } diff --git a/contracts/nfts/NFTUtils.sol b/contracts/nfts/NFTUtils.sol index 70b0b35..ecc1d89 100644 --- a/contracts/nfts/NFTUtils.sol +++ b/contracts/nfts/NFTUtils.sol @@ -1,74 +1,80 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.17; +// // SPDX-License-Identifier: UNLICENSED +// pragma solidity 0.8.17; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "contracts/interfaces/ISmartVault.sol"; -import "contracts/interfaces/INFTMetadataGenerator.sol"; -import "contracts/nfts/SVGGenerator.sol"; +// import "@openzeppelin/contracts/utils/Strings.sol"; +// import "contracts/interfaces/ISmartVault.sol"; +// import "contracts/interfaces/INFTMetadataGenerator.sol"; +// import "contracts/nfts/SVGGenerator.sol"; -library NFTUtils { - using Strings for uint256; - using Strings for uint16; +// library NFTUtils { +// using Strings for uint256; +// using Strings for uint16; - function toShortString(bytes32 _data) pure external returns (string memory) { - bytes memory bytesString = new bytes(32); - uint charCount = 0; - for (uint8 i = 0; i < 32; i++) { - bytes1 char = _data[i]; - if (char != 0) { - bytesString[charCount] = char; - charCount++; - } - } - bytes memory bytesStringTrimmed = new bytes(charCount); - for (uint8 j = 0; j < charCount; j++) { - bytesStringTrimmed[j] = bytesString[j]; - } - return string(bytesStringTrimmed); - } +// function toShortString(bytes32 _data) external pure returns (string memory) { +// bytes memory bytesString = new bytes(32); +// uint256 charCount = 0; +// for (uint8 i = 0; i < 32; i++) { +// bytes1 char = _data[i]; +// if (char != 0) { +// bytesString[charCount] = char; +// charCount++; +// } +// } +// bytes memory bytesStringTrimmed = new bytes(charCount); +// for (uint8 j = 0; j < charCount; j++) { +// bytesStringTrimmed[j] = bytesString[j]; +// } +// return string(bytesStringTrimmed); +// } - function padFraction(bytes memory _input, uint8 _dec) private pure returns (bytes memory fractionalPartPadded) { - fractionalPartPadded = new bytes(_dec); - uint256 i = fractionalPartPadded.length; - uint256 j = _input.length; - bool smallestCharacterAppended; - while(i > 0) { - i--; - if (j > 0) { - j--; - if (_input[j] != bytes1("0") || smallestCharacterAppended) { - fractionalPartPadded[i] = _input[j]; - smallestCharacterAppended = true; - } else { - fractionalPartPadded = new bytes(fractionalPartPadded.length - 1); - } - } else { - fractionalPartPadded[i] = "0"; - } - } - } +// function padFraction(bytes memory _input, uint8 _dec) private pure returns (bytes memory fractionalPartPadded) { +// fractionalPartPadded = new bytes(_dec); +// uint256 i = fractionalPartPadded.length; +// uint256 j = _input.length; +// bool smallestCharacterAppended; +// while (i > 0) { +// i--; +// if (j > 0) { +// j--; +// if (_input[j] != bytes1("0") || smallestCharacterAppended) { +// fractionalPartPadded[i] = _input[j]; +// smallestCharacterAppended = true; +// } else { +// fractionalPartPadded = new bytes(fractionalPartPadded.length - 1); +// } +// } else { +// fractionalPartPadded[i] = "0"; +// } +// } +// } - function truncateFraction(bytes memory _input, uint8 _places) private pure returns (bytes memory truncated) { - truncated = new bytes(_places); - for (uint256 i = 0; i < _places; i++) { - truncated[i] = _input[i]; - } - } +// function truncateFraction(bytes memory _input, uint8 _places) private pure returns (bytes memory truncated) { +// truncated = new bytes(_places); +// for (uint256 i = 0; i < _places; i++) { +// truncated[i] = _input[i]; +// } +// } - function toDecimalString(uint256 _amount, uint8 _inputDec) external pure returns (string memory) { - uint8 maxDecPlaces = 5; - string memory wholePart = (_amount / 10 ** _inputDec).toString(); - uint256 fraction = _amount % 10 ** _inputDec; - if (fraction == 0) return wholePart; - bytes memory fractionalPart = bytes(fraction.toString()); - bytes memory fractionalPartPadded = padFraction(fractionalPart, _inputDec); - if (fractionalPartPadded.length > maxDecPlaces) fractionalPartPadded = truncateFraction(fractionalPartPadded, maxDecPlaces); - return string(abi.encodePacked(wholePart, ".", fractionalPartPadded)); - } +// function toDecimalString(uint256 _amount, uint8 _inputDec) external pure returns (string memory) { +// uint8 maxDecPlaces = 5; +// string memory wholePart = (_amount / 10 ** _inputDec).toString(); +// uint256 fraction = _amount % 10 ** _inputDec; +// if (fraction == 0) return wholePart; +// bytes memory fractionalPart = bytes(fraction.toString()); +// bytes memory fractionalPartPadded = padFraction(fractionalPart, _inputDec); +// if (fractionalPartPadded.length > maxDecPlaces) { +// fractionalPartPadded = truncateFraction(fractionalPartPadded, maxDecPlaces); +// } +// return string(abi.encodePacked(wholePart, ".", fractionalPartPadded)); +// } - function calculateCollateralLockedWidth(uint256 totalCollateral, uint256 mintedAmount, uint256 widthOfBar) public pure returns (uint256) { - if (totalCollateral == 0) return 0; - uint256 result = (((mintedAmount * 100) / totalCollateral * widthOfBar) / 100); - return result; - } -} +// function calculateCollateralLockedWidth(uint256 totalCollateral, uint256 mintedAmount, uint256 widthOfBar) +// public +// pure +// returns (uint256) +// { +// if (totalCollateral == 0) return 0; +// uint256 result = (((mintedAmount * 100) / totalCollateral * widthOfBar) / 100); +// return result; +// } +// } diff --git a/contracts/nfts/SVGGenerator.sol b/contracts/nfts/SVGGenerator.sol index e0a7e42..60787fd 100644 --- a/contracts/nfts/SVGGenerator.sol +++ b/contracts/nfts/SVGGenerator.sol @@ -1,135 +1,256 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.17; +// // SPDX-License-Identifier: UNLICENSED +// pragma solidity 0.8.17; -import "@openzeppelin/contracts/utils/Strings.sol"; -import "contracts/interfaces/ISmartVault.sol"; -import "contracts/nfts/DefGenerator.sol"; -import "contracts/nfts/NFTUtils.sol"; +// import "@openzeppelin/contracts/utils/Strings.sol"; +// import "contracts/interfaces/ISmartVault.sol"; +// import "contracts/nfts/DefGenerator.sol"; +// import "contracts/nfts/NFTUtils.sol"; -contract SVGGenerator { - using Strings for uint256; - using Strings for uint16; +// contract SVGGenerator { +// using Strings for uint256; +// using Strings for uint16; - uint16 private constant TABLE_ROW_HEIGHT = 67; - uint16 private constant TABLE_ROW_WIDTH = 1235; - uint16 private constant TABLE_INITIAL_Y = 1250; - uint16 private constant TABLE_INITIAL_X = 357; - uint32 private constant HUNDRED_PC = 1e5; - uint32 private constant WIDTH_OF_COL_BAR = 690; +// uint16 private constant TABLE_ROW_HEIGHT = 67; +// uint16 private constant TABLE_ROW_WIDTH = 1235; +// uint16 private constant TABLE_INITIAL_Y = 1250; +// uint16 private constant TABLE_INITIAL_X = 357; +// uint32 private constant HUNDRED_PC = 1e5; +// uint32 private constant WIDTH_OF_COL_BAR = 690; - DefGenerator private immutable defGenerator; +// DefGenerator private immutable defGenerator; - constructor() { - defGenerator = new DefGenerator(); - } +// constructor() { +// defGenerator = new DefGenerator(); +// } - struct CollateralForSVG {string text; uint256 size;} +// struct CollateralForSVG { +// string text; +// uint256 size; +// } - function mapCollateralForSVG(ISmartVault.Asset[] memory _collateral) private pure returns (CollateralForSVG memory) { - string memory displayText = ""; - uint256 paddingTop = 50; - uint256 paddingLeftSymbol = 22; - uint256 paddingLeftAmount = paddingLeftSymbol + 250; - uint256 collateralSize = 0; - for (uint256 i = 0; i < _collateral.length; i++) { - ISmartVault.Asset memory asset = _collateral[i]; - uint256 xShift = collateralSize % 2 == 0 ? 0 : TABLE_ROW_WIDTH >> 1; - if (asset.amount > 0) { - uint256 currentRow = collateralSize >> 1; - uint256 textYPosition = TABLE_INITIAL_Y + currentRow * TABLE_ROW_HEIGHT + paddingTop; - displayText = string(abi.encodePacked(displayText, - "", - "", - "",NFTUtils.toShortString(asset.token.symbol),"", - "", - "", - "",NFTUtils.toDecimalString(asset.amount, asset.token.dec),"", - "", - "" - )); - collateralSize++; - } - } - if (collateralSize == 0) { - displayText = string(abi.encodePacked( - "", - "", - "N/A", - "", - "" - )); - collateralSize = 1; - } - return CollateralForSVG(displayText, collateralSize); - } +// function mapCollateralForSVG(ISmartVault.Asset[] memory _collateral) +// private +// pure +// returns (CollateralForSVG memory) +// { +// string memory displayText = ""; +// uint256 paddingTop = 50; +// uint256 paddingLeftSymbol = 22; +// uint256 paddingLeftAmount = paddingLeftSymbol + 250; +// uint256 collateralSize = 0; +// for (uint256 i = 0; i < _collateral.length; i++) { +// ISmartVault.Asset memory asset = _collateral[i]; +// uint256 xShift = collateralSize % 2 == 0 ? 0 : TABLE_ROW_WIDTH >> 1; +// if (asset.amount > 0) { +// uint256 currentRow = collateralSize >> 1; +// uint256 textYPosition = TABLE_INITIAL_Y + currentRow * TABLE_ROW_HEIGHT + paddingTop; +// displayText = string( +// abi.encodePacked( +// displayText, +// "", +// "", +// "", +// NFTUtils.toShortString(asset.token.symbol), +// "", +// "", +// "", +// "", +// NFTUtils.toDecimalString(asset.amount, asset.token.dec), +// "", +// "", +// "" +// ) +// ); +// collateralSize++; +// } +// } +// if (collateralSize == 0) { +// displayText = string( +// abi.encodePacked( +// "", +// "", +// "N/A", +// "", +// "" +// ) +// ); +// collateralSize = 1; +// } +// return CollateralForSVG(displayText, collateralSize); +// } - function mapRows(uint256 _collateralSize) private pure returns (string memory mappedRows) { - mappedRows = ""; - uint256 rowCount = (_collateralSize + 1) >> 1; - for (uint256 i = 0; i < (rowCount + 1) >> 1; i++) { - mappedRows = string(abi.encodePacked( - mappedRows, "" - )); - } - uint256 rowMidpoint = TABLE_INITIAL_X + TABLE_ROW_WIDTH >> 1; - uint256 tableEndY = TABLE_INITIAL_Y + rowCount * TABLE_ROW_HEIGHT; - mappedRows = string(abi.encodePacked(mappedRows, - "")); - } +// function mapRows(uint256 _collateralSize) private pure returns (string memory mappedRows) { +// mappedRows = ""; +// uint256 rowCount = (_collateralSize + 1) >> 1; +// for (uint256 i = 0; i < (rowCount + 1) >> 1; i++) { +// mappedRows = string( +// abi.encodePacked( +// mappedRows, +// "" +// ) +// ); +// } +// uint256 rowMidpoint = TABLE_INITIAL_X + TABLE_ROW_WIDTH >> 1; +// uint256 tableEndY = TABLE_INITIAL_Y + rowCount * TABLE_ROW_HEIGHT; +// mappedRows = string( +// abi.encodePacked( +// mappedRows, +// "" +// ) +// ); +// } - function collateralDebtPecentage(ISmartVault.Status memory _vaultStatus) private pure returns (string memory) { - return _vaultStatus.minted == 0 ? "N/A" : string(abi.encodePacked(NFTUtils.toDecimalString(HUNDRED_PC * _vaultStatus.totalCollateralValue / _vaultStatus.minted, 3), " %")); - } +// function collateralDebtPecentage(ISmartVault.Status memory _vaultStatus) private pure returns (string memory) { +// return _vaultStatus.minted == 0 +// ? "N/A" +// : string( +// abi.encodePacked( +// NFTUtils.toDecimalString(HUNDRED_PC * _vaultStatus.totalCollateralValue / _vaultStatus.minted, 3), " %" +// ) +// ); +// } - function generateSvg(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) external view returns (string memory) { - uint256 colWidth = NFTUtils.calculateCollateralLockedWidth(_vaultStatus.totalCollateralValue, _vaultStatus.minted, WIDTH_OF_COL_BAR); - return string( - abi.encodePacked( - "", - defGenerator.generateDefs(_tokenId), - "", "", - "", - "", "", "", - "", "", - "", "", - "", - "", - "", - "", "USDs SmartVault", - "", - "", - "" - "", "TheStandard.io", - "THE OWNER OF THIS NFT OWNS", "THE COLLATERAL AND DEBT", - "USDs SmartVault # ", _tokenId.toString(), "", - "Collateral", "", - "€ ", NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue, 18), "", - "Debt", "", - "€ ", NFTUtils.toDecimalString(_vaultStatus.minted, 18), "", - "Collateral Ratio", - "min 110%", - "", - "", collateralDebtPecentage(_vaultStatus), "", "Total Minus Debt", - "", - "€ ", NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue - _vaultStatus.minted, 18), "", - "Debt", - "Collateral", - "", - "", - "", - "", "", "", "", - "", "", "", "", - "", "", - "", "", "", - "", "", "", "", - "", - "", "", "", "", - "", "", "", "", - "", - "", "", "", "", - "", "", - "", "", "", "", "", "", "", "" - ) - ); - } -} \ No newline at end of file +// function generateSvg(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) +// external +// view +// returns (string memory) +// { +// uint256 colWidth = NFTUtils.calculateCollateralLockedWidth( +// _vaultStatus.totalCollateralValue, _vaultStatus.minted, WIDTH_OF_COL_BAR +// ); +// return string( +// abi.encodePacked( +// "", +// defGenerator.generateDefs(_tokenId), +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "USDs SmartVault", +// "", +// "", +// "" +// "", +// "TheStandard.io", +// "THE OWNER OF THIS NFT OWNS", +// "THE COLLATERAL AND DEBT", +// "USDs SmartVault # ", +// _tokenId.toString(), +// "", +// "Collateral", +// "", +// "€ ", +// NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue, 18), +// "", +// "Debt", +// "", +// "€ ", +// NFTUtils.toDecimalString(_vaultStatus.minted, 18), +// "", +// "Collateral Ratio", +// "min 110%", +// "", +// "", +// collateralDebtPecentage(_vaultStatus), +// "", +// "Total Minus Debt", +// "", +// "€ ", +// NFTUtils.toDecimalString(_vaultStatus.totalCollateralValue - _vaultStatus.minted, 18), +// "", +// "Debt", +// "Collateral", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "", +// "" +// ) +// ); +// } +// } diff --git a/contracts/test_utils/BytecodeConstants.sol b/contracts/test_utils/BytecodeConstants.sol new file mode 100644 index 0000000..a9f7100 --- /dev/null +++ b/contracts/test_utils/BytecodeConstants.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +bytes constant UNISWAP_POOL_CODE = + hex"6101606040523480156200001257600080fd5b503060601b60805260408051630890357360e41b81529051600091339163890357309160048082019260a092909190829003018186803b1580156200005657600080fd5b505afa1580156200006b573d6000803e3d6000fd5b505050506040513d60a08110156200008257600080fd5b508051602080830151604084015160608086015160809096015160e896871b6001600160e81b0319166101005291811b6001600160601b031990811660e05292811b831660c0529390931b1660a052600282810b900b90921b610120529150620000f79082906200010f811b62002b8417901c565b60801b6001600160801b03191661014052506200017d565b60008082600281900b620d89e719816200012557fe5b05029050600083600281900b620d89e8816200013d57fe5b0502905060008460020b83830360020b816200015557fe5b0560010190508062ffffff166001600160801b038016816200017357fe5b0495945050505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005160e81c6101205160e81c6101405160801c61567e6200024a60003980611fee5280614b5f5280614b96525080610c0052806128fd5280614bca5280614bfc525080610cef52806119cb5280611a0252806129455250806111c75280611a855280611ef4528061244452806129215280613e6b5250806108d252806112f55280611a545280611e8e52806123be5280613d2252508061207b528061227d52806128d9525080612bfb525061567e6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806370cf754a116100ee578063c45a015511610097578063ddca3f4311610071578063ddca3f4314610800578063f305839914610820578063f30dba9314610828578063f637731d146108aa576101ae565b8063c45a0155146107d1578063d0c93a7c146107d9578063d21220a7146107f8576101ae565b8063883bdbfd116100c8578063883bdbfd14610633578063a34123a71461073c578063a38807f214610776576101ae565b806370cf754a146105c65780638206a4d1146105ce57806385b66729146105f6576101ae565b80633850c7bd1161015b578063490e6cbc11610135578063490e6cbc146104705780634f1eb3d8146104fc578063514ea4bf1461054d5780635339c296146105a6576101ae565b80633850c7bd1461035b5780633c8a7d8d146103b45780634614131914610456576101ae565b80631ad8b03b1161018c5780631ad8b03b146102aa578063252c09d7146102e157806332148f6714610338576101ae565b80630dfe1681146101b3578063128acb08146101d75780631a68650214610286575b600080fd5b6101bb6108d0565b604080516001600160a01b039092168252519081900360200190f35b61026d600480360360a08110156101ed57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a08101608082013564010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184600183028401116401000000008311171561026257600080fd5b5090925090506108f4565b6040805192835260208301919091528051918290030190f35b61028e6114ad565b604080516001600160801b039092168252519081900360200190f35b6102b26114bc565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102fe600480360360208110156102f757600080fd5b50356114d6565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6103596004803603602081101561034e57600080fd5b503561ffff1661151c565b005b610363611616565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b61026d600480360360a08110156103ca57600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a08101608082013564010000000081111561041757600080fd5b82018360208201111561042957600080fd5b8035906020019184600183028401116401000000008311171561044b57600080fd5b509092509050611666565b61045e611922565b60408051918252519081900360200190f35b6103596004803603608081101561048657600080fd5b6001600160a01b0382351691602081013591604082013591908101906080810160608201356401000000008111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460018302840111640100000000831117156104f157600080fd5b509092509050611928565b6102b2600480360360a081101561051257600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611d83565b61056a6004803603602081101561056357600080fd5b5035611f9d565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b61045e600480360360208110156105bc57600080fd5b503560010b611fda565b61028e611fec565b610359600480360360408110156105e457600080fd5b5060ff81358116916020013516612010565b6102b26004803603606081101561060c57600080fd5b506001600160a01b03813516906001600160801b036020820135811691604001351661220f565b6106a36004803603602081101561064957600080fd5b81019060208101813564010000000081111561066457600080fd5b82018360208201111561067657600080fd5b8035906020019184602083028401116401000000008311171561069857600080fd5b5090925090506124dc565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e75781810151838201526020016106cf565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561072657818101518382015260200161070e565b5050505090500194505050505060405180910390f35b61026d6004803603606081101561075257600080fd5b508035600290810b91602081013590910b90604001356001600160801b0316612569565b6107a06004803603604081101561078c57600080fd5b508035600290810b9160200135900b6126e0565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b6101bb6128d7565b6107e16128fb565b6040805160029290920b8252519081900360200190f35b6101bb61291f565b610808612943565b6040805162ffffff9092168252519081900360200190f35b61045e612967565b6108486004803603602081101561083e57600080fd5b503560020b61296d565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b610359600480360360208110156108c057600080fd5b50356001600160a01b03166129db565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806108ff612bf0565b85610936576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c082018190526109ef576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b87610a3a5780600001516001600160a01b0316866001600160a01b0316118015610a35575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b610a6c565b80600001516001600160a01b0316866001600160a01b0316108015610a6c57506401000276a36001600160a01b038716115b610aa3576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610ad25760048460a0015160ff16901c610ae5565b60108460a0015160ff1681610ae357fe5b065b60ff1681526004546001600160801b03166020820152604001610b06612c27565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b8257600254610b86565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610bd55750886001600160a01b031681604001516001600160a01b031614155b15610f9f57610be261560e565b60408201516001600160a01b031681526060820151610c25906006907f00000000000000000000000000000000000000000000000000000000000000008f612c2b565b15156040830152600290810b810b60208301819052620d89e719910b1215610c5657620d89e7196020820152610c75565b6020810151620d89e860029190910b1315610c7557620d89e860208201525b610c828160200151612d6d565b6001600160a01b031660608201526040820151610d13908d610cbc578b6001600160a01b031683606001516001600160a01b031611610cd6565b8b6001600160a01b031683606001516001600160a01b0316105b610ce4578260600151610ce6565b8b5b60c085015185517f000000000000000000000000000000000000000000000000000000000000000061309f565b60c085015260a084015260808301526001600160a01b031660408301528215610d7557610d498160c00151826080015101613291565b825103825260a0810151610d6b90610d6090613291565b6020840151906132a7565b6020830152610db0565b610d828160a00151613291565b825101825260c08101516080820151610daa91610d9f9101613291565b6020840151906132c3565b60208301525b835160ff1615610df6576000846000015160ff168260c0015181610dd057fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610e3557610e298160c00151600160801b8460c001516001600160801b03166132d9565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610f5e57806040015115610f35578360a00151610ebf57610e9d846040015160008760200151886040015188602001518a606001516008613389909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610f0b82602001518e610ed657600154610edc565b84608001515b8f610eeb578560800151610eef565b6002545b608089015160608a015160408b0151600595949392919061351c565b90508c15610f17576000035b610f258360c00151826135ef565b6001600160801b031660c0840152505b8b610f44578060200151610f4d565b60018160200151035b600290810b900b6060830152610f99565b80600001516001600160a01b031682604001516001600160a01b031614610f9957610f8c82604001516136a5565b600290810b900b60608301525b50610baf565b836020015160020b816060015160020b1461107a57600080610fed86604001518660400151886020015188602001518a606001518b6080015160086139d1909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b93909316929092029190911773ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116179055506110ac9050565b60408101516000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110f25760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a1561114257608081015160015560a08101516001600160801b03161561113d5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b611188565b608081015160025560a08101516001600160801b0316156111885760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b1515146111a157602081015181518b036111ae565b80600001518a0381602001515b90965094508a156112e75760008512156111f0576111f07f00000000000000000000000000000000000000000000000000000000000000008d87600003613b86565b60006111fa613cd4565b9050336001600160a01b031663fa461e3388888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561127e57600080fd5b505af1158015611292573d6000803e3d6000fd5b5050505061129e613cd4565b6112a88289613e0d565b11156112e1576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b50611411565b600086121561131e5761131e7f00000000000000000000000000000000000000000000000000000000000000008d88600003613b86565b6000611328613e1d565b9050336001600160a01b031663fa461e3388888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506113cc613e1d565b6113d68288613e0d565b111561140f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff81106114e757600080fd5b015463ffffffff81169150640100000000810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff16611560576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611575612bf0565b60008054600160d81b900461ffff169061159160088385613eb5565b6000805461ffff808416600160d81b810261ffff60d81b19909316929092179092559192508316146115fe576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff166116ad576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b0385166116cd57600080fd5b60008061171b60405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b81526020016117118a6001600160801b0316613f58565b600f0b9052613f69565b9250925050819350809250600080600086111561173d5761173a613cd4565b91505b841561174e5761174b613e1d565b90505b336001600160a01b031663d348799787878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156117d057600080fd5b505af11580156117e4573d6000803e3d6000fd5b50505050600086111561183b576117f9613cd4565b6118038388613e0d565b111561183b576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b841561188b57611849613e1d565b6118538287613e0d565b111561188b576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff1661196c576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19169055611981612bf0565b6004546001600160801b0316806119c3576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b60006119f8867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406141a9565b90506000611a2f867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f42406141a9565b90506000611a3b613cd4565b90506000611a47613e1d565b90508815611a7a57611a7a7f00000000000000000000000000000000000000000000000000000000000000008b8b613b86565b8715611aab57611aab7f00000000000000000000000000000000000000000000000000000000000000008b8a613b86565b336001600160a01b031663e9cbafb085858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611b2d57600080fd5b505af1158015611b41573d6000803e3d6000fd5b505050506000611b4f613cd4565b90506000611b5b613e1d565b905081611b688588613e0d565b1115611ba0576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611bab8487613e0d565b1115611be3576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611c725760008054600160e81b9004600f16908115611c16578160ff168481611c1057fe5b04611c19565b60005b90506001600160801b03811615611c4c57600380546001600160801b038082168401166001600160801b03199091161790555b611c66818503600160801b8d6001600160801b03166132d9565b60018054909101905550505b8015611cfd5760008054600160e81b900460041c600f16908115611ca2578160ff168381611c9c57fe5b04611ca5565b60005b90506001600160801b03811615611cd757600380546001600160801b03600160801b8083048216850182160291161790555b611cf1818403600160801b8d6001600160801b03166132d9565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611dca576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611de460073389896141e3565b60038101549091506001600160801b0390811690861611611e055784611e14565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611e3c5783611e52565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611eb7576003810180546001600160801b031981166001600160801b03918216869003821617909155611eb7907f0000000000000000000000000000000000000000000000000000000000000000908a908616613b86565b6001600160801b03821615611f1d576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611f1d907f0000000000000000000000000000000000000000000000000000000000000000908a908516613b86565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600054600160f01b900460ff16612054576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b916004808301926020929190829003018186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d60208110156120eb57600080fd5b50516001600160a01b0316331461210157600080fd5b60ff82161580612124575060048260ff16101580156121245750600a8260ff1611155b801561214e575060ff8116158061214e575060048160ff161015801561214e5750600a8160ff1611155b61215757600080fd5b60008054610ff0600484901b16840160ff908116600160e81b9081027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff16612256576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b916004808301926020929190829003018186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b50516001600160a01b0316331461230357600080fd5b6003546001600160801b039081169085161161231f578361232c565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116123525782612366565b600354600160801b90046001600160801b03165b90506001600160801b038216156123e7576003546001600160801b038381169116141561239557600019909101905b600380546001600160801b031981166001600160801b039182168590038216179091556123e7907f00000000000000000000000000000000000000000000000000000000000000009087908516613b86565b6001600160801b0381161561246d576003546001600160801b03828116600160801b90920416141561241857600019015b600380546001600160801b03600160801b80830482168590038216029181169190911790915561246d907f00000000000000000000000000000000000000000000000000000000000000009087908416613b86565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b6060806124e7612bf0565b61255e6124f2612c27565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b900416614247565b915091509250929050565b600080548190600160f01b900460ff166125b0576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061260990606081016125fc6001600160801b038a16613f58565b600003600f0b9052613f69565b925092509250816000039450806000039350600085118061262a5750600084115b15612669576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b60008060006126ed612bf0565b6126f785856143a1565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b9367010000000000000082046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff168061275f57600080fd5b6003820154600681900b985067010000000000000081046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806127a457600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b1215905061284d575093909403965090039350900390506128d0565b8a60020b816020015160020b12156128c1576000612869612c27565b602083015160408401516004546060860151939450600093849361289f936008938893879392916001600160801b031690613389565b9a9003989098039b5050949096039290920396509091030392506128d0915050565b50949093039650039350900390505b9250925092565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b9067010000000000000081046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612a1e576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b6000612a29826136a5565b9050600080612a41612a39612c27565b60089061446a565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b73ffffffffffffffffffffffffffffffffffffffff19909116871762ffffff60a01b1916600160a01b62ffffff9787900b9790971696909602959095177fffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffff16600160c81b9091021761ffff60d81b1916600160d81b909602959095177fff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612b9957fe5b05029050600083600281900b620d89e881612bb057fe5b0502905060008460020b83830360020b81612bc757fe5b0560010190508062ffffff166001600160801b03801681612be457fe5b0493505050505b919050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612c2557600080fd5b565b4290565b60008060008460020b8660020b81612c3f57fe5b05905060008660020b128015612c6657508460020b8660020b81612c5f57fe5b0760020b15155b15612c7057600019015b8315612ce557600080612c82836144b6565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612cc757888360ff16860302612cda565b88612cd1826144c8565b840360ff168603025b965050505050612d63565b600080612cf4836001016144b6565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612d4657888360ff0360ff16866001010102612d5c565b8883612d5183614568565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612d84578260020b612d8c565b8260020b6000035b9050620d89e8811115612dca576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612dde57600160801b612df0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612e24576ffff97272373d413259a46990580e213a0260801c5b6004821615612e43576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612e62576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612e81576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ea0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612ebf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ede576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612efe576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612f1e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612f3e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612f5e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612f7e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612f9e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612fbe576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612fde576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612fff576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561301f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561303e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561305b576b048a170391f7dc42444e8fa20260801c5b60008460020b131561307657806000198161307257fe5b0490505b64010000000081061561308a57600161308d565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906131245760006130d88989620f42400362ffffff16620f42406132d9565b9050826130f1576130ec8c8c8c6001614652565b6130fe565b6130fe8b8d8c60016146cd565b955085811061310f578a965061311e565b61311b8c8b838661478a565b96505b5061316e565b8161313b576131368b8b8b60006146cd565b613148565b6131488a8c8b6000614652565b935083886000031061315c5789955061316e565b61316b8b8a8a600003856147d6565b95505b6001600160a01b038a81169087161482156131d15780801561318d5750815b6131a35761319e878d8c60016146cd565b6131a5565b855b95508080156131b2575081155b6131c8576131c3878d8c6000614652565b6131ca565b845b945061321b565b8080156131db5750815b6131f1576131ec8c888c6001614652565b6131f3565b855b9550808015613200575081155b613216576132118c888c60006146cd565b613218565b845b94505b8115801561322b57508860000385115b15613237578860000394505b81801561325657508a6001600160a01b0316876001600160a01b031614155b15613265578589039350613282565b61327f868962ffffff168a620f42400362ffffff166141a9565b93505b50505095509550955095915050565b6000600160ff1b82106132a357600080fd5b5090565b808203828113156000831215146132bd57600080fd5b92915050565b818101828112156000831215146132bd57600080fd5b600080806000198587098686029250828110908390030390508061330f576000841161330457600080fd5b508290049050613382565b80841161331b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff8716613430576000898661ffff1661ffff81106133aa57fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461341c57613419818a8988614822565b90505b806020015181604001519250925050613510565b8688036000806134458c8c858c8c8c8c6148d2565b91509150816000015163ffffffff168363ffffffff161415613477578160200151826040015194509450505050613510565b805163ffffffff8481169116141561349f578060200151816040015194509450505050613510565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816134cd57fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816134ff57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b036701000000000000008085048216909603169094027fffffffffff0000000000000000000000000000000000000000ffffffffffffff90921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561365457826001600160801b03168260000384039150816001600160801b03161061364f576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6132bd565b826001600160801b03168284019150816001600160801b031610156132bd576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906136e1575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b613716576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106137b757607f810383901c91506137c1565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146139c257886001600160a01b03166139a682612d6d565b6001600160a01b031611156139bb57816139bd565b805b6139c4565b815b9998505050505050505050565b6000806000898961ffff1661ffff81106139e757fe5b60408051608081018252919092015463ffffffff8082168084526401000000008304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff161515606083015290925089161415613a575788859250925050613510565b8461ffff168461ffff16118015613a7857506001850361ffff168961ffff16145b15613a8557839150613a89565b8491505b8161ffff168960010161ffff1681613a9d57fe5b069250613aac81898989614822565b8a8461ffff1661ffff8110613abd57fe5b825191018054602084015160408501516060909501511515600160f81b027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16640100000000026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613c025780518252601f199092019160209182019101613be3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c64576040519150601f19603f3d011682016040523d82523d6000602084013e613c69565b606091505b5091509150818015613c97575080511580613c975750808060200190516020811015613c9457600080fd5b50515b613ccd576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693919290918291908083835b60208310613d6d5780518252601f199092019160209182019101613d4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613dcd576040519150601f19603f3d011682016040523d82523d6000602084013e613dd2565b606091505b5091509150818015613de657506020815110155b613def57600080fd5b808060200190516020811015613e0457600080fd5b50519250505090565b808201828110156132bd57600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016939192909182919080838360208310613d6d5780518252601f199092019160209182019101613d4e565b6000808361ffff1611613ef3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613f09575081613382565b825b8261ffff168161ffff161015613f4f576001858261ffff1661ffff8110613f2e57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613f0b565b50909392505050565b80600f81900b8114612beb57600080fd5b6000806000613f76612bf0565b613f88846020015185604001516143a1565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c08501528851908901519489015192890151939461402c9491939092909190614acf565b93508460600151600f0b6000146141a157846020015160020b816020015160020b12156140815761407a6140638660200151612d6d565b6140708760400151612d6d565b8760600151614c84565b92506141a1565b846040015160020b816020015160020b12156141775760045460408201516001600160801b03909116906140d3906140b7612c27565b60208501516060860151608087015160089493929187916139d1565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151614123919061411990612d6d565b8860600151614c84565b93506141416141358760200151612d6d565b83516060890151614cc8565b92506141518187606001516135ef565b600480546001600160801b0319166001600160801b0392909216919091179055506141a1565b61419e6141878660200151612d6d565b6141948760400151612d6d565b8760600151614cc8565b91505b509193909250565b60006141b68484846132d9565b9050600082806141c257fe5b84860911156133825760001981106141d957600080fd5b6001019392505050565b6040805160609490941b6bffffffffffffffffffffffff1916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff1611614287576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b865167ffffffffffffffff8111801561429f57600080fd5b506040519080825280602002602001820160405280156142c9578160200160208202803683370190505b509150865167ffffffffffffffff811180156142e457600080fd5b5060405190808252806020026020018201604052801561430e578160200160208202803683370190505b50905060005b87518110156143945761433f8a8a8a848151811061432e57fe5b60200260200101518a8a8a8a613389565b84838151811061434b57fe5b6020026020010184848151811061435e57fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050614314565b5097509795505050505050565b8060020b8260020b126143e1576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b1215614424576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b1315614466576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b60008082116144d657600080fd5b600160801b82106144e957608091821c91015b68010000000000000000821061450157604091821c91015b640100000000821061451557602091821c91015b62010000821061452757601091821c91015b610100821061453857600891821c91015b6010821061454857600491821c91015b6004821061455857600291821c91015b60028210612beb57600101919050565b600080821161457657600080fd5b5060ff6001600160801b0382161561459157607f1901614599565b608082901c91505b67ffffffffffffffff8216156145b257603f19016145ba565b604082901c91505b63ffffffff8216156145cf57601f19016145d7565b602082901c91505b61ffff8216156145ea57600f19016145f2565b601082901c91505b60ff821615614604576007190161460c565b600882901c91505b600f82161561461e5760031901614626565b600482901c91505b60038216156146385760011901614640565b600282901c91505b6001821615612beb5760001901919050565b6000836001600160a01b0316856001600160a01b03161115614672579293925b8161469f5761469a836001600160801b03168686036001600160a01b0316600160601b6132d9565b6146c2565b6146c2836001600160801b03168686036001600160a01b0316600160601b6141a9565b90505b949350505050565b6000836001600160a01b0316856001600160a01b031611156146ed579293925b7bffffffffffffffffffffffffffffffff000000000000000000000000606084901b166001600160a01b03868603811690871661472957600080fd5b8361475957866001600160a01b031661474c8383896001600160a01b03166132d9565b8161475357fe5b0461477f565b61477f6147708383896001600160a01b03166141a9565b886001600160a01b0316614cf7565b979650505050505050565b600080856001600160a01b0316116147a157600080fd5b6000846001600160801b0316116147b757600080fd5b816147c95761469a8585856001614d02565b6146c28585856001614de3565b600080856001600160a01b0316116147ed57600080fd5b6000846001600160801b03161161480357600080fd5b816148155761469a8585856000614de3565b6146c28585856000614d02565b61482a61564a565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b03161161487e576001614880565b845b6001600160801b031673ffffffff00000000000000000000000000000000608085901b16816148ab57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b6148da61564a565b6148e261564a565b888561ffff1661ffff81106148f357fe5b60408051608081018252919092015463ffffffff81168083526401000000008204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061495890899089614ed8565b15614990578663ffffffff16826000015163ffffffff16141561497a57613510565b8161498783898988614822565b91509150613510565b888361ffff168660010161ffff16816149a557fe5b0661ffff1661ffff81106149b557fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909250614a6c57604080516080810182528a5463ffffffff811682526401000000008104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b614a7b88836000015189614ed8565b614ab2576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b614abf8989898887614f9b565b9150915097509795505050505050565b6000614ade60078787876141e3565b60015460025491925090600080600f87900b15614c24576000614aff612c27565b6000805460045492935090918291614b499160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613389565b9092509050614b8360058d8b8d8b8b87898b60007f000000000000000000000000000000000000000000000000000000000000000061513b565b9450614bba60058c8b8d8b8b87898b60017f000000000000000000000000000000000000000000000000000000000000000061513b565b93508415614bee57614bee60068d7f0000000000000000000000000000000000000000000000000000000000000000615325565b8315614c2057614c2060068c7f0000000000000000000000000000000000000000000000000000000000000000615325565b5050505b600080614c3660058c8c8b8a8a61538b565b9092509050614c47878a8484615437565b600089600f0b1215614c75578315614c6457614c6460058c6155cc565b8215614c7557614c7560058b6155cc565b50505050505095945050505050565b60008082600f0b12614caa57614ca5614ca085858560016146cd565b613291565b6146c5565b614cbd614ca085858560000360006146cd565b600003949350505050565b60008082600f0b12614ce457614ca5614ca08585856001614652565b614cbd614ca08585856000036000614652565b808204910615150190565b60008115614d755760006001600160a01b03841115614d3857614d3384600160601b876001600160801b03166132d9565b614d50565b6001600160801b038516606085901b81614d4e57fe5b045b9050614d6d614d686001600160a01b03881683613e0d565b6155f8565b9150506146c5565b60006001600160a01b03841115614da357614d9e84600160601b876001600160801b03166141a9565b614dba565b614dba606085901b6001600160801b038716614cf7565b905080866001600160a01b031611614dd157600080fd5b6001600160a01b0386160390506146c5565b600082614df15750836146c5565b7bffffffffffffffffffffffffffffffff000000000000000000000000606085901b168215614e91576001600160a01b03861684810290858281614e3157fe5b041415614e6257818101828110614e6057614e5683896001600160a01b0316836141a9565b93505050506146c5565b505b614e8882614e83878a6001600160a01b03168681614e7c57fe5b0490613e0d565b614cf7565b925050506146c5565b6001600160a01b03861684810290858281614ea857fe5b04148015614eb557508082115b614ebe57600080fd5b808203614e56614d68846001600160a01b038b16846141a9565b60008363ffffffff168363ffffffff1611158015614f0257508363ffffffff168263ffffffff1611155b15614f1e578163ffffffff168363ffffffff1611159050613382565b60008463ffffffff168463ffffffff1611614f46578363ffffffff1664010000000001614f4e565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614f7f578363ffffffff1664010000000001614f87565b8363ffffffff165b64ffffffffff169091111595945050505050565b614fa361564a565b614fab61564a565b60008361ffff168560010161ffff1681614fc157fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614fee57fe5b0661ffff8110614ffa57fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061506557806001019250614fd9565b898661ffff16826001018161507657fe5b0661ffff811061508257fe5b60408051608081018252929091015463ffffffff811683526401000000008104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906150ed908b908b614ed8565b905080801561510657506151068a8a8760000151614ed8565b15615111575061512e565b8061512157600182039250615128565b8160010193505b50614fd9565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682615166828d6135ef565b9050846001600160801b0316816001600160801b031611156151b4576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b03828116159082161581141594501561528a578c60020b8e60020b1361525a57600183018b9055600283018a90556003830180547fffffffffff0000000000000000000000000000000000000000ffffffffffffff166701000000000000006001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f81b1790555b82546001600160801b0319166001600160801b038216178355856152d35782546152ce906152c990600160801b9004600f90810b810b908f900b6132c3565b613f58565b6152f4565b82546152f4906152c990600160801b9004600f90810b810b908f900b6132a7565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161533457fe5b0760020b1561534257600080fd5b60008061535d8360020b8560020b8161535757fe5b056144b6565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126153d1575050600182015460028301546153e4565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561540657505060018301546002840154615419565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6154d65781516001600160801b03166154ce576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516154e5565b81516154e290866135ef565b90505b60006155098360200151860384600001516001600160801b0316600160801b6132d9565b9050600061552f8460400151860385600001516001600160801b0316600160801b6132d9565b905086600f0b6000146155565787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061558457506000816001600160801b0316115b156155c2576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612beb57600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea164736f6c6343000706000a"; + +bytes constant RAMSES_POOL_CODE = + hex"60a0604052600060809081523390610017828261001e565b50506103a8565b6100318261017360201b6100311760201c565b61006c5760405162461bcd60e51b81526004018080602001828103825260258152602001806106e06025913960400191505060405180910390fd5b6100e4826001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100a857600080fd5b505afa1580156100bc573d6000803e3d6000fd5b505050506040513d60208110156100d257600080fd5b5051610173602090811b61003117901c565b61011f5760405162461bcd60e51b815260040180806020018281038252603481526020018061072b6034913960400191505060405180910390fd5b60008051602061069f83398151915282815581511561016e5761016c610143610179565b836040518060600160405280602181526020016106bf602191396101ec60201b6100371760201c565b505b505050565b3b151590565b60006101836102f1565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156101bb57600080fd5b505afa1580156101cf573d6000803e3d6000fd5b505050506040513d60208110156101e557600080fd5b5051905090565b60606101f784610173565b6102325760405162461bcd60e51b81526004018080602001828103825260268152602001806107056026913960400191505060405180910390fd5b600080856001600160a01b0316856040518082805190602001908083835b6020831061026f5780518252601f199092019160209182019101610250565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146102cf576040519150601f19603f3d011682016040523d82523d6000602084013e6102d4565b606091505b5090925090506102e5828286610304565b925050505b9392505050565b60008051602061069f8339815191525490565b606083156103135750816102ea565b8251156103235782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561036d578181015183820152602001610355565b50505050905090810190601f16801561039a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6102e8806103b76000396000f3fe60806040523661001357610011610017565b005b6100115b61001f61002f565b61002f61002a610148565b6101c8565b565b3b151590565b606061004284610031565b61007d5760405162461bcd60e51b81526004018080602001828103825260268152602001806102b66026913960400191505060405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b602083106100c75780518252601f1990920191602091820191016100a8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610127576040519150601f19603f3d011682016040523d82523d6000602084013e61012c565b606091505b509150915061013c8282866101ec565b925050505b9392505050565b6000610152610290565b73ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561019757600080fd5b505afa1580156101ab573d6000803e3d6000fd5b505050506040513d60208110156101c157600080fd5b5051905090565b3660008037600080366000845af43d6000803e8080156101e7573d6000f35b3d6000fd5b606083156101fb575081610141565b82511561020b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561025557818101518382015260200161023d565b50505050905090810190601f1680156102825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50549056fe416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374a164736f6c6343000706000aa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50426561636f6e50726f78793a2066756e6374696f6e2063616c6c206661696c6564426561636f6e50726f78793a20626561636f6e206973206e6f74206120636f6e7472616374416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374426561636f6e50726f78793a20626561636f6e20696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374"; + +bytes constant HYPERVISOR_CODE = + hex"6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c961012052600a805460ff60a01b1916600560a01b1790553480156200004a57600080fd5b5060405162004dfe38038062004dfe833981810160405260808110156200007057600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200009c57600080fd5b908301906020820185811115620000b257600080fd5b8251640100000000811182820188101715620000cd57600080fd5b82525081516020918201929091019080838360005b83811015620000fc578181015183820152602001620000e2565b50505050905090810190601f1680156200012a5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200014e57600080fd5b9083019060208201858111156200016457600080fd5b82516401000000008111828201881017156200017f57600080fd5b82525081516020918201929091019080838360005b83811015620001ae57818101518382015260200162000194565b50505050905090810190601f168015620001dc5780820380516001836020036101000a031916815260200191505b506040525050508180604051806040016040528060018152602001603160f81b815250848481600390805190602001906200021992919062000575565b5080516200022f90600490602084019062000575565b50506005805460ff1916601217905550815160208084019190912082519183019190912060c082905260e08190527f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620002886200050d565b60a0526200029881848462000511565b60805261010052505060016007555050506001600160a01b038416620002bd57600080fd5b6001600160a01b038316620002d157600080fd5b600880546001600160a01b0319166001600160a01b03868116919091179182905560408051630dfe168160e01b815290519290911691630dfe168191600480820192602092909190829003018186803b1580156200032e57600080fd5b505afa15801562000343573d6000803e3d6000fd5b505050506040513d60208110156200035a57600080fd5b5051600980546001600160a01b0319166001600160a01b039283161790556008546040805163d21220a760e01b81529051919092169163d21220a7916004808301926020929190829003018186803b158015620003b657600080fd5b505afa158015620003cb573d6000803e3d6000fd5b505050506040513d6020811015620003e257600080fd5b5051600a80546001600160a01b0319166001600160a01b03928316179055600954166200040e57600080fd5b600a546001600160a01b03166200042457600080fd5b600860009054906101000a90046001600160a01b03166001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200047357600080fd5b505afa15801562000488573d6000803e3d6000fd5b505050506040513d60208110156200049f57600080fd5b5051600a805460029290920b62ffffff16600160a81b0262ffffff60a81b199092169190911790555050600b80546001600160a01b03909216660100000000000002600160301b600160d01b0319909216919091179055506000600e55600019600c819055600d5562000621565b4690565b6000838383620005206200050d565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005ad5760008555620005f8565b82601f10620005c857805160ff1916838001178555620005f8565b82800160010185558215620005f8579182015b82811115620005f8578251825591602001919060010190620005db565b50620006069291506200060a565b5090565b5b808211156200060657600081556001016200060b565b60805160a05160c05160e05161010051610120516147936200066b6000398061259e525080612b17525080612b59525080612b38525080612abe525080612aee52506147936000f3fe608060405234801561001057600080fd5b50600436106103155760003560e01c806386a29081116101a7578063c4a7761e116100ee578063d348799711610097578063ddca3f4311610071578063ddca3f4314610a68578063f2fde38b14610a70578063fa08274314610a9657610315565b8063d34879971461096d578063d505accf146109e9578063dd62ed3e14610a3a57610315565b8063d0c93a7c116100c8578063d0c93a7c14610955578063d21220a71461095d578063d2eabcfc1461096557610315565b8063c4a7761e14610925578063c5241e291461092d578063cb122a091461093557610315565b8063a049de6b11610150578063a9059cbb1161012a578063a9059cbb146108e9578063aaf5eb6814610915578063b1a3d5331461091d57610315565b8063a049de6b14610822578063a457c2d714610852578063a85598721461087e57610315565b80638e3c92e4116101815780638e3c92e414610723578063952356561461079457806395d89b411461081a57610315565b806386a290811461070b578063888a9134146107135780638da5cb5b1461071b57610315565b8063395093511161026b578063648cab85116102145780637ecebe00116101ee5780637ecebe0014610612578063854cff2f1461063857806385919c5d1461065e57610315565b8063648cab85146105dc5780636d90a39c146105e457806370a08231146105ec57610315565b8063513ea88411610245578063513ea884146104e457806351e87af71461056a57806363e968361461057257610315565b806339509351146104a857806346904840146104d45780634d461fbb146104dc57610315565b806316f0115b116102cd5780632ab4d052116102a75780632ab4d0521461047a578063313ce567146104825780633644e515146104a057610315565b806316f0115b1461042257806318160ddd1461042a57806323b872dd1461044457610315565b8063095ea7b3116102fe578063095ea7b3146103b65780630dfe1681146103f65780630f35bcac1461041a57610315565b8063065e53601461031a57806306fdde0314610339575b600080fd5b610322610a9e565b6040805160029290920b8252519081900360200190f35b610341610b17565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561037b578181015183820152602001610363565b50505050905090810190601f1680156103a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e2600480360360408110156103cc57600080fd5b506001600160a01b038135169060200135610bae565b604080519115158252519081900360200190f35b6103fe610bcc565b604080516001600160a01b039092168252519081900360200190f35b610322610bdb565b6103fe610beb565b610432610bfa565b60408051918252519081900360200190f35b6103e26004803603606081101561045a57600080fd5b506001600160a01b03813581169160208101359091169060400135610c00565b610432610c88565b61048a610c8e565b6040805160ff9092168252519081900360200190f35b610432610c97565b6103e2600480360360408110156104be57600080fd5b506001600160a01b038135169060200135610ca6565b6103fe610cf4565b610432610d03565b610536600480360360808110156104fa57600080fd5b8101908080608001906004806020026040519081016040528092919082600460200280828437600092019190915250919450610d099350505050565b604080516001600160801b039586168152938516602085015291841683830152909216606082015290519081900360800190f35b610322610f60565b6105da600480360360c081101561058857600080fd5b6040805180820182528335600290810b946020810135820b9484820135946060830135949183019360c0840192916080850191908390839080828437600092019190915250919450610f699350505050565b005b610432610ff6565b6103e2610ffc565b6104326004803603602081101561060257600080fd5b50356001600160a01b031661100c565b6104326004803603602081101561062857600080fd5b50356001600160a01b031661102b565b6105da6004803603602081101561064e57600080fd5b50356001600160a01b031661104c565b6105da60048036036101a081101561067557600080fd5b60408051608081810183528435600290810b956020810135820b9594810135820b94606082013590920b936001600160a01b03848301351693928201926101208301919060a0840190600490839083908082843760009201919091525050604080516080818101909252929594938181019392509060049083908390808284376000920191909152509194506110ce9350505050565b6103fe6116f3565b610322611702565b6103fe611712565b610432600480360361010081101561073a57600080fd5b60408051608081810183528435946020810135946001600160a01b03948201358516946060830135169390820192610100830191908084019060049083908390808284376000920191909152509194506117289350505050565b610801600480360360a08110156107aa57600080fd5b6040805180820182528335600290810b946020810135820b946001600160801b0385830135169490820193919260a0840192916060850191908390839080828437600092019190915250919450611bc59350505050565b6040805192835260208301919091528051918290030190f35b610341611c5d565b61082a611cbe565b604080516001600160801b039094168452602084019290925282820152519081900360600190f35b6103e26004803603604081101561086857600080fd5b506001600160a01b038135169060200135611d44565b610801600480360360e081101561089457600080fd5b60408051608081810183528435946001600160a01b036020820135811695948201351693810192909160e08301919060608401906004908390839080828437600092019190915250919450611dac9350505050565b6103e2600480360360408110156108ff57600080fd5b506001600160a01b03813516906020013561214e565b610432612162565b6105da612175565b6108016121e9565b6105da6122f9565b6105da6004803603602081101561094b57600080fd5b503560ff1661236b565b61032261241a565b6103fe61242a565b61082a612439565b6105da6004803603606081101561098357600080fd5b8135916020810135918101906060810160408201356401000000008111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111640100000000831117156109de57600080fd5b509092509050612495565b6105da600480360360e08110156109ff57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c0013561252f565b61043260048036036040811015610a5057600080fd5b506001600160a01b03813581169160200135166126e6565b61048a612711565b6105da60048036036020811015610a8657600080fd5b50356001600160a01b0316612721565b6103226127c8565b60085460408051633850c7bd60e01b815290516000926001600160a01b031691633850c7bd9160048083019260e0929190829003018186803b158015610ae357600080fd5b505afa158015610af7573d6000803e3d6000fd5b505050506040513d60e0811015610b0d57600080fd5b5060200151919050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ba35780601f10610b7857610100808354040283529160200191610ba3565b820191906000526020600020905b815481529060010190602001808311610b8657829003601f168201915b505050505090505b90565b6000610bc2610bbb6127d8565b84846127dc565b5060015b92915050565b6009546001600160a01b031681565b600b546301000000900460020b81565b6008546001600160a01b031681565b60025490565b6000610c0d8484846128c8565b610c7d84610c196127d8565b610c78856040518060600160405280602881526020016146a6602891396001600160a01b038a16600090815260016020526040812090610c576127d8565b6001600160a01b031681526020810191909152604001600020549190612a23565b6127dc565b5060015b9392505050565b600e5481565b60055460ff1690565b6000610ca1612aba565b905090565b6000610bc2610cb36127d8565b84610c788560016000610cc46127d8565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612b84565b6010546001600160a01b031681565b600d5481565b600080600080600b60069054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b031614610d77576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b610d7f612bde565b5050600a54600954604080516370a0823160e01b81523060048201529051600093610e9593600160c01b8204600290810b94600160d81b909304900b926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610ded57600080fd5b505afa158015610e01573d6000803e3d6000fd5b505050506040513d6020811015610e1757600080fd5b5051600a54604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610e6457600080fd5b505afa158015610e78573d6000803e3d6000fd5b505050506040513d6020811015610e8e57600080fd5b5051612c29565b600a548751919250610eca91600160c01b8204600290810b92600160d81b9004900b90849030908b60015b6020020151612ccf565b600b54600954604080516370a0823160e01b81523060048201529051610f2d93600281810b946301000000909204900b926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610ded57600080fd5b600b546040880151919250610f5891600282810b9263010000009004900b90849030908b6003610ec0565b509193509193565b600b5460020b81565b600b54600160301b90046001600160a01b03163314610fbc576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b610fc68585612ea1565b506000610fd586868686612c29565b9050610fee868683308660006020020151876001610ec0565b505050505050565b600c5481565b601054600160a01b900460ff1681565b6001600160a01b0381166000908152602081905260409020545b919050565b6001600160a01b0381166000908152600660205260408120610bc690613218565b600b54600160301b90046001600160a01b0316331461109f576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60026007541415611126576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600755600b54600160301b90046001600160a01b0316331461117e576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b8560020b8760020b1280156111b05750600a54600160a81b9004600290810b810b9088900b816111aa57fe5b0760020b155b80156111d95750600a54600160a81b9004600290810b810b9087900b816111d357fe5b0760020b155b6111e257600080fd5b8360020b8560020b1280156112145750600a54600160a81b9004600290810b810b9086900b8161120e57fe5b0760020b155b801561123d5750600a54600160a81b9004600290810b810b9085900b8161123757fe5b0760020b155b61124657600080fd5b8560020b8460020b14158061126157508660020b8560020b14155b61126a57600080fd5b6001600160a01b03831661127d57600080fd5b6010805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385161790556112ad612bde565b5050600a54600090819081906112d890600160c01b8104600290810b91600160d81b9004900b61321c565b600b549295506001600160801b0391821694501691506000908190819061130d90600281810b9163010000009004900b61321c565b600a549295506001600160801b03918216945016915061135790600160c01b8104600290810b91600160d81b9004900b883060018c600060200201518d60015b60200201516132f7565b5050600b5461138790600281810b9163010000009004810b90869030906001908d905b60200201518d600361134d565b50507fbc4c20ad04f161d631d9ce94d27659391196415aa3c42f6a71c62e905ece782d6113b2610a9e565b600954604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156113fd57600080fd5b505afa158015611411573d6000803e3d6000fd5b505050506040513d602081101561142757600080fd5b5051600a54604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561147457600080fd5b505afa158015611488573d6000803e3d6000fd5b505050506040513d602081101561149e57600080fd5b50516114aa868a612b84565b6114b4868a612b84565b6114bc610bfa565b6040805160029790970b87526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190a18c600a60186101000a81548162ffffff021916908360020b62ffffff1602179055508b600a601b6101000a81548162ffffff021916908360020b62ffffff1602179055506115bc600a60189054906101000a900460020b600a601b9054906101000a900460020b600960009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ded57600080fd5b600a5489519197506115eb91600160c01b8204600290810b92600160d81b9004900b90899030908d6001610ec0565b8a600b60006101000a81548162ffffff021916908360020b62ffffff16021790555089600b60036101000a81548162ffffff021916908360020b62ffffff1602179055506116b4600b60009054906101000a900460020b600b60039054906101000a900460020b600960009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ded57600080fd5b600b5460408a01519194506116df91600282810b9263010000009004900b90869030908d6003610ec0565b505060016007555050505050505050505050565b600f546001600160a01b031681565b600a54600160d81b900460020b81565b600b54600160301b90046001600160a01b031681565b600060026007541415611782576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600755851515806117955750600085115b61179e57600080fd5b600c5486111580156117b25750600d548511155b6117bb57600080fd5b6001600160a01b038416158015906117dc57506001600160a01b0384163014155b611812576040805162461bcd60e51b8152602060048201526002602482015261746f60f01b604482015290519081900360640190fd5b600f546001600160a01b03163314611857576040805162461bcd60e51b815260206004820152600360248201526257484560e81b604482015290519081900360640190fd5b61185f612bde565b505060085460408051633850c7bd60e01b815290516000926001600160a01b031691633850c7bd9160048083019260e0929190829003018186803b1580156118a657600080fd5b505afa1580156118ba573d6000803e3d6000fd5b505050506040513d60e08110156118d057600080fd5b5051905060006119066118ec6001600160a01b03841680613545565b6ec097ce7bc90715b34b9f1000000000600160c01b61359e565b90506000806119136121e9565b909250905061194561193e6ec097ce7bc90715b34b9f10000000006119388d87613545565b9061364d565b8a90612b84565b9450891561196557600954611965906001600160a01b031688308d6136b4565b881561198357600a54611983906001600160a01b031688308c6136b4565b600061198d610bfa565b90508015611b0f5760006119b46ec097ce7bc90715b34b9f10000000006119388688613545565b90506119cd6119c38285612b84565b6119388985613545565b601054909750600160a01b900460ff1615611b0d57600a54600954604080516370a0823160e01b81523060048201529051600093611a4e93600160c01b8204600290810b94600160d81b909304900b926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015610ded57600080fd5b600a548a51919250611a7d91600160c01b8204600290810b92600160d81b9004900b90849030908e6001610ec0565b600b54600954604080516370a0823160e01b81523060048201529051611ae093600281810b946301000000909204900b926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610ded57600080fd5b600b5460408b0151919250611b0b91600282810b9263010000009004900b90849030908e6003610ec0565b505b505b611b198987613723565b60408051878152602081018d90528082018c905290516001600160a01b03808c1692908b16917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f69181900360600190a3600e541580611b7a5750600e548111155b611bb1576040805162461bcd60e51b81526020600482015260036024820152620dac2f60eb1b604482015290519081900360640190fd5b505060016007555091979650505050505050565b600b546000908190600160301b90046001600160a01b03163314611c1d576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b611c278686612ea1565b50611c508686611c418989896001600160801b0316613813565b8651309060009089600161134d565b9097909650945050505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ba35780601f10610b7857610100808354040283529160200191610ba3565b600b5460009081908190819081908190611ce690600281810b9163010000009004900b61321c565b600b549295509093509150611d0a90600281810b9163010000009004900b85613853565b9095509350611d22856001600160801b038416612b84565b9450611d37846001600160801b038316612b84565b9350829550505050909192565b6000610bc2611d516127d8565b84610c78856040518060600160405280602581526020016147626025913960016000611d7b6127d8565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612a23565b60008060026007541415611e07576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260075585611e5e576040805162461bcd60e51b815260206004820152600660248201527f7368617265730000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038516611e9e576040805162461bcd60e51b8152602060048201526002602482015261746f60f01b604482015290519081900360640190fd5b611ea6612bde565b5050600a546000908190611ee490600160c01b8104600290810b91600160d81b9004900b611ed582828d613813565b88518b906000908b600161134d565b600b5491935091506000908190611f1a90600281810b9163010000009004900b611f0f82828f613813565b8c60008c600261137a565b915091506000611fc3611f2b610bfa565b6119388d600960009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d6020811015611fbb57600080fd5b505190613545565b90506000612038611fd2610bfa565b6119388e600a60009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f9157600080fd5b9050811561205757600954612057906001600160a01b03168c846138fd565b801561207457600a54612074906001600160a01b03168c836138fd565b612088826120828887612b84565b90612b84565b9750612098816120828786612b84565b96506001600160a01b038a1633146120dd576040805162461bcd60e51b815260206004820152600360248201526237bbb760e91b604482015290519081900360640190fd5b6120e78a8d613969565b604080518d8152602081018a905280820189905290516001600160a01b03808e1692908d16917febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f9181900360600190a3505050505050600160078190555094509492505050565b6000610bc261215b6127d8565b84846128c8565b6ec097ce7bc90715b34b9f100000000081565b600b54600160301b90046001600160a01b031633146121c8576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000806000806121f7612439565b9250925050600080612207611cbe565b600954604080516370a0823160e01b81523060048201529051939650919450612295935085926120829289926001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d602081101561228d57600080fd5b505190612b84565b600a54604080516370a0823160e01b815230600482015290519298506122ef9284926120829288926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561226357600080fd5b9450505050509091565b600b54600160301b90046001600160a01b0316331461234c576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600f805473ffffffffffffffffffffffffffffffffffffffff19169055565b600b54600160301b90046001600160a01b031633146123be576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600a805460ff808416600160a01b90810260ff60a01b199093169290921792839055604080519290930416815290517f91f2ade82ab0e77bb6823899e6daddc07e3da0e3ad998577e7c09c2f38943c439181900360200190a150565b600a54600160a81b900460020b81565b600a546001600160a01b031681565b60008060008060008061246a600a60189054906101000a900460020b600a601b9054906101000a900460020b61321c565b600a549295509093509150611d0a90600160c01b8104600290810b91600160d81b9004900b85613853565b6008546001600160a01b031633146124ac57600080fd5b601054600160a81b900460ff1615156001146124c757600080fd5b601080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055831561250c5760095461250c906001600160a01b031633866138fd565b821561252957600a54612529906001600160a01b031633856138fd565b50505050565b83421115612584576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f0000000000000000000000000000000000000000000000000000000000000000908990899089906125cd90613218565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b031681526020018481526020018381526020018281526020019650505050505050604051602081830303815290604052805190602001209050600061263682613a65565b9050600061264682878787613ab1565b9050896001600160a01b0316816001600160a01b0316146126ae576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a1660009081526006602052604090206126cf90613c26565b6126da8a8a8a6127dc565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a54600160a01b900460ff1681565b600b54600160301b90046001600160a01b03163314612774576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b6001600160a01b03811661278757600080fd5b600b80546001600160a01b03909216600160301b027fffffffffffff0000000000000000000000000000000000000000ffffffffffff909216919091179055565b600a54600160c01b900460020b81565b3390565b6001600160a01b0383166128215760405162461bcd60e51b81526004018080602001828103825260248152602001806147146024913960400191505060405180910390fd5b6001600160a01b0382166128665760405162461bcd60e51b81526004018080602001828103825260228152602001806145d36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661290d5760405162461bcd60e51b81526004018080602001828103825260258152602001806146ef6025913960400191505060405180910390fd5b6001600160a01b0382166129525760405162461bcd60e51b815260040180806020018281038252602381526020018061458e6023913960400191505060405180910390fd5b61295d838383613964565b61299a816040518060600160405280602681526020016145f5602691396001600160a01b0386166000908152602081905260409020549190612a23565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546129c99082612b84565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115612ab25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a77578181015183820152602001612a5f565b50505050905090810190601f168015612aa45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60007f0000000000000000000000000000000000000000000000000000000000000000612ae5613c2f565b1415612b1257507f0000000000000000000000000000000000000000000000000000000000000000610bab565b612b7d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613c33565b9050610bab565b600082820183811015610c81576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600a546000908190612c0590600160c01b8104600290810b91600160d81b9004900b612ea1565b600b54909250612c2390600281810b9163010000009004900b612ea1565b90509091565b600080600860009054906101000a90046001600160a01b03166001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015612c7a57600080fd5b505afa158015612c8e573d6000803e3d6000fd5b505050506040513d60e0811015612ca457600080fd5b50519050612cc581612cb588613c95565b612cbe88613c95565b8787613fd4565b9695505050505050565b6001600160801b03841615610fee576001601060156101000a81548160ff021916908315150217905550600080600860009054906101000a90046001600160a01b03166001600160a01b0316633c8a7d8d308a8a8a8a60405160200180826001600160a01b031681526020019150506040516020818303038152906040526040518663ffffffff1660e01b815260040180866001600160a01b031681526020018560020b81526020018460020b8152602001836001600160801b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612dc9578181015183820152602001612db1565b50505050905090810190601f168015612df65780820380516001836020036101000a031916815260200191505b5096505050505050506040805180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b505050506040513d6040811015612e4257600080fd5b5080516020909101519092509050838210801590612e605750828110155b612e97576040805162461bcd60e51b815260206004820152600360248201526250534360e81b604482015290519081900360640190fd5b5050505050505050565b6000612ead838361321c565b50909150506001600160801b03811615610bc6576008546040805163a34123a760e01b8152600286810b600483015285900b602482015260006044820181905282516001600160a01b039094169363a34123a7936064808501949193918390030190829087803b158015612f2057600080fd5b505af1158015612f34573d6000803e3d6000fd5b505050506040513d6040811015612f4a57600080fd5b5050600854604080516309e3d67b60e31b8152306004820152600286810b602483015285900b60448201526001600160801b03606482018190526084820152815160009384936001600160a01b0390911692634f1eb3d89260a4808301939282900301818787803b158015612fbe57600080fd5b505af1158015612fd2573d6000803e3d6000fd5b505050506040513d6040811015612fe857600080fd5b508051602091820151600a546040805160ff600160a01b9093049290921682526001600160801b039384169482018590529290911681830181905291519294509092507f4606b8a47eb284e8e80929101ece6ab5fe8d4f8735acc56bd0c92ca872f2cfe7919081900360600190a1600a54600090613071908490600160a01b900460ff1661364d565b1180156130f25750600954604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156130c457600080fd5b505afa1580156130d8573d6000803e3d6000fd5b505050506040513d60208110156130ee57600080fd5b5051115b1561313357601054600a54613133916001600160a01b031690613120908590600160a01b900460ff1661364d565b6009546001600160a01b031691906138fd565b600a5460009061314e908390600160a01b900460ff1661364d565b1180156131cf5750600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156131a157600080fd5b505afa1580156131b5573d6000803e3d6000fd5b505050506040513d60208110156131cb57600080fd5b5051115b1561321057601054600a54613210916001600160a01b0316906131fd908490600160a01b900460ff1661364d565b600a546001600160a01b031691906138fd565b505092915050565b5490565b604080513060601b602080830191909152600285810b60e890811b60348501529085900b901b60378301528251808303601a018152603a83018085528151919092012060085463514ea4bf60e01b909252603e830181905292516000938493849391926001600160a01b039092169163514ea4bf91605e8082019260a092909190829003018186803b1580156132b157600080fd5b505afa1580156132c5573d6000803e3d6000fd5b505050506040513d60a08110156132db57600080fd5b5080516060820151608090920151909891975095509350505050565b6000806001600160801b03871615613539576008546040805163a34123a760e01b815260028c810b60048301528b900b60248201526001600160801b038a166044820152815160009384936001600160a01b039091169263a34123a7926064808301939282900301818787803b15801561337057600080fd5b505af1158015613384573d6000803e3d6000fd5b505050506040513d604081101561339a57600080fd5b50805160209091015190925090508582108015906133b85750848110155b6133ef576040805162461bcd60e51b815260206004820152600360248201526250534360e81b604482015290519081900360640190fd5b600087613404576133ff8361408c565b61340d565b6001600160801b035b90506000886134245761341f8361408c565b61342d565b6001600160801b035b90506000826001600160801b0316118061345057506000816001600160801b0316115b1561353457600860009054906101000a90046001600160a01b03166001600160a01b0316634f1eb3d88b8f8f86866040518663ffffffff1660e01b815260040180866001600160a01b031681526020018560020b81526020018460020b8152602001836001600160801b03168152602001826001600160801b03168152602001955050505050506040805180830381600087803b1580156134f057600080fd5b505af1158015613504573d6000803e3d6000fd5b505050506040513d604081101561351a57600080fd5b5080516020909101516001600160801b0391821697501694505b505050505b97509795505050505050565b60008261355457506000610bc6565b8282028284828161356157fe5b0414610c815760405162461bcd60e51b81526004018080602001828103825260218152602001806146856021913960400191505060405180910390fd5b60008080600019858709868602925082811090839003039050806135d457600084116135c957600080fd5b508290049050610c81565b8084116135e057600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60008082116136a3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816136ac57fe5b049392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b1790526125299085906140a3565b6001600160a01b03821661377e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61378a60008383613964565b6002546137979082612b84565b6002556001600160a01b0382166000908152602081905260409020546137bd9082612b84565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600080613820858561321c565b5050905061384a613845613832610bfa565b6119386001600160801b03851687613545565b61408c565b95945050505050565b6000806000600860009054906101000a90046001600160a01b03166001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156138a657600080fd5b505afa1580156138ba573d6000803e3d6000fd5b505050506040513d60e08110156138d057600080fd5b505190506138f0816138e188613c95565b6138ea88613c95565b87614154565b9250925050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1790526139649084906140a3565b505050565b6001600160a01b0382166139ae5760405162461bcd60e51b81526004018080602001828103825260218152602001806146ce6021913960400191505060405180910390fd5b6139ba82600083613964565b6139f7816040518060600160405280602281526020016145b1602291396001600160a01b0385166000908152602081905260409020549190612a23565b6001600160a01b038316600090815260208190526040902055600254613a1d90826141f0565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613a6f612aba565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115613b125760405162461bcd60e51b815260040180806020018281038252602281526020018061461b6022913960400191505060405180910390fd5b8360ff16601b1480613b2757508360ff16601c145b613b625760405162461bcd60e51b81526004018080602001828103825260228152602001806146636022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613bbe573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661384a576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b80546001019055565b4690565b6000838383613c40613c2f565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b60008060008360020b12613cac578260020b613cb4565b8260020b6000035b9050620d89e8811115613cf2576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216613d1357700100000000000000000000000000000000613d25565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615613d59576ffff97272373d413259a46990580e213a0260801c5b6004821615613d78576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615613d97576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613db6576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613dd5576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615613df4576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613e13576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615613e33576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615613e53576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615613e73576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615613e93576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613eb3576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613ed3576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613ef3576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613f13576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613f34576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613f54576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615613f73576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613f90576b048a170391f7dc42444e8fa20260801c5b60008460020b1315613fab578060001981613fa757fe5b0490505b640100000000810615613fbf576001613fc2565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b03161115613ff4579293925b846001600160a01b0316866001600160a01b03161161401f5761401885858561424d565b905061384a565b836001600160a01b0316866001600160a01b0316101561408157600061404687868661424d565b905060006140558789866142b0565b9050806001600160801b0316826001600160801b0316106140765780614078565b815b9250505061384a565b612cc58585846142b0565b60006001600160801b0382111561409f57fe5b5090565b60006140f8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142f59092919063ffffffff16565b8051909150156139645780806020019051602081101561411757600080fd5b50516139645760405162461bcd60e51b815260040180806020018281038252602a815260200180614738602a913960400191505060405180910390fd5b600080836001600160a01b0316856001600160a01b03161115614175579293925b846001600160a01b0316866001600160a01b0316116141a057614199858585614304565b91506141e7565b836001600160a01b0316866001600160a01b031610156141d9576141c5868585614304565b91506141d285878561436d565b90506141e7565b6141e485858561436d565b90505b94509492505050565b600082821115614247576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000826001600160a01b0316846001600160a01b0316111561426d579192915b6000614290856001600160a01b0316856001600160a01b0316600160601b61359e565b905061384a6142ab84838888036001600160a01b031661359e565b6143b0565b6000826001600160a01b0316846001600160a01b031611156142d0579192915b6142ed6142ab83600160601b8787036001600160a01b031661359e565b949350505050565b60606142ed84846000856143c6565b6000826001600160a01b0316846001600160a01b03161115614324579192915b836001600160a01b031661435d606060ff16846001600160801b0316901b8686036001600160a01b0316866001600160a01b031661359e565b8161436457fe5b04949350505050565b6000826001600160a01b0316846001600160a01b0316111561438d579192915b6142ed826001600160801b03168585036001600160a01b0316600160601b61359e565b806001600160801b038116811461102657600080fd5b6060824710156144075760405162461bcd60e51b815260040180806020018281038252602681526020018061463d6026913960400191505060405180910390fd5b61441085614521565b614461576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061449f5780518252601f199092019160209182019101614480565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614501576040519150601f19603f3d011682016040523d82523d6000602084013e614506565b606091505b5091509150614516828286614527565b979650505050505050565b3b151590565b60608315614536575081610c81565b8251156145465782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315612a77578181015183820152602001612a5f56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c45434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa164736f6c6343000706000a"; diff --git a/contracts/test_utils/ChainlinkMock.sol b/contracts/test_utils/ChainlinkMock.sol index 6e1a82c..134d749 100644 --- a/contracts/test_utils/ChainlinkMock.sol +++ b/contracts/test_utils/ChainlinkMock.sol @@ -4,27 +4,31 @@ pragma solidity 0.8.17; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; contract ChainlinkMock is AggregatorV3Interface { - string private desc; int256 private price; - struct PriceRound { uint256 timestamp; int256 price; } + struct PriceRound { + uint256 timestamp; + int256 price; + } - constructor (string memory _desc) { + constructor(string memory _desc) { desc = _desc; } - function decimals() external pure returns (uint8) { return 8; } + function decimals() external pure returns (uint8) { + return 8; + } function setPrice(int256 _price) external { price = _price; } - function latestRoundData() external view returns (uint80,int256 answer,uint256,uint256,uint80) { + function latestRoundData() external view returns (uint80, int256 answer, uint256, uint256, uint80) { answer = price; } - function getRoundData(uint80 _roundId) external view returns (uint80,int256 answer,uint256,uint256,uint80) { + function getRoundData(uint80 _roundId) external view returns (uint80, int256 answer, uint256, uint256, uint80) { answer = price; } diff --git a/contracts/test_utils/ERC20Mock.sol b/contracts/test_utils/ERC20Mock.sol index df1b283..c0d96c8 100644 --- a/contracts/test_utils/ERC20Mock.sol +++ b/contracts/test_utils/ERC20Mock.sol @@ -17,4 +17,4 @@ contract ERC20Mock is ERC20 { function decimals() public view override returns (uint8) { return dec; } -} \ No newline at end of file +} diff --git a/contracts/test_utils/HypervisorMock.sol b/contracts/test_utils/HypervisorMock.sol index edb9689..b4e83bc 100644 --- a/contracts/test_utils/HypervisorMock.sol +++ b/contracts/test_utils/HypervisorMock.sol @@ -9,7 +9,7 @@ contract HypervisorMock is IHypervisor, ERC20 { address public immutable token0; address public immutable token1; - constructor (string memory _name, string memory _symbol, address _token0, address _token1) ERC20(_name, _symbol) { + constructor(string memory _name, string memory _symbol, address _token0, address _token1) ERC20(_name, _symbol) { token0 = _token0; token1 = _token1; } @@ -19,25 +19,20 @@ contract HypervisorMock is IHypervisor, ERC20 { total1 = IERC20(token1).balanceOf(address(this)); } - function deposit( - uint256 deposit0, - uint256 deposit1, - address to, - address from, - uint256[4] memory inMin - ) external returns (uint256 shares) { + function deposit(uint256 deposit0, uint256 deposit1, address to, address from, uint256[4] memory inMin) + external + returns (uint256 shares) + { IERC20(token0).transferFrom(from, address(this), deposit0); IERC20(token1).transferFrom(from, address(this), deposit1); // simplified calculation because our mock will not deal with a changing swap rate _mint(to, deposit0); } - function withdraw( - uint256 shares, - address to, - address from, - uint256[4] memory minAmounts - ) external returns (uint256 amount0, uint256 amount1) { + function withdraw(uint256 shares, address to, address from, uint256[4] memory minAmounts) + external + returns (uint256 amount0, uint256 amount1) + { (uint256 _total0, uint256 _total1) = getTotalAmounts(); amount0 = shares * _total0 / totalSupply(); amount1 = shares * _total1 / totalSupply(); @@ -45,4 +40,16 @@ contract HypervisorMock is IHypervisor, ERC20 { IERC20(token0).transfer(to, amount0); IERC20(token1).transfer(to, amount1); } -} \ No newline at end of file + + function rebalance( + int24 baseLower, + int24 baseUpper, + int24 limitLower, + int24 limitUpper, + address feeRecipient, + uint256[4] memory baseFees, + uint256[4] memory limitFees + ) external {} + + function setWhitelist(address _address) external {} +} diff --git a/contracts/test_utils/LimitedERC20.sol b/contracts/test_utils/LimitedERC20.sol index 1a1bac8..f82c7ce 100644 --- a/contracts/test_utils/LimitedERC20.sol +++ b/contracts/test_utils/LimitedERC20.sol @@ -15,7 +15,7 @@ contract LimitedERC20 is ERC20 { AMOUNT = 1000 * 10 ** dec; } - modifier limit { + modifier limit() { require(requests[msg.sender] < block.timestamp - 1 days, "err-limited"); _; } @@ -28,4 +28,4 @@ contract LimitedERC20 is ERC20 { function decimals() public view override returns (uint8) { return dec; } -} \ No newline at end of file +} diff --git a/contracts/test_utils/MockNFTMetadataGenerator.sol b/contracts/test_utils/MockNFTMetadataGenerator.sol new file mode 100644 index 0000000..567c0a8 --- /dev/null +++ b/contracts/test_utils/MockNFTMetadataGenerator.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "@openzeppelin/contracts/utils/Base64.sol"; +import "contracts/interfaces/ISmartVault.sol"; +import "contracts/interfaces/INFTMetadataGenerator.sol"; + +contract MockNFTMetadataGenerator is INFTMetadataGenerator { + function generateNFTMetadata(uint256 _tokenId, ISmartVault.Status memory _vaultStatus) + external + view + returns (string memory) + { + return string( + abi.encodePacked( + "data:application/json;base64,", + Base64.encode( + abi.encodePacked( + "{", + '"name": "The Standard Smart Vault #', + '"description": "The Standard Smart Vault', + '"attributes": [', + "],", + '"image_data": "', + '"', + "}" + ) + ) + ) + ); + } +} diff --git a/contracts/test_utils/MockRamsesFactory.sol b/contracts/test_utils/MockRamsesFactory.sol new file mode 100644 index 0000000..d095e51 --- /dev/null +++ b/contracts/test_utils/MockRamsesFactory.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "./BytecodeConstants.sol"; + +contract MockRamsesFactory { + address fakePool; + + constructor(address _fakePool) { + fakePool = _fakePool; + } + + function implementation() external view returns (address) { + return fakePool; + } + + function deploy(address tokenA, address tokenB) external returns (address pool) { + (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + bytes32 salt = keccak256(abi.encode(token0, token1, uint24(500))); + bytes memory bytecode = RAMSES_POOL_CODE; + assembly { + pool := create2(0, add(bytecode, 0x20), mload(bytecode), salt) + } + } +} diff --git a/contracts/test_utils/MockRamsesPool.sol b/contracts/test_utils/MockRamsesPool.sol new file mode 100644 index 0000000..679b638 --- /dev/null +++ b/contracts/test_utils/MockRamsesPool.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +contract MockRamsesPool { + uint160 public sqrtPriceX96; + + function setPrice(uint160 _sqrtPriceX96) public { + sqrtPriceX96 = _sqrtPriceX96; + } + + function slot0() external view returns (uint160, int24, uint16, uint16, uint16, uint8, bool) { + return (sqrtPriceX96, 0, 0, 0, 0, 0, false); + } +} diff --git a/contracts/test_utils/MockSwapRouter.sol b/contracts/test_utils/MockSwapRouter.sol index 775c47b..f74001d 100644 --- a/contracts/test_utils/MockSwapRouter.sol +++ b/contracts/test_utils/MockSwapRouter.sol @@ -4,7 +4,12 @@ pragma solidity 0.8.17; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "contracts/interfaces/ISwapRouter.sol"; -contract MockSwapRouter is ISwapRouter { +import {IPeripheryImmutableState} from "contracts/interfaces/IPeripheryImmutableState.sol"; +import {FullMath} from "contracts/uniswap/FullMath.sol"; + +import {console} from "forge-std/console.sol"; + +contract MockSwapRouter is ISwapRouter, IPeripheryImmutableState { address private tokenIn; address private tokenOut; uint24 private fee; @@ -15,11 +20,37 @@ contract MockSwapRouter is ISwapRouter { uint160 private sqrtPriceLimitX96; uint256 private txValue; + address private _factory; + mapping(address => mapping(address => uint256)) private rates; + mapping(address => mapping(address => uint160)) private sqrtRates; struct MockSwapData { - address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; - uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; uint256 txValue; + address tokenIn; + address tokenOut; + uint24 fee; + address recipient; + uint256 deadline; + uint256 amountIn; + uint256 amountOutMinimum; + uint160 sqrtPriceLimitX96; + uint256 txValue; + } + + function getAmountOut(uint256 _amountIn, address _tokenIn, address _tokenOut) private view returns (uint256) { + uint160 sqrtPrice = sqrtRates[_tokenIn][_tokenOut]; + if (sqrtPrice != 0) { + uint256 priceX192 = uint256(sqrtPrice) * uint256(sqrtPrice); + return FullMath.mulDiv(_amountIn, priceX192, 1 << 192); + } + + sqrtPrice = sqrtRates[_tokenOut][_tokenIn]; + if (sqrtPrice != 0) { + uint256 priceX192 = uint256(sqrtPrice) * uint256(sqrtPrice); + return FullMath.mulDiv(_amountIn, 1 << 192, priceX192); + } + + return rates[_tokenIn][_tokenOut] * _amountIn / 1e18; } function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 _amountOut) { @@ -33,7 +64,9 @@ contract MockSwapRouter is ISwapRouter { sqrtPriceLimitX96 = params.sqrtPriceLimitX96; txValue = msg.value; - _amountOut = rates[tokenIn][tokenOut] * amountIn / 1e18; + uint256 amountInAfterFee = amountIn * (1e6 - fee) / 1e6; + + _amountOut = getAmountOut(amountInAfterFee, tokenIn, tokenOut); require(_amountOut > amountOutMinimum); if (msg.value == 0) { IERC20(tokenIn).transferFrom(msg.sender, address(this), params.amountIn); @@ -43,8 +76,7 @@ contract MockSwapRouter is ISwapRouter { function receivedSwap() external view returns (MockSwapData memory) { return MockSwapData( - tokenIn, tokenOut, fee, recipient, deadline, amountIn, amountOutMinimum, - sqrtPriceLimitX96, txValue + tokenIn, tokenOut, fee, recipient, deadline, amountIn, amountOutMinimum, sqrtPriceLimitX96, txValue ); } @@ -59,7 +91,7 @@ contract MockSwapRouter is ISwapRouter { } function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 _amountIn) { - (address _tokenOut, , address _tokenIn) = abi.decode(params.path, (address, uint24, address)); + (address _tokenOut,, address _tokenIn) = abi.decode(params.path, (address, uint24, address)); _amountIn = params.amountOut * 1e18 / rates[_tokenIn][_tokenOut]; require(_amountIn < params.amountInMaximum); if (msg.value == 0) { @@ -68,11 +100,29 @@ contract MockSwapRouter is ISwapRouter { IERC20(_tokenOut).transfer(params.recipient, params.amountOut); } + function getAmountIn(uint256 _amountOut, address _tokenIn, address _tokenOut) private view returns (uint256) { + uint160 sqrtPrice = sqrtRates[_tokenIn][_tokenOut]; + if (sqrtPrice != 0) { + uint256 priceX192 = uint256(sqrtPrice) * uint256(sqrtPrice); + return FullMath.mulDiv(_amountOut, 1 << 192, priceX192); + } + + sqrtPrice = sqrtRates[_tokenOut][_tokenIn]; + if (sqrtPrice != 0) { + uint256 priceX192 = uint256(sqrtPrice) * uint256(sqrtPrice); + return FullMath.mulDiv(_amountOut, priceX192, 1 << 192); + } + + return _amountOut * 1e18 / rates[_tokenIn][_tokenOut]; + } + function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 _amountIn) { - _amountIn = params.amountOut * 1e18 / rates[params.tokenIn][params.tokenOut]; - require(_amountIn < params.amountInMaximum); + _amountIn = getAmountIn(params.amountOut, params.tokenIn, params.tokenOut); + + uint256 amountInWithFee = _amountIn + (_amountIn * params.fee / 1e6); + require(amountInWithFee <= params.amountInMaximum, "price too high"); if (msg.value == 0) { - IERC20(params.tokenIn).transferFrom(msg.sender, address(this), _amountIn); + IERC20(params.tokenIn).transferFrom(msg.sender, address(this), amountInWithFee); } IERC20(params.tokenOut).transfer(params.recipient, params.amountOut); } @@ -80,4 +130,20 @@ contract MockSwapRouter is ISwapRouter { function setRate(address _tokenIn, address _tokenOut, uint256 _rate) external { rates[_tokenIn][_tokenOut] = _rate; } -} \ No newline at end of file + + function setSqrtRate(address _tokenIn, address _tokenOut, uint160 _rate) external { + sqrtRates[_tokenIn][_tokenOut] = _rate; + } + + function getRate(address _tokenIn, address _tokenOut) external view returns (uint256) { + return rates[_tokenIn][_tokenOut]; + } + + function setFactory(address __factory) external { + _factory = __factory; + } + + function factory() external view override returns (address) { + return _factory; + } +} diff --git a/contracts/test_utils/MockUniswapFactory.sol b/contracts/test_utils/MockUniswapFactory.sol new file mode 100644 index 0000000..7f0b8ff --- /dev/null +++ b/contracts/test_utils/MockUniswapFactory.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "./BytecodeConstants.sol"; + +contract MockUniswapFactory { + struct Parameters { + address factory; + address token0; + address token1; + uint24 fee; + int24 tickSpacing; + } + + Parameters public parameters; + + mapping(uint24 => int24) public feeAmountTickSpacing; + + constructor() { + feeAmountTickSpacing[500] = 10; + feeAmountTickSpacing[3000] = 60; + feeAmountTickSpacing[10000] = 200; + } + + function deploy(address tokenA, address tokenB, uint24 fee) external returns (address pool) { + (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + bytes32 salt = keccak256(abi.encode(token0, token1, fee)); + bytes memory bytecode = UNISWAP_POOL_CODE; + parameters = Parameters({ + factory: address(this), + token0: token0, + token1: token1, + fee: fee, + tickSpacing: feeAmountTickSpacing[fee] + }); + assembly { + pool := create2(0, add(bytecode, 0x20), mload(bytecode), salt) + } + delete parameters; + } +} diff --git a/contracts/test_utils/MockWETH.sol b/contracts/test_utils/MockWETH.sol index 6721d73..6eaffcc 100644 --- a/contracts/test_utils/MockWETH.sol +++ b/contracts/test_utils/MockWETH.sol @@ -5,19 +5,17 @@ import "contracts/test_utils/ERC20Mock.sol"; import "contracts/interfaces/IWETH.sol"; contract MockWETH is IWETH, ERC20Mock { - - constructor() ERC20Mock("Wrapped Ether", "WETH", 18) { - } + constructor() ERC20Mock("Wrapped Ether", "WETH", 18) {} receive() external payable {} function withdraw(uint256 _value) external { _burn(msg.sender, _value); - (bool sent, ) = payable(msg.sender).call{value: _value}(""); + (bool sent,) = payable(msg.sender).call{value: _value}(""); require(sent); } function deposit() external payable { _mint(msg.sender, msg.value); } -} \ No newline at end of file +} diff --git a/contracts/test_utils/USDsMock.sol b/contracts/test_utils/USDsMock.sol index 93d426d..8acf83c 100644 --- a/contracts/test_utils/USDsMock.sol +++ b/contracts/test_utils/USDsMock.sol @@ -20,4 +20,4 @@ contract USDsMock is IUSDs, ERC20, AccessControl { function burn(address from, uint256 amount) public onlyRole(BURNER_ROLE) { _burn(from, amount); } -} \ No newline at end of file +} diff --git a/contracts/test_utils/UniProxyMock.sol b/contracts/test_utils/UniProxyMock.sol index 9664731..d9c8330 100644 --- a/contracts/test_utils/UniProxyMock.sol +++ b/contracts/test_utils/UniProxyMock.sol @@ -7,16 +7,23 @@ import "contracts/interfaces/IUniProxy.sol"; contract UniProxyMock is IUniProxy { mapping(address => mapping(address => uint256)) private ratios; - function getDepositAmount(address vault, address token, uint256 _deposit) external view returns (uint256 amountStart, uint256 amountEnd) { + function getDepositAmount(address vault, address token, uint256 _deposit) + external + view + returns (uint256 amountStart, uint256 amountEnd) + { uint256 _mid = ratios[vault][token] * _deposit / 1e18; return (_mid * 999 / 1000, _mid * 1001 / 1000); } - function deposit(uint256 deposit0, uint256 deposit1, address to, address vault, uint256[4] memory minIn) external returns (uint256 shares) { + function deposit(uint256 deposit0, uint256 deposit1, address to, address vault, uint256[4] memory minIn) + external + returns (uint256 shares) + { IHypervisor(vault).deposit(deposit0, deposit1, to, msg.sender, minIn); } function setRatio(address _vault, address _inToken, uint256 _ratio) external { ratios[_vault][_inToken] = _ratio; } -} \ No newline at end of file +} diff --git a/contracts/uniswap/FullMath.sol b/contracts/uniswap/FullMath.sol new file mode 100644 index 0000000..e091c95 --- /dev/null +++ b/contracts/uniswap/FullMath.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title Contains 512-bit math functions +/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision +/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits +library FullMath { + /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 + /// @param a The multiplicand + /// @param b The multiplier + /// @param denominator The divisor + /// @return result The 256-bit result + /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv + function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) { + unchecked { + // 512-bit multiply [prod1 prod0] = a * b + // Compute the product mod 2**256 and mod 2**256 - 1 + // then use the Chinese Remainder Theorem to reconstruct + // the 512 bit result. The result is stored in two 256 + // variables such that product = prod1 * 2**256 + prod0 + uint256 prod0; // Least significant 256 bits of the product + uint256 prod1; // Most significant 256 bits of the product + assembly { + let mm := mulmod(a, b, not(0)) + prod0 := mul(a, b) + prod1 := sub(sub(mm, prod0), lt(mm, prod0)) + } + + // Handle non-overflow cases, 256 by 256 division + if (prod1 == 0) { + require(denominator > 0); + assembly { + result := div(prod0, denominator) + } + return result; + } + + // Make sure the result is less than 2**256. + // Also prevents denominator == 0 + require(denominator > prod1); + + /////////////////////////////////////////////// + // 512 by 256 division. + /////////////////////////////////////////////// + + // Make division exact by subtracting the remainder from [prod1 prod0] + // Compute remainder using mulmod + uint256 remainder; + assembly { + remainder := mulmod(a, b, denominator) + } + // Subtract 256 bit number from 512 bit number + assembly { + prod1 := sub(prod1, gt(remainder, prod0)) + prod0 := sub(prod0, remainder) + } + + // Factor powers of two out of denominator + // Compute largest power of two divisor of denominator. + // Always >= 1. + uint256 twos = (0 - denominator) & denominator; + // Divide denominator by power of two + assembly { + denominator := div(denominator, twos) + } + + // Divide [prod1 prod0] by the factors of two + assembly { + prod0 := div(prod0, twos) + } + // Shift in bits from prod1 into prod0. For this we need + // to flip `twos` such that it is 2**256 / twos. + // If twos is zero, then it becomes one + assembly { + twos := add(div(sub(0, twos), twos), 1) + } + prod0 |= prod1 * twos; + + // Invert denominator mod 2**256 + // Now that denominator is an odd number, it has an inverse + // modulo 2**256 such that denominator * inv = 1 mod 2**256. + // Compute the inverse by starting with a seed that is correct + // correct for four bits. That is, denominator * inv = 1 mod 2**4 + uint256 inv = (3 * denominator) ^ 2; + // Now use Newton-Raphson iteration to improve the precision. + // Thanks to Hensel's lifting lemma, this also works in modular + // arithmetic, doubling the correct bits in each step. + inv *= 2 - denominator * inv; // inverse mod 2**8 + inv *= 2 - denominator * inv; // inverse mod 2**16 + inv *= 2 - denominator * inv; // inverse mod 2**32 + inv *= 2 - denominator * inv; // inverse mod 2**64 + inv *= 2 - denominator * inv; // inverse mod 2**128 + inv *= 2 - denominator * inv; // inverse mod 2**256 + + // Because the division is now exact we can divide by multiplying + // with the modular inverse of denominator. This will give us the + // correct result modulo 2**256. Since the precoditions guarantee + // that the outcome is less than 2**256, this is the final result. + // We don't need to compute the high bits of the result and prod1 + // is no longer required. + result = prod0 * inv; + return result; + } + } + + /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 + /// @param a The multiplicand + /// @param b The multiplier + /// @param denominator The divisor + /// @return result The 256-bit result + function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) { + unchecked { + result = mulDiv(a, b, denominator); + if (mulmod(a, b, denominator) > 0) { + require(result < type(uint256).max); + result++; + } + } + } + + function sqrt(uint256 x) internal pure returns (uint128) { + if (x == 0) { + return 0; + } else { + uint256 xx = x; + uint256 r = 1; + if (xx >= 0x100000000000000000000000000000000) { + xx >>= 128; + r <<= 64; + } + if (xx >= 0x10000000000000000) { + xx >>= 64; + r <<= 32; + } + if (xx >= 0x100000000) { + xx >>= 32; + r <<= 16; + } + if (xx >= 0x10000) { + xx >>= 16; + r <<= 8; + } + if (xx >= 0x100) { + xx >>= 8; + r <<= 4; + } + if (xx >= 0x10) { + xx >>= 4; + r <<= 2; + } + if (xx >= 0x8) r <<= 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + uint256 r1 = x / r; + return uint128(r < r1 ? r : r1); + } + } +} diff --git a/contracts/uniswap/LiquidityAmounts.sol b/contracts/uniswap/LiquidityAmounts.sol new file mode 100644 index 0000000..6c91bca --- /dev/null +++ b/contracts/uniswap/LiquidityAmounts.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity >=0.8.0; + +import "src/uniswap/FullMath.sol"; +import "@uniswap/v3-core/contracts/libraries/FixedPoint96.sol"; + +/// @title Liquidity amount functions +/// @notice Provides functions for computing liquidity amounts from token amounts and prices +library LiquidityAmounts { + /// @notice Downcasts uint256 to uint128 + /// @param x The uint258 to be downcasted + /// @return y The passed value, downcasted to uint128 + function toUint128(uint256 x) private pure returns (uint128 y) { + require((y = uint128(x)) == x); + } + + /// @notice Computes the amount of liquidity received for a given amount of token0 and price range + /// @dev Calculates amount0 * (sqrt(upper) * sqrt(lower)) / (sqrt(upper) - sqrt(lower)) + /// @param sqrtRatioAX96 A sqrt price representing the first tick boundary + /// @param sqrtRatioBX96 A sqrt price representing the second tick boundary + /// @param amount0 The amount0 being sent in + /// @return liquidity The amount of returned liquidity + function getLiquidityForAmount0(uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint256 amount0) + internal + pure + returns (uint128 liquidity) + { + if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); + uint256 intermediate = FullMath.mulDiv(sqrtRatioAX96, sqrtRatioBX96, FixedPoint96.Q96); + unchecked { + return toUint128(FullMath.mulDiv(amount0, intermediate, sqrtRatioBX96 - sqrtRatioAX96)); + } + } + + /// @notice Computes the amount of liquidity received for a given amount of token1 and price range + /// @dev Calculates amount1 / (sqrt(upper) - sqrt(lower)). + /// @param sqrtRatioAX96 A sqrt price representing the first tick boundary + /// @param sqrtRatioBX96 A sqrt price representing the second tick boundary + /// @param amount1 The amount1 being sent in + /// @return liquidity The amount of returned liquidity + function getLiquidityForAmount1(uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint256 amount1) + internal + pure + returns (uint128 liquidity) + { + if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); + unchecked { + return toUint128(FullMath.mulDiv(amount1, FixedPoint96.Q96, sqrtRatioBX96 - sqrtRatioAX96)); + } + } + + /// @notice Computes the maximum amount of liquidity received for a given amount of token0, token1, the current + /// pool prices and the prices at the tick boundaries + /// @param sqrtRatioX96 A sqrt price representing the current pool prices + /// @param sqrtRatioAX96 A sqrt price representing the first tick boundary + /// @param sqrtRatioBX96 A sqrt price representing the second tick boundary + /// @param amount0 The amount of token0 being sent in + /// @param amount1 The amount of token1 being sent in + /// @return liquidity The maximum amount of liquidity received + function getLiquidityForAmounts( + uint160 sqrtRatioX96, + uint160 sqrtRatioAX96, + uint160 sqrtRatioBX96, + uint256 amount0, + uint256 amount1 + ) internal pure returns (uint128 liquidity) { + if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); + + if (sqrtRatioX96 <= sqrtRatioAX96) { + liquidity = getLiquidityForAmount0(sqrtRatioAX96, sqrtRatioBX96, amount0); + } else if (sqrtRatioX96 < sqrtRatioBX96) { + uint128 liquidity0 = getLiquidityForAmount0(sqrtRatioX96, sqrtRatioBX96, amount0); + uint128 liquidity1 = getLiquidityForAmount1(sqrtRatioAX96, sqrtRatioX96, amount1); + + liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1; + } else { + liquidity = getLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1); + } + } + + /// @notice Computes the amount of token0 for a given amount of liquidity and a price range + /// @param sqrtRatioAX96 A sqrt price representing the first tick boundary + /// @param sqrtRatioBX96 A sqrt price representing the second tick boundary + /// @param liquidity The liquidity being valued + /// @return amount0 The amount of token0 + function getAmount0ForLiquidity(uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint128 liquidity) + internal + pure + returns (uint256 amount0) + { + unchecked { + if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); + + return FullMath.mulDiv( + uint256(liquidity) << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96 + ) / sqrtRatioAX96; + } + } + + /// @notice Computes the amount of token1 for a given amount of liquidity and a price range + /// @param sqrtRatioAX96 A sqrt price representing the first tick boundary + /// @param sqrtRatioBX96 A sqrt price representing the second tick boundary + /// @param liquidity The liquidity being valued + /// @return amount1 The amount of token1 + function getAmount1ForLiquidity(uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint128 liquidity) + internal + pure + returns (uint256 amount1) + { + if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); + + unchecked { + return FullMath.mulDiv(liquidity, sqrtRatioBX96 - sqrtRatioAX96, FixedPoint96.Q96); + } + } + + /// @notice Computes the token0 and token1 value for a given amount of liquidity, the current + /// pool prices and the prices at the tick boundaries + /// @param sqrtRatioX96 A sqrt price representing the current pool prices + /// @param sqrtRatioAX96 A sqrt price representing the first tick boundary + /// @param sqrtRatioBX96 A sqrt price representing the second tick boundary + /// @param liquidity The liquidity being valued + /// @return amount0 The amount of token0 + /// @return amount1 The amount of token1 + function getAmountsForLiquidity( + uint160 sqrtRatioX96, + uint160 sqrtRatioAX96, + uint160 sqrtRatioBX96, + uint128 liquidity + ) internal pure returns (uint256 amount0, uint256 amount1) { + if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96); + + if (sqrtRatioX96 <= sqrtRatioAX96) { + amount0 = getAmount0ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity); + } else if (sqrtRatioX96 < sqrtRatioBX96) { + amount0 = getAmount0ForLiquidity(sqrtRatioX96, sqrtRatioBX96, liquidity); + amount1 = getAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioX96, liquidity); + } else { + amount1 = getAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity); + } + } +} diff --git a/contracts/uniswap/PoolAddress.sol b/contracts/uniswap/PoolAddress.sol new file mode 100644 index 0000000..8cdcb1c --- /dev/null +++ b/contracts/uniswap/PoolAddress.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity >=0.5.0; + +/// @title Provides functions for deriving a pool address from the factory, tokens, and the fee +library PoolAddress { + bytes32 internal constant UNI_INIT_CODE_HASH = 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54; + + bytes32 public constant RAMSES_INIT_CODE_HASH = 0x1565b129f2d1790f12d45301b9b084335626f0c92410bc43130763b69971135d; + + /// @notice The identifying key of the pool + struct PoolKey { + address token0; + address token1; + uint24 fee; + } + + /// @notice Returns PoolKey: the ordered tokens with the matched fee levels + /// @param tokenA The first token of a pool, unsorted + /// @param tokenB The second token of a pool, unsorted + /// @param fee The fee level of the pool + /// @return Poolkey The pool details with ordered token0 and token1 assignments + function getPoolKey(address tokenA, address tokenB, uint24 fee) internal pure returns (PoolKey memory) { + if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA); + return PoolKey({token0: tokenA, token1: tokenB, fee: fee}); + } + + /// @notice Deterministically computes the pool address given the factory and PoolKey + /// @param factory The Uniswap V3 factory contract address + /// @param key The PoolKey + /// @return pool The contract address of the V3 pool + function computeAddressUniswap(address factory, PoolKey memory key) internal pure returns (address pool) { + require(key.token0 < key.token1); + pool = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + hex"ff", factory, keccak256(abi.encode(key.token0, key.token1, key.fee)), UNI_INIT_CODE_HASH + ) + ) + ) + ) + ); + } + + function computeAddressRamses(address factory, PoolKey memory key) internal pure returns (address pool) { + require(key.token0 < key.token1); + pool = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + hex"ff", + factory, + keccak256(abi.encode(key.token0, key.token1, key.fee)), + RAMSES_INIT_CODE_HASH + ) + ) + ) + ) + ); + } +} diff --git a/contracts/uniswap/TickMath.sol b/contracts/uniswap/TickMath.sol new file mode 100644 index 0000000..17a6093 --- /dev/null +++ b/contracts/uniswap/TickMath.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.0; + +/// @title Math library for computing sqrt prices from ticks and vice versa +/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports +/// prices between 2**-128 and 2**128 +library TickMath { + error T(); + error R(); + + /// @dev The minimum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**-128 + int24 internal constant MIN_TICK = -887272; + /// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128 + int24 internal constant MAX_TICK = -MIN_TICK; + + /// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK) + uint160 internal constant MIN_SQRT_RATIO = 4295128739; + /// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK) + uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342; + + /// @notice Calculates sqrt(1.0001^tick) * 2^96 + /// @dev Throws if |tick| > max tick + /// @param tick The input tick for the above formula + /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0) + /// at the given tick + function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) { + unchecked { + uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick)); + if (absTick > uint256(int256(MAX_TICK))) revert T(); + + uint256 ratio = + absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000; + if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128; + if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128; + if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128; + if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128; + if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128; + if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128; + if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128; + if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128; + if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128; + if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128; + if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128; + if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128; + if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128; + if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128; + if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128; + if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128; + if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128; + if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128; + if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128; + + if (tick > 0) ratio = type(uint256).max / ratio; + + // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96. + // we then downcast because we know the result always fits within 160 bits due to our tick input constraint + // we round up in the division so getTickAtSqrtRatio of the output price is always consistent + sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1)); + } + } + + /// @notice Calculates the greatest tick value such that getRatioAtTick(tick) <= ratio + /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_RATIO, as MIN_SQRT_RATIO is the lowest value getRatioAtTick may + /// ever return. + /// @param sqrtPriceX96 The sqrt ratio for which to compute the tick as a Q64.96 + /// @return tick The greatest tick for which the ratio is less than or equal to the input ratio + function getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) { + unchecked { + // second inequality must be < because the price can never reach the price at the max tick + if (!(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO)) revert R(); + uint256 ratio = uint256(sqrtPriceX96) << 32; + + uint256 r = ratio; + uint256 msb = 0; + + assembly { + let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := shl(5, gt(r, 0xFFFFFFFF)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := shl(4, gt(r, 0xFFFF)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := shl(3, gt(r, 0xFF)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := shl(2, gt(r, 0xF)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := shl(1, gt(r, 0x3)) + msb := or(msb, f) + r := shr(f, r) + } + assembly { + let f := gt(r, 0x1) + msb := or(msb, f) + } + + if (msb >= 128) r = ratio >> (msb - 127); + else r = ratio << (127 - msb); + + int256 log_2 = (int256(msb) - 128) << 64; + + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(63, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(62, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(61, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(60, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(59, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(58, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(57, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(56, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(55, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(54, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(53, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(52, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(51, f)) + r := shr(f, r) + } + assembly { + r := shr(127, mul(r, r)) + let f := shr(128, r) + log_2 := or(log_2, shl(50, f)) + } + + int256 log_sqrt10001 = log_2 * 255738958999603826347141; // 128.128 number + + int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128); + int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128); + + tick = tickLow == tickHi ? tickLow : getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow; + } + } +} diff --git a/echidna-assertion.yaml b/echidna-assertion.yaml new file mode 100644 index 0000000..a864a1a --- /dev/null +++ b/echidna-assertion.yaml @@ -0,0 +1,12 @@ +testMode: "assertion" +prefix: "invariant_" +coverage: true +corpusDir: "echidna/corpus-assertion" +cryticArgs: + [ + "--foundry-compile-all", + "--foundry-out-directory", + "./artifacts/" + ] +deployContracts: + [] diff --git a/echidna-property.yaml b/echidna-property.yaml new file mode 100644 index 0000000..b8f2bc1 --- /dev/null +++ b/echidna-property.yaml @@ -0,0 +1,12 @@ +testMode: "property" +prefix: "invariant_" +coverage: true +corpusDir: "echidna/corpus-property" +cryticArgs: + [ + "--foundry-compile-all", + "--foundry-out-directory", + "./artifacts/" + ] +deployContracts: + [] diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 0000000..6701b77 --- /dev/null +++ b/foundry.toml @@ -0,0 +1,32 @@ +[profile.default] +src = "contracts" +out = "artifacts" +libs = ["node_modules", "lib"] +script = "scripts" +remappings = [ + "@chainlink/=node_modules/@chainlink/", + "@openzeppelin/=node_modules/@openzeppelin/", + "forge-std/=lib/forge-std/src/", + "@chimera/=lib/chimera/src/", + "@crytic/=lib/properties/contracts/", + "src/=contracts/", +] +# via_ir = true +optimizer = true +optimizer_runs = 200 + +fs_permissions = [{ access = "read-write", path = "test/foundry/differential/balances.json"}] + +no_match_path = "test/foundry/invariant/*" +no_match_contract = "CryticTester|CryticToFoundry|FoundryHandler" + +# [fuzz] +# runs = 10000 + +[invariant] +no_match_path = "a^" +match_contract = "FoundryTester" +fail_on_revert = false +show_progress = true + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/lib/chimera b/lib/chimera new file mode 160000 index 0000000..d5cf52b --- /dev/null +++ b/lib/chimera @@ -0,0 +1 @@ +Subproject commit d5cf52bc5bbf75f988f8aada23fd12d0bcf7798a diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 0000000..1714bee --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 1714bee72e286e73f76e320d110e0eaf5c4e649d diff --git a/lib/properties b/lib/properties new file mode 160000 index 0000000..bb1b785 --- /dev/null +++ b/lib/properties @@ -0,0 +1 @@ +Subproject commit bb1b78542b3f38e4ae56cf87389cd3ea94387f48 diff --git a/medusa.json b/medusa.json new file mode 100644 index 0000000..62f91ae --- /dev/null +++ b/medusa.json @@ -0,0 +1,88 @@ +{ + "fuzzing": { + "workers": 10, + "workerResetLimit": 50, + "timeout": 0, + "testLimit": 0, + "callSequenceLength": 100, + "corpusDirectory": "medusa", + "coverageEnabled": true, + "deploymentOrder": [ + "CryticTester" + ], + "targetContracts": [ + "CryticTester" + ], + "targetContractsBalances": [], + "constructorArgs": {}, + "deployerAddress": "0x30000", + "senderAddresses": [ + "0x10000", + "0x20000", + "0x30000" + ], + "blockNumberDelayMax": 60480, + "blockTimestampDelayMax": 604800, + "blockGasLimit": 125000000, + "transactionGasLimit": 12500000, + "testing": { + "stopOnFailedTest": false, + "stopOnFailedContractMatching": false, + "stopOnNoTests": true, + "testAllContracts": false, + "traceAll": false, + "assertionTesting": { + "enabled": true, + "testViewMethods": true, + "panicCodeConfig": { + "failOnCompilerInsertedPanic": false, + "failOnAssertion": true, + "failOnArithmeticUnderflow": false, + "failOnDivideByZero": false, + "failOnEnumTypeConversionOutOfBounds": false, + "failOnIncorrectStorageAccess": false, + "failOnPopEmptyArray": false, + "failOnOutOfBoundsArrayAccess": false, + "failOnAllocateTooMuchMemory": false, + "failOnCallUninitializedVariable": false + } + }, + "propertyTesting": { + "enabled": true, + "testPrefixes": [ + "invariant_" + ] + }, + "optimizationTesting": { + "enabled": false, + "testPrefixes": [ + "optimize_" + ] + } + }, + "chainConfig": { + "codeSizeCheckDisabled": true, + "cheatCodes": { + "cheatCodesEnabled": true, + "enableFFI": false + } + } + }, + "compilation": { + "platform": "crytic-compile", + "platformConfig": { + "target": ".", + "solcVersion": "", + "exportDirectory": "", + "args": [ + "--foundry-compile-all", + "--foundry-out-directory", + "./artifacts/" + ] + } + }, + "logging": { + "level": "info", + "logDirectory": "" + } +} \ No newline at end of file diff --git a/test/foundry/ForkTest.t.sol b/test/foundry/ForkTest.t.sol new file mode 100644 index 0000000..4154c53 --- /dev/null +++ b/test/foundry/ForkTest.t.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "./fixtures/ForkFixture.sol"; +import {IWETH} from "src/interfaces/IWETH.sol"; + +contract ForkTest is ForkFixture { + function setUp() public override { + super.setUp(); + } + + function test_nativeSwap() public { + vm.deal(address(vault), 1 ether); + + vm.assertFalse(vault.undercollateralised()); + + vm.prank(VAULT_OWNER); + vault.swap(NATIVE, WBTC_SYMBOL, 0.5 ether, 0); + } + + function test_wethSwap() public { + vm.deal(VAULT_OWNER, 1 ether); + + vm.prank(VAULT_OWNER); + IWETH(WETH_ADDRESS).deposit{value: 1 ether}(); + + vm.prank(VAULT_OWNER); + IWETH(WETH_ADDRESS).transfer(address(vault), 1 ether); + vm.assertFalse(vault.undercollateralised()); + + vm.deal(address(vault), 0.0025 ether); // to cover fee + + vm.prank(VAULT_OWNER); + vm.expectRevert(); + vault.swap(WETH_SYMBOL, WBTC_SYMBOL, 0.5 ether, 0); + } + + function test_depositAndWithdrawYield() public { + vm.deal(address(vault), 1 ether); + + vm.prank(VAULT_OWNER); + vault.depositYield(NATIVE, 1e4); + + vm.prank(VAULT_OWNER); + vault.withdrawYield(address(usdsHypervisor), NATIVE); + + vm.prank(VAULT_OWNER); + vault.withdrawYield(WBTC_HYPERVISOR_ADDRESS, NATIVE); + } +} diff --git a/test/foundry/SmartVault.t.sol b/test/foundry/SmartVault.t.sol new file mode 100644 index 0000000..c2d42e6 --- /dev/null +++ b/test/foundry/SmartVault.t.sol @@ -0,0 +1,554 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {Test, stdError} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; + +import {IHypervisor} from "contracts/interfaces/IHypervisor.sol"; +import {ERC20Mock} from "src/test_utils/ERC20Mock.sol"; +import {ChainlinkMock} from "src/test_utils/ChainlinkMock.sol"; + +import {SmartVaultFixture, SmartVaultV4} from "./fixtures/SmartVaultFixture.sol"; + +contract SmartVaultTest is SmartVaultFixture, Test { + SmartVaultV4 smartVault; + + // SmartVaultV4 events + event CollateralRemoved(bytes32 symbol, uint256 amount, address to); + event AssetRemoved(address token, uint256 amount, address to); + event USDsMinted(address to, uint256 amount, uint256 fee); + event USDsBurned(uint256 amount, uint256 fee); + + // SmartVaultYieldManager events + event Deposit(address indexed smartVault, address indexed token, uint256 amount, uint256 usdPercentage); + event Withdraw(address indexed smartVault, address indexed token, address hypervisor, uint256 amount); + + function setUp() public override { + super.setUp(); + + smartVault = _createSmartVaultViaManager(VAULT_OWNER); + } + + function test_ownership() public { + address newOwner = makeAddr("New owner"); + + vm.expectRevert(SmartVaultV4.InvalidUser.selector); + smartVault.setOwner(newOwner); + + vm.prank(address(smartVaultManager)); + smartVault.setOwner(newOwner); + assertEq(smartVault.owner(), newOwner); + } + + function test_addCollateral() public { + uint256 usdCollateral = smartVault.status().totalCollateralValue; + assertEq(usdCollateral, 0); + + // add each collateral + _addCollateral(smartVault); + + // expect revert >18 decimal collateral + ERC20Mock largeDecimals = new ERC20Mock("Large Decimals", "XXL", 24); + ChainlinkMock clXxlUsd = new ChainlinkMock("XXL/USD"); + tokenManager.addAcceptedToken(address(largeDecimals), address(clXxlUsd)); + uint256 xxlAmount = 10 ** largeDecimals.decimals(); + largeDecimals.mint(address(smartVault), xxlAmount); + assertEq(largeDecimals.balanceOf(address(smartVault)), xxlAmount); + vm.expectRevert(stdError.arithmeticError); + smartVault.status().totalCollateralValue; + } + + function test_removeCollateralNotUndercollateralised() public { + _addCollateral(smartVault); + + // remove native collateral + uint256 nativeAmount = address(smartVault).balance; + assertTrue(nativeAmount != 0); + uint256 nativeBefore = VAULT_OWNER.balance; + vm.startPrank(VAULT_OWNER); + smartVault.removeCollateralNative(nativeAmount, payable(VAULT_OWNER)); + vm.stopPrank(); + assertEq(address(smartVault).balance, 0); + assertEq(VAULT_OWNER.balance, nativeBefore + nativeAmount); + + // remove weth collateral + uint256 wethAmount = weth.balanceOf(address(smartVault)); + assertTrue(wethAmount != 0); + uint256 wethBefore = weth.balanceOf(VAULT_OWNER); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit CollateralRemoved(bytes32(bytes(weth.symbol())), wethAmount, VAULT_OWNER); + smartVault.removeCollateral(bytes32(bytes(weth.symbol())), wethAmount, VAULT_OWNER); + vm.stopPrank(); + assertEq(weth.balanceOf(address(smartVault)), 0); + assertEq(weth.balanceOf(VAULT_OWNER), wethBefore + wethAmount); + + // remove wbtc collateral + uint256 wbtcAmount = wbtc.balanceOf(address(smartVault)); + assertTrue(wbtcAmount != 0); + uint256 wbtcBefore = wbtc.balanceOf(VAULT_OWNER); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit CollateralRemoved(bytes32(bytes(wbtc.symbol())), wbtcAmount, VAULT_OWNER); + smartVault.removeCollateral(bytes32(bytes(wbtc.symbol())), wbtcAmount, VAULT_OWNER); + vm.stopPrank(); + assertEq(wbtc.balanceOf(address(smartVault)), 0); + assertEq(wbtc.balanceOf(VAULT_OWNER), wbtcBefore + wbtcAmount); + + // remove link collateral + uint256 linkAmount = link.balanceOf(address(smartVault)); + assertTrue(linkAmount != 0); + uint256 linkBefore = link.balanceOf(VAULT_OWNER); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit CollateralRemoved(bytes32(bytes(link.symbol())), linkAmount, VAULT_OWNER); + smartVault.removeCollateral(bytes32(bytes(link.symbol())), linkAmount, VAULT_OWNER); + vm.stopPrank(); + assertEq(link.balanceOf(address(smartVault)), 0); + assertEq(link.balanceOf(VAULT_OWNER), linkBefore + linkAmount); + + // add & remove non-collateral token + uint256 usdcAmount = 10 ** usdc.decimals(); + assertEq(usdc.balanceOf(address(smartVault)), 0); + usdc.mint(address(smartVault), usdcAmount); + assertEq(usdc.balanceOf(address(smartVault)), usdcAmount); + uint256 usdcBefore = usdc.balanceOf(VAULT_OWNER); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit AssetRemoved(address(usdc), usdcAmount, VAULT_OWNER); + smartVault.removeAsset(address(usdc), usdcAmount, VAULT_OWNER); + vm.stopPrank(); + assertEq(usdc.balanceOf(address(smartVault)), 0); + assertEq(usdc.balanceOf(VAULT_OWNER), usdcBefore + usdcAmount); + + assertFalse(smartVault.undercollateralised()); + } + + function test_removeCollateralUndercollateralised() public { + _addCollateral(smartVault); + + uint256 usdsAmount = smartVault.status().maxMintable * 99 / 100; + vm.prank(VAULT_OWNER); + smartVault.mint(VAULT_OWNER, usdsAmount); + + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeCollateralNative(address(smartVault).balance, payable(VAULT_OWNER)); + vm.stopPrank(); + + uint256 wethAmount = weth.balanceOf(address(smartVault)); + bytes32 wethSymbol = bytes32(bytes(weth.symbol())); + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeCollateral(wethSymbol, wethAmount, VAULT_OWNER); + vm.stopPrank(); + + uint256 wbtcAmount = wbtc.balanceOf(address(smartVault)); + bytes32 wbtcSymbol = bytes32(bytes(wbtc.symbol())); + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeCollateral(wbtcSymbol, wbtcAmount, VAULT_OWNER); + vm.stopPrank(); + + uint256 linkAmount = link.balanceOf(address(smartVault)); + bytes32 linkSymbol = bytes32(bytes(link.symbol())); + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeCollateral(linkSymbol, linkAmount, VAULT_OWNER); + vm.stopPrank(); + + // ETH/WETH moons, so remove WBTC collateral + (, int256 nativeUsdPrice,,,) = clNativeUsd.latestRoundData(); + clNativeUsd.setPrice(nativeUsdPrice * 20); + wbtcAmount = wbtc.balanceOf(address(smartVault)); + assertTrue(wbtcAmount != 0); + uint256 wbtcBefore = wbtc.balanceOf(VAULT_OWNER); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit CollateralRemoved(wbtcSymbol, wbtcAmount, VAULT_OWNER); + smartVault.removeCollateral(wbtcSymbol, wbtcAmount, VAULT_OWNER); + vm.stopPrank(); + assertEq(wbtc.balanceOf(address(smartVault)), 0); + assertEq(wbtc.balanceOf(VAULT_OWNER), wbtcBefore + wbtcAmount); + + assertFalse(smartVault.undercollateralised()); + } + + function test_removeCollateralFunctions() public { + _addCollateral(smartVault); + + // removing native via removeCollateral reverts + vm.startPrank(VAULT_OWNER); + vm.expectRevert("Address: call to non-contract"); + smartVault.removeCollateral(NATIVE, address(smartVault).balance, VAULT_OWNER); + vm.stopPrank(); + + // removing non-collateral asset via removeCollateral reverts + uint256 usdcAmount = 10 ** usdc.decimals(); + assertEq(usdc.balanceOf(address(smartVault)), 0); + usdc.mint(address(smartVault), usdcAmount); + assertEq(usdc.balanceOf(address(smartVault)), usdcAmount); + uint256 usdcBefore = usdc.balanceOf(VAULT_OWNER); + bytes32 usdcSymbol = bytes32(bytes(usdc.symbol())); + vm.startPrank(VAULT_OWNER); + vm.expectRevert("err-invalid-token"); + smartVault.removeCollateral(usdcSymbol, usdcAmount, VAULT_OWNER); + vm.stopPrank(); + + // TODO: also test: + // removing collateral via removeAsset reverts if undercollateralised + uint256 usdsAmount = smartVault.status().maxMintable * 99 / 100; + vm.prank(VAULT_OWNER); + smartVault.mint(VAULT_OWNER, usdsAmount); + + // remove native collateral fails + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeAsset(address(0), address(smartVault).balance, VAULT_OWNER); + + // remove weth collateral fails + vm.startPrank(VAULT_OWNER); + uint256 wethAmount = weth.balanceOf(address(smartVault)); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeAsset(address(weth), wethAmount, VAULT_OWNER); + + // remove wbtc collateral fails + vm.startPrank(VAULT_OWNER); + uint256 wbtcAmount = wbtc.balanceOf(address(smartVault)); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeAsset(address(wbtc), wbtcAmount, VAULT_OWNER); + + // remove link collateral fails + vm.startPrank(VAULT_OWNER); + uint256 linkAmount = link.balanceOf(address(smartVault)); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.removeAsset(address(link), linkAmount, VAULT_OWNER); + + // WBTC & LINK moon, so remove ETH/WETH collateral + (, int256 wbtcUsdPrice,,,) = clWbtcUsd.latestRoundData(); + clWbtcUsd.setPrice(wbtcUsdPrice * 100); + (, int256 linkUsdPrice,,,) = clLinkUsd.latestRoundData(); + clLinkUsd.setPrice(linkUsdPrice * 100); + + // NOTE: this actually reverts because it attempts to perform an ERC-20 transfer on address(0) + uint256 nativeAmount = address(smartVault).balance; + assertTrue(nativeAmount != 0); + uint256 nativeBefore = VAULT_OWNER.balance; + vm.startPrank(VAULT_OWNER); + // vm.expectEmit(false, false, false, true); + // emit AssetRemoved(address(0), nativeAmount, VAULT_OWNER); + vm.expectRevert("Address: call to non-contract"); + smartVault.removeAsset(address(0), nativeAmount, VAULT_OWNER); + vm.stopPrank(); + // assertEq(address(smartVault).balance, 0); + // assertEq(VAULT_OWNER.balance, nativeBefore + nativeAmount); + + wethAmount = weth.balanceOf(address(smartVault)); + assertTrue(wethAmount != 0); + uint256 wethBefore = weth.balanceOf(VAULT_OWNER); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit AssetRemoved(address(weth), wethAmount, VAULT_OWNER); + smartVault.removeAsset(address(weth), wethAmount, VAULT_OWNER); + vm.stopPrank(); + assertEq(weth.balanceOf(address(smartVault)), 0); + assertEq(weth.balanceOf(VAULT_OWNER), wethBefore + wethAmount); + + assertFalse(smartVault.undercollateralised()); + } + + function test_mintUsds() public { + uint256 usdsDecimals = usds.decimals(); + + // cannot mint if undercollateralised (no collateral) + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.Undercollateralised.selector); + smartVault.mint(VAULT_OWNER, 100 * usdsDecimals); + vm.stopPrank(); + + _addCollateral(smartVault); + + // expect revert not owner + vm.expectRevert(SmartVaultV4.InvalidUser.selector); + smartVault.mint(VAULT_OWNER, 100 * usdsDecimals); + + // expect emit USDsMinted + address to = VAULT_OWNER; + uint256 amount = 100 * usdsDecimals; + uint256 fee = amount * PROTOCOL_FEE_RATE / smartVaultManager.HUNDRED_PC(); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit USDsMinted(to, amount, fee); + smartVault.mint(to, amount); + vm.stopPrank(); + + // assert balances + fee + assertEq(usds.balanceOf(to), amount); + assertEq(smartVault.status().minted, amount + fee); + assertEq(smartVault.undercollateralised(), false); + assertEq(usds.balanceOf(PROTOCOL), fee); + } + + function test_burnUsds() public { + uint256 usdsAmountBefore = 100 * 10 ** usds.decimals(); + + // expect revert Overrepay + vm.expectRevert(SmartVaultV4.Overrepay.selector); + smartVault.burn(usdsAmountBefore); + + _addCollateral(smartVault); + uint256 mintFee = _mintUsds(smartVault, VAULT_OWNER, usdsAmountBefore); + + // expect emit USDsBurned + uint256 usdsAmountBurned = usdsAmountBefore * 90 / 100; + uint256 burnFee = smartVaultManager.burnFeeRate() * usdsAmountBurned / smartVaultManager.HUNDRED_PC(); + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, false, false, true); + emit USDsBurned(usdsAmountBurned, burnFee); + smartVault.burn(usdsAmountBurned); + vm.stopPrank(); + + // assert balances + fees + assertEq(usds.balanceOf(VAULT_OWNER), usdsAmountBefore - usdsAmountBurned - burnFee); + assertEq(smartVault.status().minted, usdsAmountBefore + mintFee - usdsAmountBurned); + assertEq(usds.balanceOf(PROTOCOL), mintFee + burnFee); + } + + function test_liquidation() public { + // undercollateralised false with no collateral + assertFalse(smartVault.undercollateralised()); + + // undercollateralised false with collateral and no borrowing + _addCollateral(smartVault); + assertFalse(smartVault.undercollateralised()); + + // undercollateralised false with collateral and borrowing before price decrease + _mintUsds(smartVault, VAULT_OWNER, smartVault.status().maxMintable * 90 / 100); + assertFalse(smartVault.undercollateralised()); + + // expect revert liquidate + vm.startPrank(address(smartVaultManager)); + vm.expectRevert(SmartVaultV4.NotUndercollateralised.selector); + smartVault.liquidate(); + vm.stopPrank(); + + // undercollateralised true with collateral and borrowing after price decrease + (, int256 nativeUsdPrice,,,) = clNativeUsd.latestRoundData(); + clNativeUsd.setPrice(nativeUsdPrice / 10); + assertTrue(smartVault.undercollateralised()); + + // try to liquidate with non-manager account + vm.expectRevert(SmartVaultV4.InvalidUser.selector); + smartVault.liquidate(); + + // liquidate as manager + uint256 nativeBalanceBefore = address(smartVault).balance; + uint256 wethBalanceBefore = weth.balanceOf(address(smartVault)); + uint256 wbtcBalanceBefore = wbtc.balanceOf(address(smartVault)); + uint256 linkBalanceBefore = link.balanceOf(address(smartVault)); + + vm.prank(address(smartVaultManager)); + smartVault.liquidate(); + + // assert balances + state + assertTrue(smartVault.status().liquidated); + assertEq(address(smartVault).balance, 0); + assertEq(weth.balanceOf(address(smartVault)), 0); + assertEq(wbtc.balanceOf(address(smartVault)), 0); + assertEq(link.balanceOf(address(smartVault)), 0); + assertEq(smartVault.status().totalCollateralValue, 0); + assertEq(smartVault.status().maxMintable, 0); + + assertEq(PROTOCOL.balance, nativeBalanceBefore); + assertEq(weth.balanceOf(PROTOCOL), wethBalanceBefore); + assertEq(wbtc.balanceOf(PROTOCOL), wbtcBalanceBefore); + assertEq(link.balanceOf(PROTOCOL), linkBalanceBefore); + + // expect revert mint VaultLiquidated + uint256 usdsAmount = 100 * 10 ** usds.decimals(); + vm.startPrank(VAULT_OWNER); + vm.expectRevert(SmartVaultV4.VaultLiquidated.selector); + smartVault.mint(VAULT_OWNER, usdsAmount); + } + + // NOTE: best to fork test swaps + function test_swap() public { + // expect revert swap InvalidUser + // swap native + // swap 6 decimal collateral + // swap 18 decimal collateral + // expect revert swap invalid token in/out + } + + function test_swapWithMinimum() public { + // as above using slippage parameter + } + + // NOTE: should also fork test yield deposits due to intermediate swaps + function test_yieldDeposit() public { + _addCollateral(smartVault); + + uint256 nativeAmount = address(smartVault).balance; + uint256 wethAmount = weth.balanceOf(address(smartVault)); + uint256 stablePercentage = 1e5; + + // revert invalid owner + vm.expectRevert(SmartVaultV4.InvalidUser.selector); + smartVault.depositYield(NATIVE, stablePercentage); + + // cache state before + uint256 wbtcHypervisorBalance = wbtcHypervisor.balanceOf(address(smartVault)); + uint256 wbtcHypervisorTotalSupply = wbtcHypervisor.totalSupply(); + (uint256 wbtcHypervisorUnderlying0, uint256 wbtcHypervisorUnderlying1) = wbtcHypervisor.getTotalAmounts(); + uint256 usdsHypervisorBalance = usdsHypervisor.balanceOf(address(smartVault)); + uint256 usdsHypervisorTotalSupply = usdsHypervisor.totalSupply(); + (uint256 usdsHypervisorUnderlying0, uint256 usdsHypervisorUnderlying1) = usdsHypervisor.getTotalAmounts(); + + // put 100% of collateral into yield + vm.startPrank(VAULT_OWNER); + vm.expectEmit(true, true, false, true); + emit Deposit(address(smartVault), address(weth), nativeAmount + wethAmount, stablePercentage); + smartVault.depositYield(NATIVE, stablePercentage); + + // assert no changes to wbtc hypervisor + assertEq(wbtcHypervisor.balanceOf(address(smartVault)), wbtcHypervisorBalance); + assertEq(wbtcHypervisor.totalSupply(), wbtcHypervisorTotalSupply); + (uint256 wbtcHypervisorUnderlying0After, uint256 wbtcHypervisorUnderlying1After) = + wbtcHypervisor.getTotalAmounts(); + assertEq(wbtcHypervisorUnderlying0After, wbtcHypervisorUnderlying0); + assertEq(wbtcHypervisorUnderlying1After, wbtcHypervisorUnderlying1); + + // assert usds hypervisor balances + assertGt(usdsHypervisor.balanceOf(address(smartVault)), usdsHypervisorBalance); + assertGt(usdsHypervisor.totalSupply(), usdsHypervisorTotalSupply); + (uint256 usdsHypervisorUnderlying0After, uint256 usdsHypervisorUnderlying1After) = + usdsHypervisor.getTotalAmounts(); + assertGe(usdsHypervisorUnderlying0After, usdsHypervisorUnderlying0); + assertGe(usdsHypervisorUnderlying1After, usdsHypervisorUnderlying1); + + // expect revert 24 decimal Hypervisor token + // ERC20Mock largeDecimals = new ERC20Mock("Large Decimals", "XXL", 24); + // largeDecimals.mint(address(smartVault), 1); + } + + function test_yieldWithdraw() public { + // add collateral & deposit + _addCollateral(smartVault); + + uint256 nativeAmount = address(smartVault).balance; + uint256 wethAmount = weth.balanceOf(address(smartVault)); + uint256 stablePercentage = 1e5; + + vm.startPrank(VAULT_OWNER); + vm.expectEmit(true, true, false, true); + emit Deposit(address(smartVault), address(weth), nativeAmount + wethAmount, stablePercentage); + smartVault.depositYield(NATIVE, stablePercentage); + + // withdraw + assert balances/fees/etc + uint256 nativeBefore = address(smartVault).balance; + vm.startPrank(VAULT_OWNER); + vm.expectEmit(true, true, false, false); + emit Withdraw(address(smartVault), address(weth), address(usdsHypervisor), 0); + smartVault.withdrawYield(address(usdsHypervisor), NATIVE); + vm.stopPrank(); + assertGt(address(smartVault).balance, nativeAmount + wethAmount - nativeBefore); + } + + function test_yieldCollateralCheck() public { + // TODO: slippage check revert during deposit/withdrawal + // nuke collateral value & assert undercollateralised/significant collateral drop + } + + // NOTE: new implementation tested with differential fork test + function test_yieldSwapRatio() public { + // reverts if no convergence + } + + function test_pocDepositYieldRemoveCollateral() public { + // borrow usds -> deposit yield -> SmartVaultV4::removeAsset (hypervisor token) -> profit + + vm.deal(VAULT_OWNER, 1 ether); + vm.startPrank(VAULT_OWNER); + address(smartVault).call{value: 1 ether}(""); + SmartVaultV4.Status memory status = smartVault.status(); + console.log("USDS balance of VAULT_OWNER before mint: %s", usds.balanceOf(VAULT_OWNER)); + console.log("USDS balance of SmartVault before mint: %s", usds.balanceOf(address(smartVault))); + smartVault.mint(VAULT_OWNER, status.maxMintable * 90 / 100); + console.log("USDS balance of VAULT_OWNER before depositYield: %s", usds.balanceOf(VAULT_OWNER)); + console.log("USDS balance of SmartVault before depositYield: %s", usds.balanceOf(address(smartVault))); + console.log("Undercollateralised before depositYield: %s", smartVault.undercollateralised()); + smartVault.depositYield(NATIVE, 1e5); + SmartVaultV4.YieldPair[] memory yieldPairs = smartVault.yieldAssets(); + assertEq(yieldPairs.length, 1); + address hypervisor = yieldPairs[0].hypervisor; + console.log( + "Hypervisor balance of VAULT_OWNER before removeAsset: %s", IHypervisor(hypervisor).balanceOf(VAULT_OWNER) + ); + console.log( + "Hypervisor balance of SmartVault before removeAsset: %s", + IHypervisor(hypervisor).balanceOf(address(smartVault)) + ); + console.log("USDS balance of VAULT_OWNER before removeAsset: %s", usds.balanceOf(VAULT_OWNER)); + console.log("USDS balance of SmartVault before removeAsset: %s", usds.balanceOf(address(smartVault))); + console.log("Undercollateralised before removeAsset: %s", smartVault.undercollateralised()); + smartVault.removeAsset( + yieldPairs[0].hypervisor, IHypervisor(hypervisor).balanceOf(address(smartVault)), VAULT_OWNER + ); + vm.stopPrank(); + + console.log("Hypervisor balance of VAULT_OWNER after: %s", IHypervisor(hypervisor).balanceOf(VAULT_OWNER)); + console.log( + "Hypervisor balance of SmartVault after: %s", IHypervisor(hypervisor).balanceOf(address(smartVault)) + ); + console.log("USDS balance of VAULT_OWNER after: %s", usds.balanceOf(VAULT_OWNER)); + console.log("USDS balance of SmartVault after: %s", usds.balanceOf(address(smartVault))); + console.log("Undercollateralised after: %s", smartVault.undercollateralised()); + + // liquidation succeeds, but there is nothing left to liquidate + vm.prank(address(smartVaultManager)); + smartVault.liquidate(); + } + + // Helper functions + function _addCollateral(SmartVaultV4 vault) internal { + uint256 usdCollateral = smartVault.status().totalCollateralValue; + + // add native collateral + uint256 nativeAmount = 2 ether; + uint256 nativeValue = DEFAULT_ETH_USD_PRICE * nativeAmount; + address(smartVault).call{value: nativeAmount}(""); + assertEq(address(smartVault).balance, nativeAmount); + assertEq(_getVaultCollateralVaulue(smartVault), usdCollateral + nativeValue); + + // add weth collateral + usdCollateral = _getVaultCollateralVaulue(smartVault); + uint256 wethAmount = nativeAmount; + uint256 wethValue = DEFAULT_ETH_USD_PRICE * wethAmount; + weth.mint(address(smartVault), wethAmount); + vm.deal(address(weth), address(weth).balance + wethAmount); + assertEq(weth.balanceOf(address(smartVault)), wethAmount); + assertEq(_getVaultCollateralVaulue(smartVault), usdCollateral + wethValue); + + // add wbtc collateral + usdCollateral = _getVaultCollateralVaulue(smartVault); + uint256 wbtcAmount = nativeAmount * 10 ** wbtc.decimals() / DEFAULT_WBTC_ETH_MULTIPLIER / 1e18; + uint256 wbtcValue = DEFAULT_ETH_USD_PRICE * nativeAmount; + wbtc.mint(address(smartVault), wbtcAmount); + assertEq(wbtc.balanceOf(address(smartVault)), wbtcAmount); + assertEq(_getVaultCollateralVaulue(smartVault), usdCollateral + wbtcValue); + + // add link collateral + usdCollateral = _getVaultCollateralVaulue(smartVault); + uint256 linkAmount = nativeAmount * 10 ** link.decimals() * DEFAULT_LINK_ETH_DIVISOR / 1e18; + uint256 linkValue = DEFAULT_ETH_USD_PRICE * nativeAmount; + link.mint(address(smartVault), linkAmount); + assertEq(link.balanceOf(address(smartVault)), linkAmount); + assertEq(_getVaultCollateralVaulue(smartVault), usdCollateral + linkValue); + } + + function _mintUsds(SmartVaultV4 vault, address to, uint256 amount) internal returns (uint256 fee) { + fee = amount * PROTOCOL_FEE_RATE / 1e5; + vm.prank(vault.owner()); + vault.mint(to, amount); + } +} diff --git a/test/foundry/SmartVaultManager.t.sol b/test/foundry/SmartVaultManager.t.sol new file mode 100644 index 0000000..2a5369d --- /dev/null +++ b/test/foundry/SmartVaultManager.t.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; + +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import {SmartVaultManagerFixture, SmartVaultManagerV6} from "./fixtures/SmartVaultManagerFixture.sol"; +import {SmartVaultV4} from "src/SmartVaultV4.sol"; +import {ISmartVault} from "src/interfaces/ISmartVault.sol"; + +contract SmartVaultManagerTest is SmartVaultManagerFixture, Test { + using EnumerableSet for EnumerableSet.Bytes32Set; + + event VaultDeployed(address indexed vaultAddress, address indexed owner, address vaultType, uint256 tokenId); + event VaultLiquidated(address indexed vaultAddress); + event VaultTransferred(uint256 indexed tokenId, address from, address to); + + function setUp() public override { + super.setUp(); + } + + function test_openVault() public { + vm.startPrank(VAULT_OWNER); + vm.expectEmit(false, true, false, true); + emit VaultDeployed(address(0), VAULT_OWNER, address(usds), smartVaultManager.totalSupply() + 1); + (address vault, uint256 tokenId) = smartVaultManager.mint(); + vm.stopPrank(); + + assertEq(smartVaultManager.totalSupply(), 1); + assertEq(smartVaultManager.balanceOf(VAULT_OWNER), 1); + assertEq(smartVaultManager.vaultIDs(VAULT_OWNER).length, 1); + + ISmartVault.Status memory status = smartVaultManager.vaultData(tokenId).status; + assertEq(status.vaultAddress, vault); + assertEq(status.minted, 0); + assertEq(status.maxMintable, 0); + assertEq(status.totalCollateralValue, 0); + assertEq(status.collateral.length, collateralSymbols.length()); // collateralSymbols.length - 1 + NATIVE + assertEq(status.liquidated, false); + assertEq(status.version, 4); + assertEq(status.vaultType, bytes32("USDs")); + + assertEq(smartVaultManager.collateralRate(), COLLATERAL_RATE); + assertEq(smartVaultManager.mintFeeRate(), PROTOCOL_FEE_RATE); + assertEq(smartVaultManager.burnFeeRate(), PROTOCOL_FEE_RATE); + } + + function test_vaultLimit() public { + vm.startPrank(VAULT_OWNER); + for (uint256 i = 0; i < VAULT_LIMIT; i++) { + smartVaultManager.mint(); + } + vm.expectRevert("err-vault-limit"); + smartVaultManager.mint(); + } + + function test_liquidateVault() public { + vm.prank(VAULT_OWNER); + (address vault, uint256 tokenId) = smartVaultManager.mint(); + + // PROTOCOL balances before + uint256 protocolETHBalance = PROTOCOL.balance; + uint256 protocolWETHBalance = weth.balanceOf(PROTOCOL); + + assertEq(protocolETHBalance, 0); + assertEq(protocolWETHBalance, 0); + + // Mint collateral to the vault + uint256 wethAmount = 1 ether; + weth.mint(vault, wethAmount); + + uint256 nativeAmount = 1 ether; + (bool success,) = vault.call{value: nativeAmount}(""); + if (!success) { + console.log("Failed to mint native collateral"); + } + + // Mint 99% of the max mintable amount + ISmartVault.Status memory statusBefore = smartVaultManager.vaultData(tokenId).status; + assertTrue(statusBefore.maxMintable > 0); + uint256 mintValue = statusBefore.maxMintable * 99 / 100; + + vm.prank(VAULT_OWNER); + SmartVaultV4(payable(vault)).mint(VAULT_OWNER, mintValue); + + // Attempt to liquidate with invalid liquidator + vm.expectRevert("err-invalid-liquidator"); + smartVaultManager.liquidateVault(tokenId); + + // Attempt to liquidate with valid liquidator + vm.startPrank(LIQUIDATOR); + vm.expectRevert("vault-not-undercollateralised"); + smartVaultManager.liquidateVault(tokenId); + vm.stopPrank(); + + // Drop the price of ETH to $1000 + clNativeUsd.setPrice(1000_0000_0000); + + // Liquidate undercollateralized vault + vm.startPrank(LIQUIDATOR); + vm.expectEmit(true, false, false, false); + emit VaultLiquidated(vault); + smartVaultManager.liquidateVault(tokenId); + vm.stopPrank(); + + // Assert vault is liquidated + ISmartVault.Status memory statusAfter = smartVaultManager.vaultData(tokenId).status; + assertEq(statusAfter.liquidated, true); + assertEq(statusAfter.minted, 0); + assertEq(statusAfter.maxMintable, 0); + assertEq(statusAfter.totalCollateralValue, 0); + assertEq(statusAfter.collateral.length, collateralSymbols.length()); // collateralSymbols.length - 1 + NATIVE + for (uint256 i = 0; i < statusAfter.collateral.length; i++) { + assertEq(statusAfter.collateral[i].amount, 0); + } + + // Assert PROTOCOL balances + assertEq(weth.balanceOf(PROTOCOL), protocolWETHBalance + wethAmount); + assertEq(PROTOCOL.balance, protocolETHBalance + nativeAmount); + } + + function test_transferVault() public { + // Mint two vaults as VAULT_OWNER + vm.startPrank(VAULT_OWNER); + (address vault, uint256 tokenId) = smartVaultManager.mint(); + smartVaultManager.mint(); + vm.stopPrank(); + + uint256 senderBalanceBefore = smartVaultManager.balanceOf(VAULT_OWNER); + assertEq(senderBalanceBefore, 2); + assertEq(smartVaultManager.vaultIDs(VAULT_OWNER).length, senderBalanceBefore); + + // Mint a vault as recipient + address recipient = makeAddr("Recipient"); + vm.prank(recipient); + smartVaultManager.mint(); + + uint256 recipientBalanceBefore = smartVaultManager.balanceOf(recipient); + assertEq(smartVaultManager.balanceOf(recipient), 1); + assertEq(smartVaultManager.vaultIDs(recipient).length, recipientBalanceBefore); + + // Attempt to transfer with invalid recipient invalid caller + vm.expectRevert("ERC721: caller is not token owner or approved"); + smartVaultManager.transferFrom(VAULT_OWNER, address(0), tokenId); + + // Attempt to transfer with invalid recipient + vm.startPrank(VAULT_OWNER); + vm.expectRevert("ERC721: transfer to the zero address"); + smartVaultManager.transferFrom(VAULT_OWNER, address(0), tokenId); + vm.stopPrank(); + + // Transfer the vault + assertEq(SmartVaultV4(payable(vault)).owner(), VAULT_OWNER); + + vm.startPrank(VAULT_OWNER); + vm.expectEmit(true, false, false, true); + emit VaultTransferred(tokenId, VAULT_OWNER, recipient); + smartVaultManager.transferFrom(VAULT_OWNER, recipient, tokenId); + vm.stopPrank(); + + // Assert vault ownership + assertEq(SmartVaultV4(payable(vault)).owner(), recipient); + assertEq(smartVaultManager.ownerOf(tokenId), recipient); + + assertEq(smartVaultManager.balanceOf(VAULT_OWNER), senderBalanceBefore - 1); + assertEq(smartVaultManager.vaultIDs(VAULT_OWNER).length, senderBalanceBefore - 1); + + assertEq(smartVaultManager.balanceOf(recipient), recipientBalanceBefore + 1); + assertEq(smartVaultManager.vaultIDs(recipient).length, recipientBalanceBefore + 1); + + bool found; + uint256[] memory recipientIds = smartVaultManager.vaultIDs(recipient); + for (uint256 i = 0; i < recipientIds.length; i++) { + for (uint256 i = 0; i < recipientIds.length; i++) { + if (recipientIds[i] == tokenId) { + found = true; + break; + } + } + assertTrue(found); + } + } + + function test_nftMetadata() public { + vm.prank(VAULT_OWNER); + (address vault, uint256 tokenId) = smartVaultManager.mint(); + string memory metadataJSON = smartVaultManager.tokenURI(tokenId); + + // Compare the first 28 characters of metadataJSON with the expected string + bytes memory metadataBytes = bytes(metadataJSON); + bytes memory expectedPrefix = bytes("data:application/json;base64,"); + + assertTrue(metadataBytes.length >= expectedPrefix.length); + // Compare each byte to ensure the prefix matches + for (uint256 i = 0; i < expectedPrefix.length; i++) { + assertEq(metadataBytes[i], expectedPrefix[i], "Prefix does not match expected value"); + } + } +} diff --git a/test/foundry/SmartVaultYieldManager.t.sol b/test/foundry/SmartVaultYieldManager.t.sol new file mode 100644 index 0000000..f86738e --- /dev/null +++ b/test/foundry/SmartVaultYieldManager.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {SmartVaultYieldManagerFixture} from "./fixtures/SmartVaultYieldManagerFixture.sol"; + +contract SmartVaultYieldManagerTest is SmartVaultYieldManagerFixture, Test { + function setUp() public override { + super.setUp(); + } + + function test_addHypervisorData() public { + // expect revert addHypervisorData + // owner call + assert + } + + function test_removeHypervisorData() public { + // expect revert removeHypervisorData + // owner call + assert + } + + function test_setFeeData() public { + // expect revert setFeeData + // owner call + assert + } + + function test_deposit() public { + // deposit native collateral + // deposit 6 decimal collateral + // deposit 18 decimal collateral + // deposit invalid collateral + // deposit 0/MIN_USDS_PERCENTAGE/HUNDRED_PC usds percentage + // expect emit deposit + // assert addresses + balances + fee + } + + function test_withdraw() public { + // withdraw usds hypervisor + // withdraw other hypervisor + // swap to native collateral + // swap to 6 decimal collateral + // swap to 18 decimal collateral + // swap to invalid collateral + // expect emit withdraw + // assert addresses + balances + fee + } +} diff --git a/test/foundry/TokenManager.t.sol b/test/foundry/TokenManager.t.sol new file mode 100644 index 0000000..1bb700c --- /dev/null +++ b/test/foundry/TokenManager.t.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import {ERC20Mock} from "src/test_utils/ERC20Mock.sol"; +import {ChainlinkMock} from "src/test_utils/ChainlinkMock.sol"; + +import {TokenManagerFixture, TokenManager} from "./fixtures/TokenManagerFixture.sol"; +import {ITokenManager} from "src/interfaces/ITokenManager.sol"; + +contract TokenManagerTest is TokenManagerFixture, Test { + using EnumerableSet for EnumerableSet.Bytes32Set; + + event TokenAdded(bytes32 symbol, address token); + event TokenRemoved(bytes32 symbol); + + function setUp() public override { + super.setUp(); + } + + function test_getInvalidToken() public { + vm.expectRevert("err-invalid-token"); + tokenManager.getToken(bytes32(bytes("INVALID"))); + } + + function test_defaultNative() public { + ITokenManager.Token[] memory acceptedTokens = tokenManager.getAcceptedTokens(); + assertEq(acceptedTokens.length, collateralSymbols.length()); // collateralSymbols.length - 1 + NATIVE + + ITokenManager.Token memory token = acceptedTokens[0]; + assertEq(token.symbol, NATIVE); + assertEq(token.addr, address(0)); + assertEq(token.clAddr, address(clNativeUsd)); + assertEq(token.clDec, clNativeUsd.decimals()); + } + + function test_manageAcceptedTokens() public { + ITokenManager.Token[] memory tokensBefore = tokenManager.getAcceptedTokens(); + assertEq(tokensBefore.length, collateralSymbols.length()); // collateralSymbols.length - 1 + NATIVE + + // native cannot be removed + vm.expectRevert("err-native-required"); + tokenManager.removeAcceptedToken(NATIVE); + + // weth can be removed + bytes32 wethSymbol = bytes32(bytes(weth.symbol())); + tokenManager.removeAcceptedToken(wethSymbol); + emit TokenRemoved(wethSymbol); + + ITokenManager.Token[] memory tokensAfter = tokenManager.getAcceptedTokens(); + assertEq(tokensAfter.length, tokensBefore.length - 1); + + // add new token + string memory newSymbol = "NEW"; + address newToken = address(new ERC20Mock("New Token", newSymbol, 18)); + address clNewUsd = address(new ChainlinkMock("NEW/USD")); + + vm.expectEmit(false, false, false, true); + emit TokenAdded(bytes32(bytes(newSymbol)), newToken); + tokenManager.addAcceptedToken(newToken, clNewUsd); + + // cannot add existing token + vm.expectRevert(abi.encodeWithSelector(TokenManager.TokenExists.selector, bytes32(bytes(newSymbol)), newToken)); + tokenManager.addAcceptedToken(newToken, clNewUsd); + } +} diff --git a/test/foundry/differential/README.md b/test/foundry/differential/README.md new file mode 100644 index 0000000..eb6b2c3 --- /dev/null +++ b/test/foundry/differential/README.md @@ -0,0 +1,139 @@ +# New `SmartVaultYieldManager::_swapToRatio` implementation considerations + +1) Safety catch-all: in `SmartVaultYieldManager::_deposit`, the call to `UniProxy::deposit` can fail if the balances in the contract are not at the same ratio as the Hypervisor requires. Here, a fail safe could be implemented to check that the ratio is correct by calling `UniProxy::.getDepositAmount`. Any excess balance could then be returned to the Smart Vault (`msg.sender`) before the call to `UniProxy::deposit`, guaranteeing that the deposit will always succeed. + +2) The second branch (swap `B→A`) in the new `_swapToRatio()` is unnecessary. As the `SmartVaultYieldManager` shouldn't hold any tokens, and only `tokenA` is moved to the contract, there shouldn't be any `tokenB` present. In the unlikely scenario that there is more `tokenB` than required for the ratio, the surplus can be caught using the same catch-all as described above. This would mean some changes to the differential fuzz test as well. + +The implementation is somewhat unclear due to stack management, so derivation of the maths is provided below: + +## Derivation +### Without pool fees + +Let's start without pool fees to describe the general maths. + +Given: +1) amount $a$ of `tokenA`, and amount $b$ of `tokenB` in the contract. +2) price $p = \frac{\Delta a}{\Delta b}$ +3) target ratio $r$ is $r = a/b_{mid}$, $b_{mid}$ is `_midRatio` in the code, hence is known. +4) target ratio is also target amount of a over target amount of b: $r = a_t / b_t$ + +#### swap A -> B + +Gives: $a_t = a - \Delta a$ and $b_t = b + \Delta b$ + +thus the ratio: + +$$ +r = \frac{a - \Delta a}{b + \Delta b} => a - \Delta a = r ( b + \Delta b ) +$$ + +we know $\Delta b = \frac{\Delta a}{p}$ thus: + +$$ +a - \Delta a = r (b + \frac{\Delta a}{p}) => a - \Delta a = rb + \frac{r\Delta a}{p} +$$ + +$$ +-\Delta a - \frac{r\Delta a}{p} = rb - a => \Delta a + \frac{r\Delta a}{p} = a - rb +$$ + +$$ +\Delta a (1 + \frac{r}{p}) = a - rb => \Delta a = \frac{a - rb}{1 + \frac{r}{p}} +$$ + +Sanity checking this, $a = 100$, $b= 100$, $p = 1/2$, $r = 1/2$: + +$$ +\Delta a = \frac{100 - 1/2 * 100}{1 + \frac{1/2}{1/2}} => \Delta a = \frac{100 - 50}{1 + 1} = 25 +$$ + +Swapping `25 A` would give you `50 B` which would give the end result `75 A` and `150 B` which indeed was the ratio. + +#### swap B -> A + +$a_t = a + \Delta a$ and $b_t = b - \Delta b$ + +thus the ratio: + +$$ +r = \frac{a + \Delta a}{b - \Delta b} => a + \Delta a = r ( b - \Delta b ) +$$ + +we know $\Delta b = \frac{\Delta a}{p}$ thus: + +$$ +a + \Delta a = r (b - \frac{\Delta a}{p}) => a + \Delta a = rb - \frac{r\Delta a}{p} +$$ + +$$ +\Delta a + \frac{r\Delta a}{p} = rb - a +$$ + +$$ +\Delta a( 1 + \frac{r}{p}) = rb - a => \Delta a = \frac{rb - a}{1 + \frac{r}{p}} +$$ + +Sanity checking $a = 100$, $b = 300$, $r$ and $p$ both $1/2$ again: + + +$$ +\Delta a = \frac{1/2 * 300 - 100}{1 + 1} = 25 +$$ + +To get `25 A` out, you need to provide `50 B` which would end up at `125 A`, `250 B` after the swap, which is the target ratio. + +### With fees + +Introducing pool fees changes the definition of the price, $p$. + +For a swap A->B, the price for $\Delta a$ amount in is described as: + +$$ +p = \frac{\Delta a - \Delta a f}{\Delta b} +$$ + +where $f$ is the pool fee. + +For a swap B->A, the price for $\Delta a$ amount out is similarly: + +$$ +p = \frac{\Delta a}{\Delta b - \Delta b f} +$$ + +#### Swap A -> B + +Using the equation from above: + +$$ +r = \frac{a - \Delta a}{b + \Delta b} => a - \Delta a = r ( b + \Delta b ) +$$ + +the new $\Delta b$ using fee will now be: $\Delta b = \frac{\Delta a(1-f)}{p}$ thus: + +$$ +a - \Delta a = r (b + \frac{\Delta a (1 - f)}{p}) +$$ + +Using the same rearranging as above gives us a final equation for $\delta a$: + +$$ + \Delta a = \frac{a - rb}{1 + \frac{r(1-f)}{p}} +$$ + +A quick sanity check tells us that increasing the fee $f$ here will decrease the denominator resulting in a higher $\Delta a$ which is what we expect (as more will be lost to the fee). + +#### Swap B -> A + +Using $p = \frac{\Delta a}{\Delta b (1-f)}$ gives us: + +$$ +a - \Delta a = r (b + \frac{\Delta a}{(1 - f)p}) +$$ + +Which at the end gives us $\Delta a$ as: + +$$ +\Delta a = \frac{rb - a}{1 + \frac{r}{(1-f)p}} +$$ + +A quick sanity check tells us that increasing the fee $f$ here will increase the denominator resulting in a lower $\Delta a$ which is what we expect (as more will be lost to the fee, thus less out). diff --git a/test/foundry/differential/SwapToRatio.sol b/test/foundry/differential/SwapToRatio.sol new file mode 100644 index 0000000..6af572f --- /dev/null +++ b/test/foundry/differential/SwapToRatio.sol @@ -0,0 +1,349 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "contracts/uniswap/FullMath.sol"; +import "contracts/uniswap/PoolAddress.sol"; +import "contracts/interfaces/IHypervisor.sol"; +import "contracts/interfaces/IPeripheryImmutableState.sol"; +import "contracts/interfaces/ISwapRouter.sol"; +import "contracts/interfaces/IUniProxy.sol"; +import "contracts/interfaces/IUniswapV3Pool.sol"; + +import {console} from "forge-std/console.sol"; +import {Vm} from "forge-std/Vm.sol"; + +interface ISwapToRatio { + error RatioError(); + + function _swapToRatio(address _tokenA) external; +} + +contract SwapToRatioBase is ISwapToRatio { + address internal uniProxy; + address internal hypervisor; + address internal swapRouter; + uint24 internal swapFee; + + constructor(address _uniProxy, address _hypervisor, address _swapRouter, uint24 _swapFee) { + uniProxy = _uniProxy; + hypervisor = _hypervisor; + swapRouter = _swapRouter; + swapFee = _swapFee; + } + + function _thisBalanceOf(address _token) internal view returns (uint256) { + return IERC20(_token).balanceOf(address(this)); + } + + function _withinRatio(uint256 _tokenBBalance, uint256 _requiredStart, uint256 _requiredEnd) + internal + pure + returns (bool) + { + return _tokenBBalance >= _requiredStart && _tokenBBalance <= _requiredEnd; + } + + function _swapToRatio(address _tokenA) public virtual override {} +} + +contract SwapToRatioOld is SwapToRatioBase { + using SafeERC20 for IERC20; + + constructor(address _uniProxy, address _hypervisor, address _swapRouter, uint24 _swapFee) + SwapToRatioBase(_uniProxy, _hypervisor, _swapRouter, _swapFee) + {} + + function _swapToRatio(address _tokenA) public override { + address _tokenB = _tokenA == IHypervisor(hypervisor).token0() + ? IHypervisor(hypervisor).token1() + : IHypervisor(hypervisor).token0(); + uint256 _tokenBBalance = _thisBalanceOf(_tokenB); + (uint256 _amountStart, uint256 _amountEnd) = + IUniProxy(uniProxy).getDepositAmount(hypervisor, _tokenA, _thisBalanceOf(_tokenA)); + uint256 _divisor = 2; + bool _tokenBTooLarge; + for (uint256 index = 0; index < 20; index++) { + if (_withinRatio(_tokenBBalance, _amountStart, _amountEnd)) break; + uint256 _midRatio = (_amountStart + _amountEnd) / 2; + if (_tokenBBalance < _midRatio) { + if (_tokenBTooLarge) { + _divisor++; + _tokenBTooLarge = false; + } + IERC20(_tokenA).safeApprove(swapRouter, _thisBalanceOf(_tokenA)); + try ISwapRouter(swapRouter).exactOutputSingle( + ISwapRouter.ExactOutputSingleParams({ + tokenIn: _tokenA, + tokenOut: _tokenB, + fee: swapFee, + recipient: address(this), + deadline: block.timestamp + 60, + amountOut: (_midRatio - _tokenBBalance) / _divisor, + amountInMaximum: _thisBalanceOf(_tokenA), + sqrtPriceLimitX96: 0 + }) + ) returns (uint256) {} catch { + _divisor++; + } + IERC20(_tokenA).safeApprove(swapRouter, 0); + } else { + if (!_tokenBTooLarge) { + _divisor++; + _tokenBTooLarge = true; + } + IERC20(_tokenB).safeApprove(swapRouter, (_tokenBBalance - _midRatio) / _divisor); + try ISwapRouter(swapRouter).exactInputSingle( + ISwapRouter.ExactInputSingleParams({ + tokenIn: _tokenB, + tokenOut: _tokenA, + fee: swapFee, + recipient: address(this), + deadline: block.timestamp + 60, + amountIn: (_tokenBBalance - _midRatio) / _divisor, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }) + ) returns (uint256) {} catch { + _divisor++; + } + IERC20(_tokenB).safeApprove(swapRouter, 0); + } + _tokenBBalance = _thisBalanceOf(_tokenB); + (_amountStart, _amountEnd) = + IUniProxy(uniProxy).getDepositAmount(hypervisor, _tokenA, _thisBalanceOf(_tokenA)); + } + + if (!_withinRatio(_tokenBBalance, _amountStart, _amountEnd)) revert RatioError(); + } +} + +contract SwapToRatioNew is SwapToRatioBase { + using SafeERC20 for IERC20; + + uint160 _sqrtPriceX96; + + constructor(address _uniProxy, address _hypervisor, address _swapRouter, uint24 _swapFee) + SwapToRatioBase(_uniProxy, _hypervisor, _swapRouter, _swapFee) + {} + + function _swapToRatioMockPriceX96(address _tokenA, uint160 _mockPriceX96) public { + _sqrtPriceX96 = _mockPriceX96; + _swapToRatio(_tokenA); + } + + function _swapToRatio(address _tokenA) public override { + address _token0 = IHypervisor(hypervisor).token0(); + address _token1 = IHypervisor(hypervisor).token1(); + + address _tokenB = _tokenA == _token0 ? _token1 : _token0; + + // TODO: make this work with mocked pools and fork setup + // uint160 _sqrtPriceX96; + // { + // PoolAddress.PoolKey memory poolKey = PoolAddress.getPoolKey(_token0, _token1, _fee); + // address factory = IPeripheryImmutableState(_swapRouter).factory(); + // (_sqrtPriceX96,,,,,,) = _swapRouter == uniswapRouter + // ? IUniswapV3Pool(PoolAddress.computeAddressUniswap(factory, poolKey)).slot0() + // : IUniswapV3Pool(PoolAddress.computeAddressRamses(factory, poolKey)).slot0(); + // } + + uint256 _midRatio; + { + (uint256 _amountStart, uint256 _amountEnd) = + IUniProxy(uniProxy).getDepositAmount(hypervisor, _tokenA, _thisBalanceOf(_tokenA)); + if (_withinRatio(_thisBalanceOf(_tokenB), _amountStart, _amountEnd)) return; + + _midRatio = (_amountStart + _amountEnd) / 2; + } + + bool _tokenAIs0 = _tokenA == _token0; + uint256 _tokenBBalance = _thisBalanceOf(_tokenB); + uint256 _tokenABalance = _thisBalanceOf(_tokenA); + + uint256 _amountIn; + uint256 _amountOut; + { + uint256 aDec = ERC20(_tokenA).decimals(); + uint256 bDec = ERC20(_tokenB).decimals(); + + uint256 price36; + { + uint256 priceX192 = uint256(_sqrtPriceX96) * _sqrtPriceX96; + price36 = _tokenAIs0 + ? FullMath.mulDiv((10 ** aDec) * (10 ** (36 - bDec)), 1 << 192, priceX192) + : FullMath.mulDiv((10 ** bDec) * (10 ** (36 - aDec)), priceX192, 1 << 192); + } + + uint256 _ratio = + FullMath.mulDiv(_tokenABalance * (10 ** (36 - aDec)), 1e36, _midRatio * (10 ** (36 - bDec))); + uint256 _rb = FullMath.mulDiv(_tokenBBalance * (10 ** (36 - bDec)), _ratio, 1e36); + + if (_tokenABalance * (10 ** (36 - aDec)) > _rb) { + // a -> b + uint256 _denominator = + 1e36 + FullMath.mulDiv(_ratio - FullMath.mulDiv(_ratio, swapFee, 1e6), 1e36, price36); + _amountIn = + FullMath.mulDiv(_tokenABalance * (10 ** (36 - aDec)) - _rb, 1e36, _denominator) / 10 ** (36 - aDec); + } else { + // b -> a + uint256 _denominator = + 1e36 + FullMath.mulDiv(_ratio, 1e36, price36 - FullMath.mulDivRoundingUp(price36, swapFee, 1e6)); + _amountOut = + FullMath.mulDiv(_rb - _tokenABalance * (10 ** (36 - aDec)), 1e36, _denominator) / 10 ** (36 - aDec); + } + } + if (_tokenBBalance < _midRatio) { + // we want more tokenB + + address _tokenIn = _tokenAIs0 ? _token0 : _token1; + address _tokenOut = _tokenAIs0 ? _token1 : _token0; + + IERC20(_tokenIn).safeApprove(swapRouter, _tokenABalance); + ISwapRouter(swapRouter).exactInputSingle( + ISwapRouter.ExactInputSingleParams({ + tokenIn: _tokenIn, + tokenOut: _tokenOut, + fee: swapFee, + recipient: address(this), + deadline: block.timestamp, + amountIn: _amountIn, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }) + ); + IERC20(_tokenIn).safeApprove(swapRouter, 0); + } else { + // we want more tokenA + + address _tokenIn = _tokenAIs0 ? _token1 : _token0; + address _tokenOut = _tokenAIs0 ? _token0 : _token1; + + IERC20(_tokenIn).safeApprove(swapRouter, _tokenBBalance); + ISwapRouter(swapRouter).exactOutputSingle( + ISwapRouter.ExactOutputSingleParams({ + tokenIn: _tokenIn, + tokenOut: _tokenOut, + fee: swapFee, + recipient: address(this), + deadline: block.timestamp, + amountOut: _amountOut, + amountInMaximum: _tokenBBalance, + sqrtPriceLimitX96: 0 + }) + ); + IERC20(_tokenIn).safeApprove(swapRouter, 0); + } + } +} + +contract SwapToRatioPython is SwapToRatioBase { + using SafeERC20 for IERC20; + + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + uint256 public delta_a; + uint256 public delta_b; + + uint256 _sqrtPriceX96; + + constructor(address _uniProxy, address _hypervisor, address _swapRouter, uint24 _swapFee) + SwapToRatioBase(_uniProxy, _hypervisor, _swapRouter, _swapFee) + {} + + function _swapToRatioMockPriceX96(address _tokenA, uint160 _mockPriceX96) public { + _sqrtPriceX96 = _mockPriceX96; + _swapToRatio(_tokenA); + } + + function _swapToRatio(address _tokenA) public override { + address _token0 = IHypervisor(hypervisor).token0(); + address _token1 = IHypervisor(hypervisor).token1(); + + bool _tokenAIs0 = _tokenA == _token0; + address _tokenB = _tokenAIs0 ? _token1 : _token0; + + uint256 _tokenABalance = _thisBalanceOf(_tokenA); + uint256 _tokenBBalance = _thisBalanceOf(_tokenB); + + // Calculate the ratio based on the token A and token B balances for the Python implementation + uint256 _midRatio; + uint256 _ratio; + uint256 price18; + { + (uint256 _amountStart, uint256 _amountEnd) = + IUniProxy(uniProxy).getDepositAmount(address(hypervisor), address(_tokenA), _tokenABalance); + // If the token B balance is within the range of the token A balance, newImpl does nothing + if (_withinRatio(_tokenBBalance, _amountStart, _amountEnd)) { + _ratio = 0; + } else { + _midRatio = (_amountStart + _amountEnd) / 2; + _ratio = FullMath.mulDiv( + _tokenABalance * (10 ** (18 - ERC20(_tokenB).decimals())), + 1e18, + _midRatio * (10 ** (18 - ERC20(_tokenB).decimals())) + ); + } + + uint256 priceX192 = uint256(_sqrtPriceX96) * _sqrtPriceX96; + price18 = _tokenAIs0 + ? FullMath.mulDiv( + (10 ** ERC20(_tokenB).decimals()) * (10 ** (18 - ERC20(_tokenA).decimals())), 1 << 192, priceX192 + ) + : FullMath.mulDiv( + (10 ** ERC20(_tokenA).decimals()) * (10 ** (18 - ERC20(_tokenB).decimals())), priceX192, 1 << 192 + ); + } + + string[] memory inputs = new string[](11); + inputs[0] = "python"; + inputs[1] = "test/foundry/differential/python/swap_to_ratio.py"; + inputs[2] = "swap_to_ratio"; + inputs[3] = "--price"; + inputs[4] = vm.toString(price18); + inputs[5] = "--ratio"; + inputs[6] = vm.toString(_ratio); + inputs[7] = "--balance-a"; + inputs[8] = vm.toString(_tokenABalance); + inputs[9] = "--balance-b"; + inputs[10] = vm.toString(_tokenBBalance); + + (delta_a, delta_b) = abi.decode(vm.ffi(inputs), (uint256, uint256)); + + // Unless Python returns zero for both values, perform the swap to get the other token balance delta + if (delta_a != 0) { + if (_tokenBBalance < _midRatio) { + IERC20(_tokenA).safeApprove(swapRouter, delta_a); + delta_b = ISwapRouter(swapRouter).exactInputSingle( + ISwapRouter.ExactInputSingleParams({ + tokenIn: _tokenA, + tokenOut: _tokenB, + fee: swapFee, + recipient: address(this), + deadline: block.timestamp, + amountIn: delta_a, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }) + ); + IERC20(_tokenA).safeApprove(swapRouter, 0); + } else { + IERC20(_tokenB).safeApprove(swapRouter, _tokenBBalance); + delta_b = ISwapRouter(swapRouter).exactOutputSingle( + ISwapRouter.ExactOutputSingleParams({ + tokenIn: _tokenB, + tokenOut: _tokenA, + fee: swapFee, + recipient: address(this), + deadline: block.timestamp, + amountOut: delta_a, + amountInMaximum: _tokenBBalance, + sqrtPriceLimitX96: 0 + }) + ); + IERC20(_tokenB).safeApprove(swapRouter, 0); + } + } + } +} diff --git a/test/foundry/differential/SwapToRatio.t.sol b/test/foundry/differential/SwapToRatio.t.sol new file mode 100644 index 0000000..26af82e --- /dev/null +++ b/test/foundry/differential/SwapToRatio.t.sol @@ -0,0 +1,266 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {ISwapToRatio, SwapToRatioOld, SwapToRatioNew, SwapToRatioPython} from "./SwapToRatio.sol"; +import {ERC20Mock} from "src/test_utils/ERC20Mock.sol"; +import {HypervisorMock} from "src/test_utils/HypervisorMock.sol"; +import {UniProxyMock} from "src/test_utils/UniProxyMock.sol"; +import {MockSwapRouter, ISwapRouter} from "src/test_utils/MockSwapRouter.sol"; + +import {TickMath} from "contracts/uniswap/TickMath.sol"; + +import "contracts/uniswap/FullMath.sol"; + +import {Test, console} from "forge-std/Test.sol"; + +contract SwapToRatioTest is Test { + ISwapToRatio oldImpl; + ISwapToRatio newImpl; + ISwapToRatio pythonImpl; + + UniProxyMock uniProxy; + HypervisorMock hypervisor; + MockSwapRouter swapRouter; + ERC20Mock tokenA; + ERC20Mock tokenB; + + function setUp() public { + uniProxy = new UniProxyMock(); + tokenA = new ERC20Mock("TokenA", "TKNA", 18); + tokenB = new ERC20Mock("TokenB", "TKNB", 18); + vm.label(address(tokenA), "TokenA"); + vm.label(address(tokenB), "TokenB"); + + hypervisor = new HypervisorMock("TokenA-TokenB", "TKNA-TKNB", address(tokenA), address(tokenB)); + swapRouter = new MockSwapRouter(); + uint24 swapFee = 500; + + oldImpl = new SwapToRatioOld(address(uniProxy), address(hypervisor), address(swapRouter), swapFee); + newImpl = new SwapToRatioNew(address(uniProxy), address(hypervisor), address(swapRouter), swapFee); + pythonImpl = new SwapToRatioPython(address(uniProxy), address(hypervisor), address(swapRouter), swapFee); + } + + function setUpState(uint160 _sqrtPriceX96, uint256 _tokenABalance, uint256 _tokenBBalance, uint256 _ratio) + internal + returns (uint160 _boundedSqrtPriceX96) + { + // Ensure _sqrtPriceX96 is within uniswap limits + _boundedSqrtPriceX96 = uint160(bound(uint256(_sqrtPriceX96), 4295128739, 3e37)); + + uint256 priceX192 = uint256(_sqrtPriceX96) * uint256(_sqrtPriceX96); + console.log("using price: %s, and ratio: %s", FullMath.mulDiv(1e18, priceX192, 1 << 192), _ratio); + + // Set the ratio in the proxy and router + uniProxy.setRatio(address(hypervisor), address(tokenA), _ratio); + swapRouter.setSqrtRate(address(tokenA), address(tokenB), _boundedSqrtPriceX96); + + // Mint balances for both tokens to swapRouter to facilitate swaps + uint256 swapRouterBalanceA = type(uint128).max; + tokenA.mint(address(swapRouter), swapRouterBalanceA); + // Adjust token B balances according to the derived ratio + tokenB.mint(address(swapRouter), FullMath.mulDiv(swapRouterBalanceA, _ratio, 10 ** tokenA.decimals())); + + // Bound token balances to avoid swapping more than the swap router has available + uint256 _boundedTokenABalance = bound(_tokenABalance, 10 ** tokenA.decimals(), type(uint88).max); + uint256 _boundedTokenBBalance = bound(_tokenBBalance, 10 ** tokenB.decimals(), type(uint88).max); + + // Mint balances for both tokens to the old and new implementations + tokenA.mint(address(oldImpl), _boundedTokenABalance); + tokenB.mint(address(oldImpl), _boundedTokenBBalance); + tokenA.mint(address(newImpl), _boundedTokenABalance); + tokenB.mint(address(newImpl), _boundedTokenBBalance); + tokenA.mint(address(pythonImpl), _boundedTokenABalance); + tokenB.mint(address(pythonImpl), _boundedTokenBBalance); + } + + function getPriceAtTick(int24 tick) public pure returns (uint256) { + uint160 sqrtPrice = TickMath.getSqrtRatioAtTick(tick); + uint256 priceX192 = uint256(sqrtPrice) * uint256(sqrtPrice); + return FullMath.mulDiv(1e18, priceX192, 1 << 192); + } + + function test_swapToRatioFuzz(uint256 priceTick, uint256 ratioTick, uint256 _tokenABalance, uint256 _tokenBBalance) + public + { + int24 boundedPriceTick = int24(int256(bound(priceTick, 0, 300_000 * 2))) - 300_000; + int24 boundedRatioTick = int24(int256(bound(ratioTick, 0, 80_000 * 2))) - 80_000; + + console.log("max price: %s, min price: %s", getPriceAtTick(300_000), getPriceAtTick(-300_000)); + console.log("max ratio %s, min ratio: %s", getPriceAtTick(80_000), getPriceAtTick(-80_000)); + + uint160 _sqrtPriceX96 = TickMath.getSqrtRatioAtTick(boundedPriceTick); + uint256 _ratio = getPriceAtTick(boundedRatioTick); + uint160 _boundedSqrtPriceX96 = setUpState(_sqrtPriceX96, _tokenABalance, _tokenBBalance, _ratio); + + // Snapshot the state of the VM to revert to after each call + uint256 snapshotId = vm.snapshot(); + + // Call the old implementation to swap to the ratio + (bool successOld, bytes memory returnDataOld) = swapToRatioOld(tokenA, tokenB); + + // Revert the state of the VM to the snapshot taken before the previous call + vm.revertTo(snapshotId); + + // Call the new implementation to swap to the ratio + (bool successNew, bytes memory returnDataNew) = swapToRatioNew(tokenA, tokenB, _boundedSqrtPriceX96); + + // Revert the state of the VM to the snapshot taken before both calls (this isn't strictly necessary) + vm.revertTo(snapshotId); + + // Assert that the old and new implementations have the same success status + if (successOld && successNew) { + // Retrieve the balances of the old implementation from JSON + (uint256 oldTokenABalance, uint256 oldTokenBBalance) = abi.decode( + vm.parseJson(vm.readFile("test/foundry/differential/balances.json"), ".oldImpl"), (uint256, uint256) + ); + // Retrieve the balances of the new implementation from JSON + (uint256 newTokenABalance, uint256 newTokenBBalance) = abi.decode( + vm.parseJson(vm.readFile("test/foundry/differential/balances.json"), ".newImpl"), (uint256, uint256) + ); + + console.log("oldTokenABalance", oldTokenABalance); + console.log("oldTokenBBalance", oldTokenBBalance); + console.log("newTokenABalance", newTokenABalance); + console.log("newTokenBBalance", newTokenBBalance); + + // ratio passed in is reversed in uniProxy, hence B over A here + assertApproxEqAbs(_ratio, (oldTokenBBalance * 1e18) / oldTokenABalance, (_ratio) / 1000, "old wrong"); + assertApproxEqAbs(_ratio, (newTokenBBalance * 1e18) / newTokenABalance, (_ratio) / 3000, "new wrong"); + } else if (!successOld && successNew) { + console.log("old implementation reverted when the new one did not"); + } else if (successOld && !successNew) { + // this is bad – new implementation is less robust + assertTrue(false, "new implementation should not revert when old one does not"); + } else { + assertEq(keccak256(returnDataOld), keccak256(returnDataNew), "revert reasons should match"); + } + _resetJSON(); + } + + // Run with forge test --mt test_swapToRatioFuzzPython -vvv --ffi + function test_swapToRatioFuzzPython(uint160 _sqrtPriceX96, uint256 _tokenABalance, uint256 _tokenBBalance) public { + uint160 _boundedSqrtPriceX96 = setUpState(_sqrtPriceX96, _tokenABalance, _tokenBBalance, 0.5e18); + + // Snapshot the state of the VM to revert to after each call + uint256 snapshotId = vm.snapshot(); + + // Call the old implementation to swap to the ratio + swapToRatioOld(tokenA, tokenB); + + // Revert the state of the VM to the snapshot taken before the previous call + vm.revertTo(snapshotId); + + // Cache the balances before calling the new implementation + uint256 cachedBalanceA = tokenA.balanceOf(address(newImpl)); + uint256 cachedBalanceB = tokenB.balanceOf(address(newImpl)); + + // Call the new implementation to swap to the ratio + (bool successNew,) = swapToRatioNew(tokenA, tokenB, _boundedSqrtPriceX96); + + // Revert the state of the VM to the snapshot taken before the previous call + vm.revertTo(snapshotId); + + // Call the Python implementation to swap to the ratio + (bool successPython,) = swapToRatioPython(tokenA, _boundedSqrtPriceX96); + + // Revert the state of the VM to the snapshot taken before the call (this isn't strictly necessary) + vm.revertTo(snapshotId); + + if (successNew && successPython) { + // Retrieve the balances of the old implementation from JSON + (uint256 oldTokenABalance, uint256 oldTokenBBalance) = abi.decode( + vm.parseJson(vm.readFile("test/foundry/differential/balances.json"), ".oldImpl"), (uint256, uint256) + ); + + // Retrieve the balances of the new implementation from JSON + (uint256 newTokenABalance, uint256 newTokenBBalance) = abi.decode( + vm.parseJson(vm.readFile("test/foundry/differential/balances.json"), ".newImpl"), (uint256, uint256) + ); + + // Retrieve the balances of the new implementation from JSON + (uint256 pythonDeltaA, uint256 pythonDeltaB) = abi.decode( + vm.parseJson(vm.readFile("test/foundry/differential/balances.json"), ".pythonImpl"), (uint256, uint256) + ); + + console.log("oldTokenABalance", oldTokenABalance); + console.log("oldTokenBBalance", oldTokenBBalance); + console.log("newTokenABalance", newTokenABalance); + console.log("newTokenBBalance", newTokenBBalance); + console.log("pythonDeltaA", pythonDeltaA); + console.log("pythonDeltaB", pythonDeltaB); + console.log("cachedBalanceA", cachedBalanceA); + console.log("cachedBalanceB", cachedBalanceB); + console.log("cachedBalanceA - newTokenABalance", cachedBalanceA - newTokenABalance); + console.log("newTokenBBalance - cachedBalanceB", newTokenBBalance - cachedBalanceB); + + // Assert more of tokenA was able to be swapped + assertLe(newTokenABalance, oldTokenABalance); + assertGe(newTokenBBalance, oldTokenBBalance); + + // Assert that the new Solidity and Python implementations are equal within 1% to account for rounding errors + if (pythonDeltaA != 0 && pythonDeltaB != 0) { + assertApproxEqRel(pythonDeltaA, cachedBalanceA - newTokenABalance, 1e16); + assertApproxEqRel(pythonDeltaB, newTokenBBalance - cachedBalanceB, 1e16); + } + } + _resetJSON(); + } + + function swapToRatioOld(ERC20Mock _tokenA, ERC20Mock _tokenB) + internal + returns (bool successOld, bytes memory returnDataOld) + { + (successOld, returnDataOld) = address(oldImpl).call(abi.encodeCall(oldImpl._swapToRatio, address(_tokenA))); + + // If successful, cache the resulting balances + if (successOld) { + string memory path = "test/foundry/differential/balances.json"; + assertTrue(vm.exists(path)); + vm.writeJson(vm.toString(_tokenA.balanceOf(address(oldImpl))), path, ".oldImpl.tokenA"); + vm.writeJson(vm.toString(_tokenB.balanceOf(address(oldImpl))), path, ".oldImpl.tokenB"); + } + } + + function swapToRatioNew(ERC20Mock _tokenA, ERC20Mock _tokenB, uint160 _sqrtPriceX96) + internal + returns (bool successNew, bytes memory returnDataNew) + { + (successNew, returnDataNew) = address(newImpl).call( + abi.encodeCall(SwapToRatioNew(address(newImpl))._swapToRatioMockPriceX96, (address(_tokenA), _sqrtPriceX96)) + ); + + // If successful, cache the resulting balances + if (successNew) { + string memory path = "test/foundry/differential/balances.json"; + assertTrue(vm.exists(path)); + vm.writeJson(vm.toString(_tokenA.balanceOf(address(newImpl))), path, ".newImpl.tokenA"); + vm.writeJson(vm.toString(_tokenB.balanceOf(address(newImpl))), path, ".newImpl.tokenB"); + } + } + + function swapToRatioPython(ERC20Mock _tokenA, uint160 _sqrtPriceX96) + internal + returns (bool successPython, bytes memory returnDataPython) + { + (successPython, returnDataPython) = address(pythonImpl).call( + abi.encodeCall( + SwapToRatioPython(address(pythonImpl))._swapToRatioMockPriceX96, (address(_tokenA), _sqrtPriceX96) + ) + ); + + if (successPython) { + string memory path = "test/foundry/differential/balances.json"; + assertTrue(vm.exists(path)); + vm.writeJson(vm.toString(SwapToRatioPython(address(pythonImpl)).delta_a()), path, ".pythonImpl.tokenA"); + vm.writeJson(vm.toString(SwapToRatioPython(address(pythonImpl)).delta_b()), path, ".pythonImpl.tokenB"); + } + } + + function _resetJSON() internal { + string memory path = "test/foundry/differential/balances.json"; + assertTrue(vm.exists(path)); + string memory initialContent = + '{"oldImpl":{"tokenA":"0","tokenB":"0"},"newImpl":{"tokenA":"0","tokenB":"0"},"pythonImpl":{"tokenA":"0","tokenB":"0"}}'; + vm.writeFile(path, initialContent); + } +} diff --git a/test/foundry/differential/balances.json b/test/foundry/differential/balances.json new file mode 100644 index 0000000..00de58c --- /dev/null +++ b/test/foundry/differential/balances.json @@ -0,0 +1 @@ +{"oldImpl":{"tokenA":"0","tokenB":"0"},"newImpl":{"tokenA":"0","tokenB":"0"},"pythonImpl":{"tokenA":"0","tokenB":"0"}} \ No newline at end of file diff --git a/test/foundry/differential/python/requirements.txt b/test/foundry/differential/python/requirements.txt new file mode 100644 index 0000000..4f187da --- /dev/null +++ b/test/foundry/differential/python/requirements.txt @@ -0,0 +1 @@ +eth_abi==5.0.0 \ No newline at end of file diff --git a/test/foundry/differential/python/swap_to_ratio.py b/test/foundry/differential/python/swap_to_ratio.py new file mode 100644 index 0000000..0e0d4d9 --- /dev/null +++ b/test/foundry/differential/python/swap_to_ratio.py @@ -0,0 +1,52 @@ +from eth_abi import encode +import argparse + + +def main(args): + if args.function == "swap_to_ratio": + delta_a, delta_b = swap_to_ratio(args) + encode_and_print(delta_a, delta_b) + + +def swap_to_ratio(args): + if not args.price or args.price == 0 or args.ratio == 0: + return (0, 0) + + delta_a = 0 + delta_b = 0 + + a = args.balance_a / 1e18 + b = args.balance_b / 1e18 + r = args.ratio / 1e18 + p = args.price / 1e18 + + rb = r * b + d = 1 + (r / p) + + if a > rb: + delta_a = (a - rb) / d + else: + delta_a = (rb - a) / d + + return (int(delta_a * 1e18), int(delta_b * 1e18)) + + +def encode_and_print(delta_a, delta_b): + encoded_output = encode(["uint256", "uint256"], (delta_a, delta_b)) + ## append 0x for FFI parsing + print("0x" + encoded_output.hex()) + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("function", choices=["swap_to_ratio"]) + parser.add_argument("--price", type=int) + parser.add_argument("--ratio", type=int) + parser.add_argument("--balance-a", type=int) + parser.add_argument("--balance-b", type=int) + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + main(args) diff --git a/test/foundry/fixtures/Common.sol b/test/foundry/fixtures/Common.sol new file mode 100644 index 0000000..5b0281e --- /dev/null +++ b/test/foundry/fixtures/Common.sol @@ -0,0 +1,151 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "@chimera/Hevm.sol"; + +import {MockWETH} from "src/test_utils/MockWETH.sol"; +import {USDsMock} from "src/test_utils/USDsMock.sol"; +import {ERC20Mock} from "src/test_utils/ERC20Mock.sol"; +import {ChainlinkMock} from "src/test_utils/ChainlinkMock.sol"; +import {HypervisorMock} from "src/test_utils/HypervisorMock.sol"; +import {MockSwapRouter} from "src/test_utils/MockSwapRouter.sol"; + +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +contract Common { + using EnumerableSet for EnumerableSet.AddressSet; + using EnumerableSet for EnumerableSet.Bytes32Set; + + // Actors + address VAULT_OWNER = _makeAddr("Vault owner"); + address VAULT_MANAGER_OWNER = _makeAddr("Vault manager owner"); + address PROTOCOL = _makeAddr("Protocol"); + address LIQUIDATOR = _makeAddr("Liquidator"); + + // Constants + bytes32 constant NATIVE = "ETH"; + uint256 constant DEFAULT_ETH_USD_PRICE = 2500; + uint256 constant DEFAULT_WBTC_ETH_MULTIPLIER = 25; + uint256 constant DEFAULT_LINK_ETH_DIVISOR = 200; + uint256 constant COLLATERAL_RATE = 110_000; // 110% + uint256 constant PROTOCOL_FEE_RATE = 500; // 0.5% + uint24 constant UNISWAP_FEE = 500; // 0.05% + uint24 constant RAMSES_FEE = 3000; // 0.3% + uint16 constant VAULT_LIMIT = 10; + + // Mocks + USDsMock usds; + ERC20Mock usdc; + MockWETH weth; + ERC20Mock wbtc; + ERC20Mock link; + ChainlinkMock clNativeUsd; + ChainlinkMock clWbtcUsd; + ChainlinkMock clLinkUsd; + HypervisorMock usdsHypervisor; + HypervisorMock wbtcHypervisor; + HypervisorMock linkHypervisor; + MockSwapRouter uniswapRouter; + + // State + struct CollateralData { + ERC20Mock token; + ChainlinkMock clFeed; + HypervisorMock hypervisor; + bytes pathToUsdc; + bytes pathFromUsdc; + } + + mapping(bytes32 => CollateralData) collateralData; + EnumerableSet.Bytes32Set collateralSymbols; + EnumerableSet.AddressSet collateralTokens; + EnumerableSet.AddressSet allTokens; + + function setUp() public virtual { + usds = new USDsMock(); + usdc = new ERC20Mock("USD Coin", "USDC", 6); // NOTE: USDC cannot be a collateral token due to being paired with USDs + + // collateral tokens + collateralSymbols.add(NATIVE); + collateralTokens.add(address(0)); + + weth = new MockWETH(); + collateralSymbols.add(bytes32(bytes(weth.symbol()))); + collateralTokens.add(address(weth)); + + string memory wbtcSymbol = "WBTC"; + wbtc = new ERC20Mock("Wrapped Bitcoin", wbtcSymbol, 8); + collateralSymbols.add(bytes32(bytes(wbtcSymbol))); + collateralTokens.add(address(wbtc)); + + string memory linkSymbol = "LINK"; + link = new ERC20Mock("Chainlink", linkSymbol, 18); + collateralSymbols.add(bytes32(bytes(linkSymbol))); + collateralTokens.add(address(link)); + + // chainlink feeds + clNativeUsd = new ChainlinkMock("ETH/USD"); + clNativeUsd.setPrice(int256(DEFAULT_ETH_USD_PRICE * 10 ** clNativeUsd.decimals())); // $2,500 + + clWbtcUsd = new ChainlinkMock("WBTC/USD"); + clWbtcUsd.setPrice(int256(DEFAULT_ETH_USD_PRICE * DEFAULT_WBTC_ETH_MULTIPLIER * 10 ** clWbtcUsd.decimals())); // $62,500 + + clLinkUsd = new ChainlinkMock("LINK/USD"); + clLinkUsd.setPrice(int256(DEFAULT_ETH_USD_PRICE * 10 ** clLinkUsd.decimals() / DEFAULT_LINK_ETH_DIVISOR)); // $12.5 + + // gamma vaults + usdsHypervisor = new HypervisorMock("USDs-USDC", "USDs-USDC", address(usds), address(usdc)); + wbtcHypervisor = new HypervisorMock("WBTC-WETH", "WBTC-WETH", address(wbtc), address(weth)); + linkHypervisor = new HypervisorMock("LINK-WETH", "LINK-WETH", address(link), address(weth)); + + // collateral data + collateralData[NATIVE] = CollateralData( + ERC20Mock(address(0)), + clNativeUsd, + wbtcHypervisor, + abi.encode(address(weth), UNISWAP_FEE, address(usdc)), + abi.encode(address(usdc), UNISWAP_FEE, address(weth)) + ); // wbtcHypervisor because all native token gets converted to its wrapped equivalent. + collateralData[bytes32(bytes(weth.symbol()))] = CollateralData( + ERC20Mock(address(weth)), + clNativeUsd, + wbtcHypervisor, + abi.encode(address(weth), UNISWAP_FEE, address(usdc)), + abi.encode(address(usdc), UNISWAP_FEE, address(weth)) + ); + collateralData[bytes32(bytes(wbtcSymbol))] = CollateralData( + wbtc, + clWbtcUsd, + wbtcHypervisor, + abi.encode(address(wbtc), UNISWAP_FEE, address(usdc)), + abi.encode(address(usdc), UNISWAP_FEE, address(wbtc)) + ); + collateralData[bytes32(bytes(linkSymbol))] = CollateralData( + link, + clLinkUsd, + linkHypervisor, + abi.encode(address(link), UNISWAP_FEE, address(usdc)), + abi.encode(address(usdc), UNISWAP_FEE, address(link)) + ); + + // all tokens + allTokens.add(address(usds)); + allTokens.add(address(usdc)); + allTokens.add(address(0)); + allTokens.add(address(weth)); + allTokens.add(address(wbtc)); + allTokens.add(address(link)); + allTokens.add(address(usdsHypervisor)); + allTokens.add(address(wbtcHypervisor)); + allTokens.add(address(linkHypervisor)); + + // swap router + uniswapRouter = new MockSwapRouter(); + } + + // create our own version of this forge-std cheat to avoid linearization issues in invariant scaffolding + function _makeAddr(string memory name) internal virtual returns (address addr) { + addr = vm.addr(uint256(keccak256(abi.encodePacked(name)))); + // vm.label(addr, name); // TODO: investigate why medusa doesn't like this + } +} diff --git a/test/foundry/fixtures/ForkConstants.sol b/test/foundry/fixtures/ForkConstants.sol new file mode 100644 index 0000000..840775d --- /dev/null +++ b/test/foundry/fixtures/ForkConstants.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; + +import {ISwapRouter} from "src/interfaces/ISwapRouter.sol"; +import {IUniProxy} from "src/interfaces/IUniProxy.sol"; +import {IClearing} from "src/interfaces/IClearing.sol"; +import {IHypervisor} from "src/interfaces/IHypervisor.sol"; + +// Fork constants +string constant ENV_RPC_URL = "ARBITRUM_RPC_URL"; +string constant DEFAULT_RPC_URL = "https://arbitrum.llamarpc.com"; + +// Token constants +address constant USDC_ADDRESS = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831; +address constant WETH_ADDRESS = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; +address constant WBTC_ADDRESS = 0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f; +address constant LINK_ADDRESS = 0xf97f4df75117a78c1A5a0DBb814Af92458539FB4; +address constant ARB_ADDRESS = 0x912CE59144191C1204E64559FE8253a0e49E6548; +address constant GMX_ADDRESS = 0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a; +address constant PAXG_ADDRESS = 0xfEb4DfC8C4Cf7Ed305bb08065D08eC6ee6728429; +address constant RDNT_ADDRESS = 0x3082CC23568eA640225c2467653dB90e9250AaA0; +address constant SUSHI_ADDRESS = 0xd4d42F0b6DEF4CE0383636770eF773390d85c61A; + +ERC20 constant USDC = ERC20(USDC_ADDRESS); +ERC20 constant WETH = ERC20(WETH_ADDRESS); +ERC20 constant WBTC = ERC20(WBTC_ADDRESS); +ERC20 constant LINK = ERC20(LINK_ADDRESS); +ERC20 constant ARB = ERC20(ARB_ADDRESS); +ERC20 constant GMX = ERC20(GMX_ADDRESS); +ERC20 constant PAXG = ERC20(PAXG_ADDRESS); +ERC20 constant RDNT = ERC20(RDNT_ADDRESS); +ERC20 constant SUSHI = ERC20(SUSHI_ADDRESS); + +bytes32 constant USDC_SYMBOL = "USDC"; +bytes32 constant WETH_SYMBOL = "WETH"; +bytes32 constant WBTC_SYMBOL = "WBTC"; +bytes32 constant LINK_SYMBOL = "LINK"; +bytes32 constant ARB_SYMBOL = "ARB"; +bytes32 constant GMX_SYMBOL = "GMX"; +bytes32 constant PAXG_SYMBOL = "PAXG"; +bytes32 constant RDNT_SYMBOL = "RDNT"; +bytes32 constant SUSHI_SYMBOL = "SUSHI"; + +address constant USDC_WHALE = 0x2Df1c51E09aECF9cacB7bc98cB1742757f163dF7; +address constant WETH_WHALE = 0x70d95587d40A2caf56bd97485aB3Eec10Bee6336; +address constant WBTC_WHALE = 0x078f358208685046a11C85e8ad32895DED33A249; +address constant LINK_WHALE = 0x191c10Aa4AF7C30e871E70C95dB0E4eb77237530; +address constant ARB_WHALE = 0xF3FC178157fb3c87548bAA86F9d24BA38E649B58; +address constant GMX_WHALE = 0x908C4D94D34924765f1eDc22A1DD098397c59dD4; +address constant PAXG_WHALE = 0x694321B2f596C0610c03DEac16C7341933Aaa952; +// address constant RDNT_WHALE = ?; +address constant SUSHI_WHALE = 0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae; + +// Chainlink constants +address constant CL_NATIVE_USD_ADDRESS = 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612; +address constant CL_WBTC_USD_ADDRESS = 0xd0C7101eACbB49F3deCcCc166d238410D6D46d57; +address constant CL_LINK_USD_ADDRESS = 0x86E53CF1B870786351Da77A57575e79CB55812CB; +address constant CL_ARB_USD_ADDRESS = 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6; +address constant CL_GMX_USD_ADDRESS = 0xDB98056FecFff59D032aB628337A4887110df3dB; +address constant CL_PAXG_USD_ADDRESS = 0x2BA975D4D7922cD264267Af16F3bD177F206FE3c; +address constant CL_RDNT_USD_ADDRESS = 0x20d0Fcab0ECFD078B036b6CAf1FaC69A6453b352; +address constant CL_SUSHI_USD_ADDRESS = 0xb2A8BA74cbca38508BA1632761b56C897060147C; + +AggregatorV3Interface constant CL_NATIVE_USD = AggregatorV3Interface(CL_NATIVE_USD_ADDRESS); +AggregatorV3Interface constant CL_WBTC_USD = AggregatorV3Interface(CL_WBTC_USD_ADDRESS); +AggregatorV3Interface constant CL_LINK_USD = AggregatorV3Interface(CL_LINK_USD_ADDRESS); +AggregatorV3Interface constant CL_ARB_USD = AggregatorV3Interface(CL_ARB_USD_ADDRESS); +AggregatorV3Interface constant CL_GMX_USD = AggregatorV3Interface(CL_GMX_USD_ADDRESS); +AggregatorV3Interface constant CL_PAXG_USD = AggregatorV3Interface(CL_PAXG_USD_ADDRESS); +AggregatorV3Interface constant CL_RDNT_USD = AggregatorV3Interface(CL_RDNT_USD_ADDRESS); +AggregatorV3Interface constant CL_SUSHI_USD = AggregatorV3Interface(CL_SUSHI_USD_ADDRESS); + +// Router constants +address constant UNISWAP_ROUTER_ADDRESS = 0xE592427A0AEce92De3Edee1F18E0157C05861564; +address constant RAMSES_ROUTER_ADDRESS = 0xAA23611badAFB62D37E7295A682D21960ac85A90; + +ISwapRouter constant UNISWAP_ROUTER = ISwapRouter(UNISWAP_ROUTER_ADDRESS); +ISwapRouter constant RAMSES_ROUTER = ISwapRouter(RAMSES_ROUTER_ADDRESS); + +// Gamma constants +address constant UNI_PROXY_ADDRESS = 0x82FcEB07a4D01051519663f6c1c919aF21C27845; +address constant CLEARING_ADDRESS = 0x80a44ce970D9380bDA7677916B860f37b4ba8Ce2; + +IUniProxy constant UNI_PROXY = IUniProxy(UNI_PROXY_ADDRESS); +IClearing constant CLEARING = IClearing(CLEARING_ADDRESS); + +// Hypervisor constants +address constant WBTC_HYPERVISOR_ADDRESS = 0x52ee1FFBA696c5E9b0Bc177A9f8a3098420EA691; +address constant LINK_HYPERVISOR_ADDRESS = 0xfA392dbefd2d5ec891eF5aEB87397A89843a8260; +address constant ARB_HYPERVISOR_ADDRESS = 0x330DFC5Bc1a63A1dCf1cD5bc9aD3D5e5E61Bcb6C; +address constant GMX_HYPERVISOR_ADDRESS = 0xF08BDBC590C59cb7B27A8D224E419ef058952b5f; +address constant RDNT_HYPERVISOR_ADDRESS = 0x2BCBDD577616357464CFe307Bc67F9e820A66e80; + +IHypervisor constant WBTC_HYPERVISOR = IHypervisor(WBTC_HYPERVISOR_ADDRESS); +IHypervisor constant LINK_HYPERVISOR = IHypervisor(LINK_HYPERVISOR_ADDRESS); +IHypervisor constant ARB_HYPERVISOR = IHypervisor(ARB_HYPERVISOR_ADDRESS); +IHypervisor constant GMX_HYPERVISOR = IHypervisor(GMX_HYPERVISOR_ADDRESS); +IHypervisor constant RDNT_HYPERVISOR = IHypervisor(RDNT_HYPERVISOR_ADDRESS); + +// Protocol constants +bytes32 constant NATIVE = "ETH"; +uint256 constant COLLATERAL_RATE = 110_000; // 110% +uint256 constant PROTOCOL_FEE_RATE = 500; // 0.5% +uint24 constant UNISWAP_FEE = 500; // 0.05% +uint24 constant RAMSES_FEE = 3000; // 0.3% +uint16 constant VAULT_LIMIT = 10; diff --git a/test/foundry/fixtures/ForkFixture.sol b/test/foundry/fixtures/ForkFixture.sol new file mode 100644 index 0000000..7283416 --- /dev/null +++ b/test/foundry/fixtures/ForkFixture.sol @@ -0,0 +1,369 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {Test} from "forge-std/Test.sol"; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; + +import {TokenManager} from "src/TokenManager.sol"; +import {SmartVaultManagerV6} from "src/SmartVaultManagerV6.sol"; +import {SmartVaultDeployerV4} from "src/SmartVaultDeployerV4.sol"; +import {SmartVaultIndex} from "src/SmartVaultIndex.sol"; +import {SmartVaultYieldManager} from "src/SmartVaultYieldManager.sol"; +import {SmartVaultV4} from "src/SmartVaultV4.sol"; + +import {MockNFTMetadataGenerator} from "src/test_utils/MockNFTMetadataGenerator.sol"; +import {USDsMock} from "src/test_utils/USDsMock.sol"; +import "src/test_utils/BytecodeConstants.sol"; + +import {FullMath} from "src/uniswap/FullMath.sol"; +import {TickMath} from "src/uniswap/TickMath.sol"; +import {LiquidityAmounts} from "src/uniswap/LiquidityAmounts.sol"; + +import {IClearing} from "src/interfaces/IClearing.sol"; +import {IHypervisor} from "src/interfaces/IHypervisor.sol"; +import {IPeripheryImmutableState} from "src/interfaces/IPeripheryImmutableState.sol"; +import {IUniswapV3Pool} from "src/interfaces/IUniswapV3Pool.sol"; +import {IUniswapV3Factory} from "src/interfaces/IUniswapV3Factory.sol"; + +import "./ForkConstants.sol"; +import {HYPERVISOR_CODE} from "src/test_utils/BytecodeConstants.sol"; + +contract ForkFixture is Test { + // Actors + address VAULT_OWNER = _makeAddr("Vault owner"); + address VAULT_MANAGER_OWNER = _makeAddr("Vault manager owner"); + address YIELD_MANAGER_OWNER = _makeAddr("Yield manager owner"); + address PROTOCOL = _makeAddr("Protocol"); + address LIQUIDATOR = _makeAddr("Liquidator"); + address HYPERVISOR_FEE_RECIPIENT = _makeAddr("Hypervisor fee recipient"); + + // Protocol deployments + USDsMock usds; + IUniswapV3Pool usdsPool; + IHypervisor usdsHypervisor; + TokenManager tokenManager; + SmartVaultManagerV6 smartVaultManager; + SmartVaultYieldManager yieldManager; + SmartVaultV4 vault; + + // State + struct CollateralData { + ERC20 token; + AggregatorV3Interface clFeed; + IHypervisor hypervisor; + bytes pathToUsdc; + bytes pathFromUsdc; + } + + bytes32[] collateralSymbols; + mapping(bytes32 => CollateralData) collateralData; + + function setUp() public virtual { + // NOTE: we can't use these cheatcodes because they aren't supported by Crytic + // vm.createSelectFork(vm.envOr(ENV_RPC_URL, DEFAULT_RPC_URL)); + vm.selectFork(vm.createFork(DEFAULT_RPC_URL)); + + _labelConstants(); + _pushCollateralSymbols(); + _pushCollateralData(); + + _deployUsds(); + _deployTokenManager(); + _deployVaultManager(); + _deployYieldManager(); + _deployVault(); + } + + // create our own version of this forge-std cheat to avoid linearization issues in invariant scaffolding + function _makeAddr(string memory name) internal virtual returns (address addr) { + addr = vm.addr(uint256(keccak256(abi.encodePacked(name)))); + vm.label(addr, name); + } + + function _deal(ERC20 _token, address _whale, address _to) internal { + uint256 _balance = _token.balanceOf(_whale); + vm.prank(_whale); + _token.transfer(_to, _balance); + } + + function _labelConstants() internal { + vm.label(USDC_ADDRESS, "USDC"); + vm.label(WETH_ADDRESS, "WETH"); + vm.label(WBTC_ADDRESS, "WBTC"); + vm.label(LINK_ADDRESS, "LINK"); + vm.label(ARB_ADDRESS, "ARB"); + vm.label(GMX_ADDRESS, "GMX"); + vm.label(PAXG_ADDRESS, "PAXG"); + // vm.label(RDNT_ADDRESS, "RDNT"); + vm.label(SUSHI_ADDRESS, "SUSHI"); + + vm.label(CL_NATIVE_USD_ADDRESS, "Chainlink ETH/USD"); + vm.label(CL_WBTC_USD_ADDRESS, "Chainlink WBTC/USD"); + vm.label(CL_LINK_USD_ADDRESS, "Chainlink LINK/USD"); + vm.label(CL_ARB_USD_ADDRESS, "Chainlink ARB/USD"); + vm.label(CL_GMX_USD_ADDRESS, "Chainlink GMX/USD"); + vm.label(CL_PAXG_USD_ADDRESS, "Chainlink PAXG/USD"); + // vm.label(CL_RDNT_USD_ADDRESS, "Chainlink RDNT/USD"); + vm.label(CL_SUSHI_USD_ADDRESS, "Chainlink SUSHI/USD"); + + vm.label(UNISWAP_ROUTER_ADDRESS, "Uniswap Router"); + vm.label(RAMSES_ROUTER_ADDRESS, "Ramses Router"); + + vm.label(UNI_PROXY_ADDRESS, "UniProxy"); + vm.label(CLEARING_ADDRESS, "Clearing"); + + vm.label(WBTC_HYPERVISOR_ADDRESS, "WBTC Hypervisor"); + vm.label(LINK_HYPERVISOR_ADDRESS, "LINK Hypervisor"); + vm.label(ARB_HYPERVISOR_ADDRESS, "ARB Hypervisor"); + vm.label(GMX_HYPERVISOR_ADDRESS, "GMX Hypervisor"); + // vm.label(RDNT_HYPERVISOR_ADDRESS, "RDNT Hypervisor"); + } + + function _pushCollateralSymbols() internal { + _labelConstants(); + collateralSymbols.push(NATIVE); + collateralSymbols.push(WETH_SYMBOL); + collateralSymbols.push(WBTC_SYMBOL); + collateralSymbols.push(LINK_SYMBOL); + collateralSymbols.push(ARB_SYMBOL); + collateralSymbols.push(GMX_SYMBOL); + collateralSymbols.push(PAXG_SYMBOL); + // collateralSymbols.push(RDNT_SYMBOL); + collateralSymbols.push(SUSHI_SYMBOL); + } + + function _pushCollateralData() internal { + collateralData[NATIVE] = CollateralData( + ERC20(address(0)), + CL_NATIVE_USD, + WBTC_HYPERVISOR, + abi.encodePacked(WETH_ADDRESS, UNISWAP_FEE, USDC_ADDRESS), + abi.encodePacked(USDC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS) + ); + + collateralData[WETH_SYMBOL] = CollateralData( + WETH, + CL_NATIVE_USD, + WBTC_HYPERVISOR, + abi.encodePacked(WETH_ADDRESS, UNISWAP_FEE, USDC_ADDRESS), + abi.encodePacked(USDC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS) + ); + + collateralData[WBTC_SYMBOL] = CollateralData( + WBTC, + CL_WBTC_USD, + WBTC_HYPERVISOR, + abi.encodePacked(WBTC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS, UNISWAP_FEE, USDC_ADDRESS), + abi.encodePacked(USDC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS, UNISWAP_FEE, WBTC_ADDRESS) + ); + + collateralData[LINK_SYMBOL] = CollateralData( + LINK, + CL_LINK_USD, + LINK_HYPERVISOR, + abi.encodePacked(LINK_ADDRESS, RAMSES_FEE, WETH_ADDRESS, UNISWAP_FEE, USDC_ADDRESS), + abi.encodePacked(USDC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS, RAMSES_FEE, LINK_ADDRESS) + ); + + collateralData[ARB_SYMBOL] = CollateralData( + ARB, + CL_ARB_USD, + ARB_HYPERVISOR, + abi.encodePacked(ARB_ADDRESS, UNISWAP_FEE, WETH_ADDRESS, UNISWAP_FEE, USDC_ADDRESS), + abi.encodePacked(USDC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS, UNISWAP_FEE, ARB_ADDRESS) + ); + + collateralData[GMX_SYMBOL] = CollateralData( + GMX, + CL_GMX_USD, + GMX_HYPERVISOR, + abi.encodePacked(GMX_ADDRESS, RAMSES_FEE, WETH_ADDRESS, UNISWAP_FEE, USDC_ADDRESS), + abi.encodePacked(USDC_ADDRESS, UNISWAP_FEE, WETH_ADDRESS, RAMSES_FEE, GMX_ADDRESS) + ); + + collateralData[PAXG_SYMBOL] = + CollateralData(PAXG, CL_PAXG_USD, IHypervisor(address(0)), new bytes(0), new bytes(0)); + + collateralData[SUSHI_SYMBOL] = + CollateralData(SUSHI, CL_SUSHI_USD, IHypervisor(address(0)), new bytes(0), new bytes(0)); + + // TODO: RDNT configurations not clear + } + + function _deployUsds() internal { + // deploy USDs + usds = new USDsMock(); + vm.label(address(usds), "USDs"); + + // deploy USDs Ramses pool + IUniswapV3Factory factory = IUniswapV3Factory(IPeripheryImmutableState(RAMSES_ROUTER_ADDRESS).factory()); + usdsPool = IUniswapV3Pool(factory.createPool(USDC_ADDRESS, address(usds), UNISWAP_FEE)); + vm.label(address(usdsPool), "USDs/USDC Ramses Pool"); + + // deal tokens to this contract + usds.grantRole(usds.MINTER_ROLE(), address(this)); + usds.mint(address(this), 1_000_000 * 10 ** usds.decimals()); + _deal(USDC, USDC_WHALE, address(this)); + + // seed the pool with liquidity + _addUsdsLiquidity(); + + // deploy USDs/USDC hypervisor + usdsHypervisor = IHypervisor(_deployUsdsHypervisor()); + vm.label(address(usdsHypervisor), "USDs/USDC Hypervisor"); + } + + function _deployTokenManager() internal { + // deploy TokenManager + tokenManager = new TokenManager(NATIVE, CL_NATIVE_USD_ADDRESS); + + // add accepted tokens + for (uint256 i; i < collateralSymbols.length; i++) { + if (collateralSymbols[i] == NATIVE) continue; + + CollateralData memory collateral = collateralData[collateralSymbols[i]]; + tokenManager.addAcceptedToken(address(collateral.token), address(collateral.clFeed)); + } + } + + function _deployVaultManager() internal { + // deploy SmartVaultManager + smartVaultManager = new SmartVaultManagerV6(); + SmartVaultDeployerV4 smartVaultDeployer = new SmartVaultDeployerV4(NATIVE); + SmartVaultIndex smartVaultIndex = new SmartVaultIndex(); + MockNFTMetadataGenerator nftMetadataGenerator = new MockNFTMetadataGenerator(); + + // initialize SmartVaultManager + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.initialize( + COLLATERAL_RATE, + PROTOCOL_FEE_RATE, + address(usds), + PROTOCOL, + LIQUIDATOR, + address(tokenManager), + address(smartVaultDeployer), + address(smartVaultIndex), + address(nftMetadataGenerator), + VAULT_LIMIT + ); + // vm.startPrank(sender) is not yet fully supported by invariant fuzzers, so we have to duplicate vm.prank + // NOTE: the yield manager is set after it is deployed below + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.setSwapRouter(UNISWAP_ROUTER_ADDRESS); + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.setWethAddress(WETH_ADDRESS); + + smartVaultIndex.setVaultManager(address(smartVaultManager)); + usds.grantRole(usds.DEFAULT_ADMIN_ROLE(), address(smartVaultManager)); + } + + function _deployYieldManager() internal { + // deploy SmartVaultYieldManager + vm.prank(YIELD_MANAGER_OWNER); + yieldManager = new SmartVaultYieldManager( + address(usds), + USDC_ADDRESS, + WETH_ADDRESS, + UNI_PROXY_ADDRESS, + RAMSES_ROUTER_ADDRESS, + address(usdsHypervisor), + UNISWAP_ROUTER_ADDRESS + ); + + // add hypervisor data + for (uint256 i; i < collateralSymbols.length; i++) { + if (collateralSymbols[i] == NATIVE) continue; + + CollateralData memory collateral = collateralData[collateralSymbols[i]]; + if (address(collateral.hypervisor) == address(0)) continue; + + vm.prank(YIELD_MANAGER_OWNER); + yieldManager.addHypervisorData( + address(collateral.token), + address(collateral.hypervisor), + UNISWAP_FEE, + collateral.pathToUsdc, + collateral.pathFromUsdc + ); + } + + // set fee data + vm.prank(YIELD_MANAGER_OWNER); + yieldManager.setFeeData(PROTOCOL_FEE_RATE, address(smartVaultManager)); + + // set yield manager + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.setYieldManager(address(yieldManager)); + } + + function _deployVault() internal { + vm.prank(VAULT_OWNER); + (address smartVault,) = smartVaultManager.mint(); + + vault = SmartVaultV4(payable(smartVault)); + } + + function _addUsdsLiquidity() internal { + (address token0, address token1) = + address(usds) < USDC_ADDRESS ? (address(usds), USDC_ADDRESS) : (USDC_ADDRESS, address(usds)); + + uint256 price = (10 ** ERC20(token1).decimals() * 1 << 192) / 10 ** ERC20(token0).decimals(); + uint160 sqrtPriceX96 = uint160(FullMath.sqrt(price)); + + int24 tick = TickMath.getTickAtSqrtRatio(sqrtPriceX96); + + IUniswapV3Pool(usdsPool).initialize(sqrtPriceX96); + + int24 tickLower = tick - 10 - tick % IUniswapV3Pool(usdsPool).tickSpacing(); + int24 tickUpper = tick + 10 + tick % IUniswapV3Pool(usdsPool).tickSpacing(); + + uint128 liquidity = LiquidityAmounts.getLiquidityForAmounts( + sqrtPriceX96, + TickMath.getSqrtRatioAtTick(tickLower), + TickMath.getSqrtRatioAtTick(tickUpper), + 100_000 * 10 ** ERC20(token0).decimals(), + 100_000 * 10 ** ERC20(token1).decimals() + ); + IUniswapV3Pool(usdsPool).mint(address(this), tickLower, tickUpper, liquidity, ""); + + IUniswapV3Pool(usdsPool).increaseObservationCardinalityNext(100); + } + + function ramsesV2MintCallback(uint256 amount0Owed, uint256 amount1Owed, bytes calldata) external { + usds.transfer(msg.sender, amount0Owed); + USDC.transfer(msg.sender, amount1Owed); + } + + // TODO: investigate whether there is a simpler way to do this without using raw bytecode + function _deployUsdsHypervisor() internal returns (address hypervisor) { + bytes memory constructorParams = abi.encode(usdsPool, address(this), "USDs-USDC Hypervisor", "USDs-USDC"); + bytes memory bytecodeWithParams = bytes.concat(HYPERVISOR_CODE, constructorParams); + + assembly { + hypervisor := create(0, add(bytecodeWithParams, 0x20), mload(bytecodeWithParams)) + } + + vm.assertNotEq(hypervisor, address(0)); + IHypervisor(hypervisor).setWhitelist(UNI_PROXY_ADDRESS); + vm.prank(IClearing(UNI_PROXY_ADDRESS).owner()); + CLEARING.addPosition(hypervisor, 1); + + IHypervisor(hypervisor).rebalance( + -276350, // base lower + -276300, // base upper + -276280, // limit lower + -276230, // limit upper + HYPERVISOR_FEE_RECIPIENT, + [uint256(0), uint256(0), uint256(0), uint256(0)], + [uint256(0), uint256(0), uint256(0), uint256(0)] + ); + vm.warp(block.timestamp + 3601); + + usds.approve(hypervisor, 1_000 * 10 ** usds.decimals()); + USDC.approve(hypervisor, 1_000 * 10 ** USDC.decimals()); + UNI_PROXY.deposit(1000e18, 1000e6, msg.sender, hypervisor, [uint256(0), uint256(0), uint256(0), uint256(0)]); + } +} diff --git a/test/foundry/fixtures/SmartVaultFixture.sol b/test/foundry/fixtures/SmartVaultFixture.sol new file mode 100644 index 0000000..ab5c4b8 --- /dev/null +++ b/test/foundry/fixtures/SmartVaultFixture.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "@chimera/Hevm.sol"; + +import {SmartVaultYieldManagerFixture} from "./SmartVaultYieldManagerFixture.sol"; + +import {SmartVaultV4} from "src/SmartVaultV4.sol"; +import {PriceCalculator} from "src/PriceCalculator.sol"; + +contract SmartVaultFixture is SmartVaultYieldManagerFixture { + struct VaultData { + SmartVaultV4 vault; + uint256 tokenId; + } + + mapping(address => VaultData[]) smartVaults; + + function setUp() public virtual override { + super.setUp(); + } + + function _createSmartVaultViaManager(address owner) internal returns (SmartVaultV4) { + vm.prank(owner); + (address vault, uint256 tokenId) = smartVaultManager.mint(); + smartVaults[owner].push(VaultData(SmartVaultV4(payable(vault)), tokenId)); + return SmartVaultV4(payable(vault)); + } + + function _createStandaloneSmartVault(address owner) internal returns (SmartVaultV4 vault) { + // NOTE: Smart vault is deployed bypassing the manager, so we need to grant USDs minter/burner roles + vault = new SmartVaultV4( + NATIVE, address(smartVaultManager), owner, address(usds), address(new PriceCalculator(NATIVE)) + ); + usds.grantRole(usds.MINTER_ROLE(), address(vault)); + usds.grantRole(usds.BURNER_ROLE(), address(vault)); + } + + function _getVaultCollateralVaulue(SmartVaultV4 vault) internal view returns (uint256) { + return vault.status().totalCollateralValue; + } +} diff --git a/test/foundry/fixtures/SmartVaultManagerFixture.sol b/test/foundry/fixtures/SmartVaultManagerFixture.sol new file mode 100644 index 0000000..6cec195 --- /dev/null +++ b/test/foundry/fixtures/SmartVaultManagerFixture.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "@chimera/Hevm.sol"; + +import {SmartVaultYieldManagerFixture} from "./SmartVaultYieldManagerFixture.sol"; +import {TokenManagerFixture} from "./TokenManagerFixture.sol"; + +import {SmartVaultDeployerV4} from "src/SmartVaultDeployerV4.sol"; +import {SmartVaultIndex} from "src/SmartVaultIndex.sol"; +import {SmartVaultManagerV6} from "src/SmartVaultManagerV6.sol"; + +import {MockNFTMetadataGenerator} from "src/test_utils/MockNFTMetadataGenerator.sol"; + +contract SmartVaultManagerFixture is TokenManagerFixture { + SmartVaultManagerV6 smartVaultManager; + SmartVaultIndex smartVaultIndex; + + function setUp() public virtual override { + super.setUp(); + + SmartVaultDeployerV4 smartVaultDeployer = new SmartVaultDeployerV4(NATIVE); + smartVaultIndex = new SmartVaultIndex(); + + MockNFTMetadataGenerator nftMetadataGenerator = new MockNFTMetadataGenerator(); + + smartVaultManager = new SmartVaultManagerV6(); + + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.initialize( + COLLATERAL_RATE, + PROTOCOL_FEE_RATE, + address(usds), + PROTOCOL, + LIQUIDATOR, + address(tokenManager), + address(smartVaultDeployer), + address(smartVaultIndex), + address(nftMetadataGenerator), + // address(yieldManager), + VAULT_LIMIT + ); + // address(uniswapRouter), + // address(weth) + // vm.startPrank(sender) is not yet fully supported by invariant fuzzers, so we have to duplicate vm.prank + // NOTE: the yield manager is set in the SmartVaultYieldManagerFixture + // vm.prank(VAULT_MANAGER_OWNER); + // smartVaultManager.setYieldManager(address(yieldManager)); + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.setSwapRouter(address(uniswapRouter)); + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.setWethAddress(address(weth)); + + // the foundry deployment address is the owner of the smartVaultIndex + smartVaultIndex.setVaultManager(address(smartVaultManager)); + // the usds mock does not have any ownership access controls, only default admin and minter/burner roles + usds.grantRole(usds.DEFAULT_ADMIN_ROLE(), address(smartVaultManager)); + } +} diff --git a/test/foundry/fixtures/SmartVaultYieldManagerFixture.sol b/test/foundry/fixtures/SmartVaultYieldManagerFixture.sol new file mode 100644 index 0000000..591a192 --- /dev/null +++ b/test/foundry/fixtures/SmartVaultYieldManagerFixture.sol @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import "@chimera/Hevm.sol"; + +import {SmartVaultManagerFixture} from "./SmartVaultManagerFixture.sol"; + +import {SmartVaultYieldManager} from "src/SmartVaultYieldManager.sol"; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import {FullMath} from "src/uniswap/FullMath.sol"; +import {IUniswapV3Pool} from "src/interfaces/IUniswapV3Pool.sol"; + +import {MockSwapRouter} from "src/test_utils/MockSwapRouter.sol"; +import {UniProxyMock} from "src/test_utils/UniProxyMock.sol"; +import {MockUniswapFactory} from "src/test_utils/MockUniswapFactory.sol"; +import {MockRamsesFactory} from "src/test_utils/MockRamsesFactory.sol"; +import {MockRamsesPool} from "src/test_utils/MockRamsesPool.sol"; + +contract SmartVaultYieldManagerFixture is SmartVaultManagerFixture { + using EnumerableSet for EnumerableSet.Bytes32Set; + using SafeERC20 for IERC20; + + SmartVaultYieldManager yieldManager; + + function setUp() public virtual override { + super.setUp(); + + UniProxyMock uniProxy = new UniProxyMock(); + MockSwapRouter ramsesRouter = new MockSwapRouter(); + + { + MockRamsesPool impl = new MockRamsesPool(); + MockRamsesFactory ramsesFactory = new MockRamsesFactory(address(impl)); + ramsesRouter.setFactory(address(ramsesFactory)); + address pool = ramsesFactory.deploy(address(usds), address(usdc)); + // vm.label(pool, "USDs/USDC Ramses Pool"); // TODO: investigate why medusa doesn't like this + MockRamsesPool(pool).setPrice(_calcSqrtX96(address(usds), address(usdc), 1)); + } + + // uni proxy ratios + uniProxy.setRatio(address(usdsHypervisor), address(usdc), 10 ** (18 + usds.decimals() - usdc.decimals())); // 1:1 + uniProxy.setRatio( + address(wbtcHypervisor), + address(wbtc), + DEFAULT_WBTC_ETH_MULTIPLIER * 10 ** (18 + weth.decimals() - wbtc.decimals()) + ); // 1:25 + uniProxy.setRatio( + address(wbtcHypervisor), + address(weth), + 10 ** (18 + wbtc.decimals() - weth.decimals()) / DEFAULT_WBTC_ETH_MULTIPLIER + ); // 25:1 + uniProxy.setRatio( + address(linkHypervisor), + address(link), + 10 ** (18 + weth.decimals() - link.decimals()) / DEFAULT_LINK_ETH_DIVISOR + ); // 200:1 + uniProxy.setRatio( + address(linkHypervisor), + address(weth), + DEFAULT_LINK_ETH_DIVISOR * 10 ** (18 + weth.decimals() - link.decimals()) + ); // 1:200 + + // ramses router rates: usds <-> usdc + ramsesRouter.setRate(address(usds), address(usdc), 10 ** (18 + usdc.decimals() - usds.decimals())); // 1:1 + ramsesRouter.setRate(address(usdc), address(usds), 10 ** (18 + usds.decimals() - usdc.decimals())); // 1:1 + { + MockUniswapFactory uniFactory = new MockUniswapFactory(); + uniswapRouter.setFactory(address(uniFactory)); + + // uniswap router rates: weth/wbtc/link <-> usdc + uniswapRouter.setRate( + address(weth), address(usdc), DEFAULT_ETH_USD_PRICE * 10 ** (18 + usdc.decimals() - weth.decimals()) + ); // 2500000000: 1 WETH <-> 2500 USDC ✅ exactInput/Output + uniswapRouter.setRate( + address(usdc), address(weth), 10 ** (18 + weth.decimals() - usdc.decimals()) / DEFAULT_ETH_USD_PRICE + ); // 400000000000000000000000000: 2500 USDC <-> 1 WETH ✅ exactInput/Output + + address wethUsdcPool = uniFactory.deploy(address(weth), address(usdc), UNISWAP_FEE); + IUniswapV3Pool(wethUsdcPool).initialize(_calcSqrtX96(address(usdc), address(weth), DEFAULT_ETH_USD_PRICE)); + + uniswapRouter.setRate( + address(wbtc), + address(usdc), + DEFAULT_ETH_USD_PRICE * DEFAULT_WBTC_ETH_MULTIPLIER * 10 ** (18 + usdc.decimals() - wbtc.decimals()) + ); // 625000000000000000000: 1 WBTC <-> 62500 USDC ✅ exactInput/Output + uniswapRouter.setRate( + address(usdc), + address(wbtc), + 10 ** (18 + wbtc.decimals() - usdc.decimals()) / (DEFAULT_ETH_USD_PRICE * DEFAULT_WBTC_ETH_MULTIPLIER) + ); // 1600000000000000: 62500 USDC <-> 1 WBTC ✅ exactInput/Output + address usdcWbtcPool = uniFactory.deploy(address(usdc), address(wbtc), UNISWAP_FEE); + IUniswapV3Pool(usdcWbtcPool).initialize( + _calcSqrtX96(address(usdc), address(wbtc), DEFAULT_ETH_USD_PRICE * DEFAULT_WBTC_ETH_MULTIPLIER) + ); + + uniswapRouter.setRate( + address(link), + address(usdc), + DEFAULT_ETH_USD_PRICE * 10 ** (18 + usdc.decimals() - link.decimals()) / DEFAULT_LINK_ETH_DIVISOR + ); // 12500000: 1 LINK <-> 12.5 USDC ✅ exactInput/Output + uniswapRouter.setRate( + address(usdc), + address(link), + DEFAULT_LINK_ETH_DIVISOR * 10 ** (18 + link.decimals() - usdc.decimals()) / DEFAULT_ETH_USD_PRICE + ); // 80000000000000000000000000000: 12.5 USDC <-> 1 LINK ✅ exactInput/Output + address usdcLinkPool = uniFactory.deploy(address(usdc), address(link), UNISWAP_FEE); + IUniswapV3Pool(usdcLinkPool).initialize( + _calcSqrtX96(address(usdc), address(link), DEFAULT_ETH_USD_PRICE / DEFAULT_LINK_ETH_DIVISOR) + ); + + // uniswap router rates: wbtc/link <-> weth + uniswapRouter.setRate( + address(wbtc), + address(weth), + DEFAULT_WBTC_ETH_MULTIPLIER * 10 ** (18 + weth.decimals() - wbtc.decimals()) + ); // 250000000000000000000000000000: 1 WBTC <-> 25 WETH ✅ exactInput/Output + uniswapRouter.setRate( + address(weth), + address(wbtc), + 10 ** (18 + wbtc.decimals() - weth.decimals()) / (DEFAULT_WBTC_ETH_MULTIPLIER) + ); // 4000000: 25 WETH <-> 1 WBTC ✅ exactInput/Output + address wbtcWethPool = uniFactory.deploy(address(wbtc), address(weth), UNISWAP_FEE); + IUniswapV3Pool(wbtcWethPool).initialize( + _calcSqrtX96(address(weth), address(wbtc), DEFAULT_WBTC_ETH_MULTIPLIER) + ); + + uniswapRouter.setRate( + address(link), address(weth), 10 ** (18 + weth.decimals() - link.decimals()) / DEFAULT_LINK_ETH_DIVISOR + ); // 5000000000000000: 200 LINK <-> 1 WETH ✅ exactInput/Output + uniswapRouter.setRate( + address(weth), address(link), DEFAULT_LINK_ETH_DIVISOR * 10 ** (18 + link.decimals() - weth.decimals()) + ); // 200000000000000000000: 1 WETH <-> 200 LINK ✅ exactInput/Output + address linkWethPool = uniFactory.deploy(address(link), address(weth), UNISWAP_FEE); + IUniswapV3Pool(linkWethPool).initialize( + _calcSqrtX96(address(link), address(weth), DEFAULT_LINK_ETH_DIVISOR) + ); + } + // mint tokens ($25M worth of each) to swap routers + uint256 usdsAmount = 25_000_000 * 10 ** usds.decimals(); + uint256 usdcAmount = 25_000_000 * 10 ** usdc.decimals(); + uint256 wbtcAmount = 400 * 10 ** wbtc.decimals(); + uint256 wethAmount = 10_000 * 10 ** weth.decimals(); + uint256 linkAmount = 2_000_000 * 10 ** link.decimals(); + + usds.grantRole(usds.MINTER_ROLE(), address(this)); + usds.mint(address(ramsesRouter), 25_000_000 * 10 ** usds.decimals()); + usdc.mint(address(ramsesRouter), 25_000_000 * 10 ** usdc.decimals()); + usdc.mint(address(uniswapRouter), 25_000_000 * 10 ** usdc.decimals()); + weth.mint(address(uniswapRouter), 10_000 * 10 ** weth.decimals()); + vm.deal(address(weth), address(weth).balance + 10_000 * 10 ** weth.decimals()); + wbtc.mint(address(uniswapRouter), 400 * 10 ** wbtc.decimals()); + link.mint(address(uniswapRouter), 2_000_000 * 10 ** link.decimals()); + + // deposit tokens (based on the rates) to hypervisors and burn tokens to ensure the rates are correct + // and these underlying tokens remain in the hypervisors when testing yield manager withdrawal logic + // NOTE: this is part of a workaround for the _swapToRatio() logic in the yield manager + IERC20(address(usds)).safeApprove(address(usdsHypervisor), usdsAmount); + IERC20(address(usdc)).safeApprove(address(usdsHypervisor), usdcAmount); + IERC20(address(wbtc)).safeApprove(address(wbtcHypervisor), wbtcAmount); + IERC20(address(weth)).safeApprove(address(wbtcHypervisor), wethAmount); + IERC20(address(link)).safeApprove(address(linkHypervisor), linkAmount); + IERC20(address(weth)).safeApprove(address(linkHypervisor), wethAmount); + + usds.mint(address(this), usdsAmount); + usdc.mint(address(this), usdcAmount); + wbtc.mint(address(this), wbtcAmount); + weth.mint(address(this), 2 * wethAmount); + vm.deal(address(weth), address(weth).balance + 2 * wethAmount); + link.mint(address(this), linkAmount); + + uniProxy.deposit( + usdsAmount, + usdcAmount, + address(0xDEAD), + address(usdsHypervisor), + [uint256(0), uint256(0), uint256(0), uint256(0)] + ); + uniProxy.deposit( + wbtcAmount, + wethAmount, + address(0xDEAD), + address(wbtcHypervisor), + [uint256(0), uint256(0), uint256(0), uint256(0)] + ); + uniProxy.deposit( + linkAmount, + wethAmount, + address(0xDEAD), + address(linkHypervisor), + [uint256(0), uint256(0), uint256(0), uint256(0)] + ); + + yieldManager = new SmartVaultYieldManager( + address(usds), + address(usdc), + address(weth), + address(uniProxy), + address(ramsesRouter), + address(usdsHypervisor), + address(uniswapRouter) + ); + + // add hypervisor data + for (uint256 i; i < collateralSymbols.length(); i++) { + if (collateralSymbols.at(i) == NATIVE) continue; + + CollateralData memory collateral = collateralData[collateralSymbols.at(i)]; + yieldManager.addHypervisorData( + address(collateral.token), + address(collateral.hypervisor), + UNISWAP_FEE, + collateral.pathToUsdc, + collateral.pathFromUsdc + ); + } + + // set fee data + yieldManager.setFeeData(PROTOCOL_FEE_RATE, address(smartVaultManager)); + + // set yield manager + vm.prank(VAULT_MANAGER_OWNER); + smartVaultManager.setYieldManager(address(yieldManager)); + } + + function _calcSqrtX96(address tokenA, address tokenB, uint256 ratio) internal view returns (uint160) { + (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + bool aIs0 = tokenA == token0; + + uint256 price = aIs0 + ? FullMath.mulDiv(ratio * 10 ** ERC20(token1).decimals(), 1 << 192, 10 ** ERC20(token0).decimals()) + : FullMath.mulDiv(10 ** ERC20(token1).decimals(), 1 << 192, ratio * 10 ** ERC20(token0).decimals()); + + return uint160(FullMath.sqrt(price)); + } +} diff --git a/test/foundry/fixtures/TokenManagerFixture.sol b/test/foundry/fixtures/TokenManagerFixture.sol new file mode 100644 index 0000000..d26bd54 --- /dev/null +++ b/test/foundry/fixtures/TokenManagerFixture.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.17; + +import {Common} from "./Common.sol"; +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import {TokenManager} from "src/TokenManager.sol"; + +contract TokenManagerFixture is Common { + using EnumerableSet for EnumerableSet.Bytes32Set; + + TokenManager tokenManager; + + function setUp() public virtual override { + super.setUp(); + + tokenManager = new TokenManager(NATIVE, address(clNativeUsd)); + + for (uint256 i; i < collateralSymbols.length(); i++) { + if (collateralSymbols.at(i) == NATIVE) continue; + + CollateralData memory collateral = collateralData[collateralSymbols.at(i)]; + tokenManager.addAcceptedToken(address(collateral.token), address(collateral.clFeed)); + } + } +} diff --git a/test/foundry/invariant/BeforeAfter.sol b/test/foundry/invariant/BeforeAfter.sol new file mode 100644 index 0000000..749a314 --- /dev/null +++ b/test/foundry/invariant/BeforeAfter.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {SmartVaultV4, ISmartVault} from "src/SmartVaultV4.sol"; + +import {Helper} from "./Helper.sol"; + +// ghost variables for tracking state variable values before and after function calls +abstract contract BeforeAfter is Helper { + struct Vars { + bytes4 sig; + uint256 minted; + uint256 maxMintable; + uint256 totalCollateralValue; + bool liquidated; + bool undercollateralised; + uint256 nativeBalance; + } + + Vars internal _before; + Vars internal _after; + + modifier clear() { + Vars memory e; + _before = e; + _after = e; + _; + } + + // NOTE: this is helpful if we are considering only a single SmartVault + modifier hasMintedUsds() { + (_before.minted) = smartVault.status().minted; + precondition(_before.minted > 0); + _; + } + + function __snapshot(Vars storage vars, SmartVaultV4 vault) internal { + vars.sig = msg.sig; + // NOTE: use vault token ids for multiple SmartVaults + // SmartVaultV4 vault = _tokenIdToSmartVault(tokenId); + vars.minted = vault.status().minted; + vars.maxMintable = vault.status().maxMintable; + vars.totalCollateralValue = vault.status().totalCollateralValue; + vars.liquidated = vault.status().liquidated; + vars.undercollateralised = vault.undercollateralised(); + vars.nativeBalance = address(vault).balance; + } + + function __before(SmartVaultV4 vault) internal { + __snapshot(_before, vault); + } + + function __after(SmartVaultV4 vault) internal { + __snapshot(_after, vault); + } +} diff --git a/test/foundry/invariant/Bounds.sol b/test/foundry/invariant/Bounds.sol new file mode 100644 index 0000000..21399c9 --- /dev/null +++ b/test/foundry/invariant/Bounds.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +abstract contract Bounds { + uint256 internal constant MIN_STABLE_PERCENTAGE = 1e4; + uint256 internal constant MAX_STABLE_PERCENTAGE = 1e5; + int256 internal constant DEFAULT_CL_MIN = 1e5; + int256 internal constant DEFAULT_CL_MAX = 1e18; +} diff --git a/test/foundry/invariant/ExpectedErrors.sol b/test/foundry/invariant/ExpectedErrors.sol new file mode 100644 index 0000000..9291f1c --- /dev/null +++ b/test/foundry/invariant/ExpectedErrors.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Properties} from "./Properties.sol"; +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {stdError} from "forge-std/StdError.sol"; + +import {SmartVaultV4} from "src/SmartVaultV4.sol"; +import {SmartVaultYieldManager} from "src/SmartVaultYieldManager.sol"; + +abstract contract ExpectedErrors is Properties { + bool internal success; + bytes internal returnData; + + bytes4[] internal LIQUIDATE_VAULT_ERRORS; + bytes4[] internal REMOVE_VAULT_TOKEN_ERRORS; + bytes4[] internal MINT_DEBT_ERRORS; + bytes4[] internal BURN_DEBT_ERRORS; + bytes4[] internal SWAP_COLLATERAL_ERRORS; + bytes4[] internal DEPOSIT_YIELD_ERRORS; + bytes4[] internal WITHDRAW_YIELD_ERRORS; + bytes4[] internal EMPTY_ERRORS; + + constructor() { + // LIQUIDATE_VAULT_ERRORS + LIQUIDATE_VAULT_ERRORS.push(SmartVaultV4.InvalidUser.selector); + LIQUIDATE_VAULT_ERRORS.push(SmartVaultV4.NotUndercollateralised.selector); + LIQUIDATE_VAULT_ERRORS.push(SmartVaultV4.TransferError.selector); + LIQUIDATE_VAULT_ERRORS.push(_encodeError("SafeERC20: low-level call failed")); + LIQUIDATE_VAULT_ERRORS.push(_encodeError("SafeERC20: ERC20 operation did not succeed")); + LIQUIDATE_VAULT_ERRORS.push(_encodeError("err-invalid-liquidator")); + LIQUIDATE_VAULT_ERRORS.push(_encodeError("vault-not-undercollateralised")); + LIQUIDATE_VAULT_ERRORS.push(_encodeError("other-liquidation-error")); + + // REMOVE_VAULT_TOKEN_ERRORS + REMOVE_VAULT_TOKEN_ERRORS.push(SmartVaultV4.InvalidUser.selector); + REMOVE_VAULT_TOKEN_ERRORS.push(SmartVaultV4.Undercollateralised.selector); + REMOVE_VAULT_TOKEN_ERRORS.push(SmartVaultV4.TransferError.selector); + REMOVE_VAULT_TOKEN_ERRORS.push(_encodeError("SafeERC20: low-level call failed")); + REMOVE_VAULT_TOKEN_ERRORS.push(_encodeError("SafeERC20: ERC20 operation did not succeed")); + REMOVE_VAULT_TOKEN_ERRORS.push(_encodeError("Address: call to non-contract")); + + // MINT_DEBT_ERRORS + MINT_DEBT_ERRORS.push(SmartVaultV4.InvalidUser.selector); + MINT_DEBT_ERRORS.push(SmartVaultV4.VaultLiquidated.selector); + MINT_DEBT_ERRORS.push(SmartVaultV4.Undercollateralised.selector); + MINT_DEBT_ERRORS.push(_encodeError("ERC20: mint to the zero address")); + + // BURN_DEBT_ERRORS + BURN_DEBT_ERRORS.push(SmartVaultV4.InvalidUser.selector); + BURN_DEBT_ERRORS.push(SmartVaultV4.Overrepay.selector); + BURN_DEBT_ERRORS.push(_encodeError("ERC20: burn amount exceeds balance")); + + // SWAP_COLLATERAL_ERRORS + SWAP_COLLATERAL_ERRORS.push(SmartVaultV4.InvalidUser.selector); + SWAP_COLLATERAL_ERRORS.push(SmartVaultV4.InvalidToken.selector); + SWAP_COLLATERAL_ERRORS.push(SmartVaultV4.TransferError.selector); + SWAP_COLLATERAL_ERRORS.push(_encodeError("SafeERC20: low-level call failed")); + SWAP_COLLATERAL_ERRORS.push(_encodeError("SafeERC20: ERC20 operation did not succeed")); + SWAP_COLLATERAL_ERRORS.push(_encodeError("SafeERC20: approve from non-zero to non-zero allowance")); + SWAP_COLLATERAL_ERRORS.push(bytes4(keccak256(stdError.arithmeticError))); + SWAP_COLLATERAL_ERRORS.push(_encodeError("")); + + // DEPOSIT_YIELD_ERRORS + DEPOSIT_YIELD_ERRORS.push(SmartVaultV4.InvalidUser.selector); + DEPOSIT_YIELD_ERRORS.push(SmartVaultV4.InvalidToken.selector); + DEPOSIT_YIELD_ERRORS.push(SmartVaultV4.Undercollateralised.selector); + DEPOSIT_YIELD_ERRORS.push(_encodeError("SafeERC20: low-level call failed")); + DEPOSIT_YIELD_ERRORS.push(_encodeError("SafeERC20: ERC20 operation did not succeed")); + DEPOSIT_YIELD_ERRORS.push(_encodeError("SafeERC20: approve from non-zero to non-zero allowance")); + DEPOSIT_YIELD_ERRORS.push(SmartVaultYieldManager.StablePoolPercentageError.selector); + DEPOSIT_YIELD_ERRORS.push(SmartVaultYieldManager.HypervisorDataError.selector); + DEPOSIT_YIELD_ERRORS.push(SmartVaultYieldManager.RatioError.selector); + DEPOSIT_YIELD_ERRORS.push(bytes4(keccak256(stdError.arithmeticError))); + DEPOSIT_YIELD_ERRORS.push(_encodeError("")); + + // WITHDRAW_YIELD_ERRORS + WITHDRAW_YIELD_ERRORS.push(SmartVaultV4.InvalidUser.selector); + WITHDRAW_YIELD_ERRORS.push(SmartVaultV4.InvalidToken.selector); + WITHDRAW_YIELD_ERRORS.push(SmartVaultV4.Undercollateralised.selector); + WITHDRAW_YIELD_ERRORS.push(_encodeError("SafeERC20: low-level call failed")); + WITHDRAW_YIELD_ERRORS.push(_encodeError("SafeERC20: ERC20 operation did not succeed")); + WITHDRAW_YIELD_ERRORS.push(_encodeError("SafeERC20: approve from non-zero to non-zero allowance")); + WITHDRAW_YIELD_ERRORS.push(SmartVaultYieldManager.IncompatibleHypervisor.selector); + WITHDRAW_YIELD_ERRORS.push(bytes4(keccak256(stdError.arithmeticError))); + WITHDRAW_YIELD_ERRORS.push(_encodeError("")); + } + + function _encodeError(string memory errorString) internal pure returns (bytes4) { + return bytes4(keccak256(abi.encodeWithSignature("Error(string)", errorString))); + } + + modifier checkExpectedErrors(bytes4[] storage errors) { + success = false; + returnData = bytes(""); + + _; + + if (!success) { + bool expected = false; + for (uint256 i = 0; i < errors.length; i++) { + if (_checkReturnData(errors[i], returnData)) { + expected = true; + break; + } + } + t(expected, DOS); + precondition(false); + } + } + + function _checkReturnData(bytes4 errorSelector, bytes memory returndata) internal view returns (bool reverted) { + // Check for Success case + if (returndata.length == 0) reverted = false; + + // Check for Custom Error case + if (errorSelector == bytes4(returnData)) reverted = true; + + // Combined Error(string) and Panic(uint256) handling + string memory errorString; + uint256 errorCode; + assembly { + // Get the length of the returndata + let returndata_size := mload(returndata) + + // The first 32 bytes contain the length of the returndata + let offset := add(returndata, 0x20) + + // The first 4 bytes of returndata after the length are the function selector + let selector := mload(offset) + + // Right shift the loaded value by 224 bits to keep only the first 4 bytes (function selector) + selector := shr(224, selector) + + switch selector + case 0x08c379a0 { + // Error(string) + // Read the offset to the string (should be 0x20) + let stringOffset := mload(add(offset, 0x04)) + + // Read the length of the string + let stringLength := mload(add(offset, add(0x04, stringOffset))) + + // Check if the string length is 0 (empty string case) + switch iszero(stringLength) + case 1 { + // If string is empty, set the memory for errorString to zero length + mstore(errorString, 0) + } + default { + // If string is not empty, copy string data to errorString memory + // Allocate memory for the string + errorString := mload(0x40) + mstore(0x40, add(errorString, add(stringLength, 0x20))) // Allocate memory + + // Set the length of the string + mstore(errorString, stringLength) + + // Copy the string data to allocated memory + let stringData := add(add(offset, 0x24), stringOffset) // Start of string data + let dest := add(errorString, 0x20) // point to where string data starts + + for { let i := 0 } lt(i, stringLength) { i := add(i, 0x20) } { + mstore(add(dest, i), mload(add(stringData, i))) + } + } + } + case 0x4e487b71 { + // Panic(uint256) + // Read the panic code + errorCode := mload(add(offset, 0x24)) + } + } + + // Check for Error(string) revert + if (errorSelector == bytes4(keccak256(abi.encodeWithSignature("Error(string)", errorString)))) { + reverted = true; + } + + // Check for Panic(uint256) revert + if (errorSelector == bytes4(keccak256(abi.encodeWithSignature("Panic(uint256)", errorCode)))) { + reverted = true; + } + } +} diff --git a/test/foundry/invariant/Helper.sol b/test/foundry/invariant/Helper.sol new file mode 100644 index 0000000..0336b2a --- /dev/null +++ b/test/foundry/invariant/Helper.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {Asserts} from "@chimera/Asserts.sol"; +import {Bounds} from "./Bounds.sol"; +import {Setup} from "./Setup.sol"; + +import {SmartVaultV4} from "src/SmartVaultV4.sol"; +import {ERC20Mock} from "src/test_utils/ERC20Mock.sol"; +import {ChainlinkMock} from "src/test_utils/ChainlinkMock.sol"; + +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +abstract contract Helper is Asserts, Bounds, Setup { + using EnumerableSet for EnumerableSet.AddressSet; + using EnumerableSet for EnumerableSet.Bytes32Set; + + address internal msgSender; + EnumerableSet.AddressSet internal hypervisors; + + // NOTE: not needed when pranking the correct access-controlled caller + modifier getMsgSender() virtual { + msgSender = msg.sender; + _; + } + + // NOTE: not needed when not considering multiple interacting users + // function _getRandomUser(address user) internal returns (address) { + // return users[between(uint256(uint160(user)), 0, users.length)]; + // } + + // NOTE: not needed when using a single SmartVault (we're doing this since borrowing is isolated to a single vault) + // function _getRandomSmartVault(uint256 tokenId) internal returns (SmartVaultV4, uint256) { + // return (SmartVaultV4(_tokenIdToSmartVault(tokenId)), tokenId = _getRandomTokenId(tokenId)); + // } + + // function _getRandomTokenId(uint256 tokenId) internal returns (uint256) { + // return between(tokenId, 0, smartVaultManager.totalSupply()); + // } + + // function _tokenIdToSmartVault(uint256 tokenId) internal returns (SmartVaultV4) { + // return SmartVaultV4(smartVaultIndex.getVaultAddress(tokenId)); + // } + + function _getRandomToken(uint256 index) internal returns (address) { + return allTokens.at(between(index, 0, allTokens.length())); + } + + function _getRandomCollateral(uint256 symbolIndex) internal returns (ERC20Mock, bytes32) { + bytes32 symbol = _getRandomSymbol(symbolIndex); + return (_symbolToToken(symbol), symbol); + } + + function _getRandomSymbol(uint256 symbolIndex) internal returns (bytes32) { + return collateralSymbols.at(between(symbolIndex, 0, collateralSymbols.length())); + } + + function _symbolToToken(bytes32 symbol) internal returns (ERC20Mock) { + return collateralData[symbol].token; + } + + function _getRandomPriceFeed(uint256 index) internal returns (ChainlinkMock) { + return collateralData[_getRandomSymbol(index)].clFeed; + } + + function _getRandomHypervisor(uint256 hypervisorIndex) internal returns (address) { + if (hypervisors.length() == 0) return address(0); + + return hypervisors.at(between(hypervisorIndex, 0, hypervisors.length())); + } + + function _addHypervisor(address hypervisor) internal { + hypervisors.add(hypervisor); + } + + function _removeHypervisor(address hypervisor) internal { + hypervisors.remove(hypervisor); + } +} diff --git a/test/foundry/invariant/Properties.sol b/test/foundry/invariant/Properties.sol new file mode 100644 index 0000000..2a59a66 --- /dev/null +++ b/test/foundry/invariant/Properties.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {BeforeAfter} from "./BeforeAfter.sol"; +import {PropertiesSpecifications} from "./PropertiesSpecifications.sol"; +import {ITargetFunctions} from "./interfaces/ITargetFunctions.sol"; + +// property tests get run after each call in a given sequence +abstract contract Properties is BeforeAfter, PropertiesSpecifications { + function invariant_UNDERCOLLATERALISED() public returns (bool) { + if (!_before.undercollateralised && _after.undercollateralised) { + t(false, UNDERCOLLATERALISED_01); + } + + return true; + } + + function invariant_FEES() public returns (bool) { + if ( + _before.sig == ITargetFunctions.smartVaultV4_mint.selector + || _before.sig == ITargetFunctions.smartVaultV4_burn.selector + || _before.sig == ITargetFunctions.smartVaultV4_withdrawYield.selector + ) { + // TODO: implement ghosts – usds/token balance of protocol after >= before + } + + return true; + } +} diff --git a/test/foundry/invariant/PropertiesSpecifications.sol b/test/foundry/invariant/PropertiesSpecifications.sol new file mode 100644 index 0000000..a8822cd --- /dev/null +++ b/test/foundry/invariant/PropertiesSpecifications.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +abstract contract PropertiesSpecifications { + string internal constant ADD_COLLATERAL_01 = "ADD_COLLATERAL_01: Deposits increase Smart Vault collateral value"; // TODO + + string internal constant REMOVE_COLLATERAL_NATIVE_01 = + "REMOVE_COLLATERAL_NATIVE_01: Native withdrawals decrease Smart Vault collateral value"; + string internal constant REMOVE_COLLATERAL_NATIVE_02 = + "REMOVE_COLLATERAL_NATIVE_02: Native withdrawals decrease the Smart Vault balance"; + string internal constant REMOVE_COLLATERAL_NATIVE_03 = + "REMOVE_COLLATERAL_NATIVE_03: Native withdrawals increase the recipient balance"; + + string internal constant REMOVE_COLLATERAL_01 = + "REMOVE_COLLATERAL_01: Collateral withdrawals decrease Smart Vault collateral value"; + string internal constant REMOVE_COLLATERAL_02 = + "REMOVE_COLLATERAL_02: Collateral withdrawals decrease the Smart Vault balance"; + string internal constant REMOVE_COLLATERAL_03 = + "REMOVE_COLLATERAL_03: Collateral withdrawals increase the recipient balance"; + + string internal constant REMOVE_ASSET_01 = + "REMOVE_ASSET_01: Collateral asset withdrawals decrease the Smart Vault collateral value"; + string internal constant REMOVE_ASSET_02 = + "REMOVE_ASSET_02: Collateral asset withdrawals decrease the Smart Vault balance"; + string internal constant REMOVE_ASSET_03 = + "REMOVE_ASSET_03: Collateral asset withdrawals increase the recipient balance"; + string internal constant REMOVE_ASSET_04 = + "REMOVE_ASSET_04: Collateral asset withdrawals only succeed if the Smart Vault remains overcollateralised"; + string internal constant REMOVE_ASSET_05 = + "REMOVE_ASSET_05: Removes non-collateral assets without affecting the Smart Vault collateral value"; + string internal constant REMOVE_ASSET_06 = + "REMOVE_ASSET_06: Non-collateral asset withdrawals decrease the Smart Vault balance"; + string internal constant REMOVE_ASSET_07 = + "REMOVE_ASSET_07: Non-collateral asset withdrawals increase the recipient balance"; + + string internal constant MINT_01 = "MINT_01: Minting increases recipient's USDs balance"; + string internal constant MINT_02 = "MINT_02: Minting increases the Smart Vault's minted USDs state"; + string internal constant MINT_03 = "MINT_03: Minted state cannot exceed max mintable"; + string internal constant MINT_04 = "MINT_04: Minting cannot immediately make the Smart Vault undercollateralised"; + + string internal constant BURN_01 = "BURN_01: Burn decreases the caller's USDs balance"; + string internal constant BURN_02 = "BURN_02: Burn decreases the minted state"; + + string internal constant SWAP_01 = "SWAP_01: Swaps cannot leave the Smart Vault undercollateralised"; + string internal constant SWAP_02 = "SWAP_02: Swaps cannot increase the Smart Vault's collateral value"; + string internal constant SWAP_03 = "SWAP_03: Swaps deacrease the Smart Vault's input token balance"; + string internal constant SWAP_04 = "SWAP_04: Swaps increase the Smart Vault's output token balance"; + + string internal constant LIQUIDATE_01 = + "LIQUIDATE_01: Liquidate only succeeds if the Smart Vault is undercollateralised"; + string internal constant LIQUIDATE_02 = "LIQUIDATE_02: Liquidate increases the protocol's collateral"; + string internal constant LIQUIDATE_03 = "LIQUIDATE_03: Liquidate clears the Smart Vault's minted USDs state"; + string internal constant LIQUIDATE_04 = "LIQUIDATE_04: Liquidate marks the Smart Vault as liquidated"; + string internal constant LIQUIDATE_05 = "LIQUIDATE_05: Liquidate decreases the Smart Vault's max mintable to zero"; + string internal constant LIQUIDATE_06 = + "LIQUIDATE_06: Liquidate decreases the Smart Vault's total collateral value to zero"; + + string internal constant DEPOSIT_YIELD_01 = + "DEPOSIT_YIELD_01: Deposits cannot leave the Smart Vault undercollateralised"; + + string internal constant WITHDRAW_YIELD_01 = + "WITHDRAW_YIELD_01: Withdrawals cannot leave the Smart Vault undercollateralised"; + + string internal constant UNDERCOLLATERALISED_01 = + "UNDERCOLLATERALISED_01: A Smart Vault cannot execute an operation that leaves it undercollateralised"; + string internal constant UNDERCOLLATERALISED_02 = + "UNDERCOLLATERALISED_02: Undercollateralised Smart Vaults cannot mint USDs"; // TODO + + string internal constant FEES_01 = "FEES_01: Fees are take on minting and burning USDs"; + string internal constant FEES_02 = "FEES_02: Fees are taken on yield withdrawals"; + + string internal constant DOS = "DOS: Denial of Service"; + + string internal constant REVERTS = "REVERTS: Actions behave as expected under dependency reverts"; // TODO +} diff --git a/test/foundry/invariant/README.md b/test/foundry/invariant/README.md new file mode 100644 index 0000000..12d6441 --- /dev/null +++ b/test/foundry/invariant/README.md @@ -0,0 +1,5 @@ +# Invariant test suite considerations + +1) Heavy mocking has made the test fixtures quite complicated by comparison to the fork fixture. Swap router rates could be replaced with properly mocked pools – currently we have mock pools deployed purely for the new `_swapToRatio()` implementation while all swaps still use the mock rates. Ideally, rewrite all unit tests as fork tests using a snapshot of real on-chain state. + +2) Invariant tests are very much a work in progress. DoS and other false positives may arise either due to mock setup (e.g. `ERC20: transfer amount exceeds balance in the mock swap router`) or missing expected errors, but validate they are actually false positives and not unexpected reverts (could also just remove the `checkExpectedErrors` modifier from specific target functions to silence DoS invariants if they aren't reliable). Coverage is good and state space should be relatively small by isolating a single smart vault and adding collateral once during setup. Again, ideally we use the fork fixture for invariant tests and add handlers for the Hypervisors, but this is quite a bit of extra work. Have been using `SizeCredit/size-solidity` repo as a loose reference. All todo items and notes like this can be easily searched using `TODO:` and `NOTE:`. At least one of the critical findings gets flagged by medusa with `REMOVE_ASSET_05` reverting. diff --git a/test/foundry/invariant/Setup.sol b/test/foundry/invariant/Setup.sol new file mode 100644 index 0000000..ddeeda1 --- /dev/null +++ b/test/foundry/invariant/Setup.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {BaseSetup} from "@chimera/BaseSetup.sol"; +import {PropertiesConstants} from "@crytic/util/PropertiesConstants.sol"; +import {vm} from "@chimera/Hevm.sol"; + +import {SmartVaultFixture, SmartVaultV4} from "../fixtures/SmartVaultFixture.sol"; + +abstract contract Setup is BaseSetup, PropertiesConstants, SmartVaultFixture { + // address[] internal users; + SmartVaultV4 internal smartVault; + + function setup() internal virtual override { + super.setUp(); + + // NOTE: this isn't necessary since we will always prank the correct address + // set up users that will be used to call target functions + // users.push(USER1); + // users.push(USER2); + // users.push(USER3); + // users.push(VAULT_OWNER); + // users.push(VAULT_MANAGER_OWNER); + // users.push(PROTOCOL); + // users.push(LIQUIDATOR); + + // create a SmartVaultV4 instance + smartVault = _createSmartVaultViaManager(VAULT_OWNER); + + vm.deal(address(smartVault), 25 ether); + weth.mint(address(smartVault), 25 * 10 ** weth.decimals()); + wbtc.mint(address(smartVault), 1 * 10 ** wbtc.decimals()); + link.mint(address(smartVault), 5_000 * 10 ** link.decimals()); + usdc.mint(address(smartVault), 62_500 * 10 ** usdc.decimals()); + } +} diff --git a/test/foundry/invariant/TargetFunctions.sol b/test/foundry/invariant/TargetFunctions.sol new file mode 100644 index 0000000..746208a --- /dev/null +++ b/test/foundry/invariant/TargetFunctions.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {ExpectedErrors} from "./ExpectedErrors.sol"; +import {Properties} from "./Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + +import {SmartVaultV4} from "src/SmartVaultV4.sol"; +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {ERC20Mock} from "src/test_utils/ERC20Mock.sol"; +import {ChainlinkMock} from "src/test_utils/ChainlinkMock.sol"; + +abstract contract TargetFunctions is ExpectedErrors { + using EnumerableSet for EnumerableSet.AddressSet; + + // NOTE: see smartVaultManagerV6_liquidateVault below but keep this here in case liquidation logic changes (spoiler: it does) + // function smartVaultV4_liquidate(uint256 tokenId) public checkExpectedErrors(LIQUIDATE_VAULT_ERRORS) {} + + // TODO: use fork fixture and implement hypervisor handlers + + function smartVaultV4_removeCollateralNative(uint256 amount, address payable to) + public + checkExpectedErrors(REMOVE_VAULT_TOKEN_ERRORS) + { + __before(smartVault); + + amount = between(amount, 0, address(smartVault).balance); + uint256 _toBalanceBefore = to.balance; + + vm.prank(VAULT_OWNER); + (success, returnData) = + address(smartVault).call(abi.encodeCall(smartVault.removeCollateralNative, (amount, to))); + + if (success) { + __after(smartVault); + + gte(_before.totalCollateralValue, _after.totalCollateralValue, REMOVE_COLLATERAL_NATIVE_01); + eq(_before.nativeBalance - amount, _after.nativeBalance, REMOVE_COLLATERAL_NATIVE_02); + eq(_toBalanceBefore + amount, to.balance, REMOVE_COLLATERAL_NATIVE_03); + } + } + + function smartVaultV4_removeCollateral(uint256 symbolIndex, uint256 amount, address to) + public + checkExpectedErrors(REMOVE_VAULT_TOKEN_ERRORS) + { + (ERC20Mock collateral, bytes32 symbol) = _getRandomCollateral(symbolIndex); + + bool isNative = symbol == NATIVE; + uint256 _toBalanceBefore; + + __before(smartVault); + + if (isNative) { + amount = between(amount, 0, address(smartVault).balance); + _toBalanceBefore = to.balance; + } else { + amount = between(amount, 0, collateral.balanceOf(address(smartVault))); + _toBalanceBefore = collateral.balanceOf(to); + } + + vm.prank(VAULT_OWNER); + (success, returnData) = + address(smartVault).call(abi.encodeCall(smartVault.removeCollateral, (symbol, amount, to))); + + if (success) { + __after(smartVault); + + gte(_before.totalCollateralValue, _after.totalCollateralValue, REMOVE_COLLATERAL_NATIVE_01); + // NOTE: these type of properties cannot be easily checked as the Asset[] array cannot be copied from memory to storage + // for (uint256 i = 0; i < _before.collateral.length; i++) { + // if (_before.collateral[i].token.symbol == symbol) { + // eq( + // _before.collateral[i].amount - amount, + // _after.collateral[i].amount, + // REMOVE_COLLATERAL_NATIVE_02 + // ); + // } + // } + if (isNative) { + eq(_toBalanceBefore + amount, to.balance, REMOVE_COLLATERAL_NATIVE_03); + } else { + eq(_toBalanceBefore + amount, collateral.balanceOf(to), REMOVE_COLLATERAL_NATIVE_03); + } + } + } + + function smartVaultV4_removeAsset(uint256 tokenIndex, uint256 amount, address to) + public + checkExpectedErrors(REMOVE_VAULT_TOKEN_ERRORS) + { + __before(smartVault); + + uint256 _vaultBalanceBefore; + uint256 _toBalanceBefore; + + ERC20 asset = ERC20(_getRandomToken(tokenIndex)); + bool isNative = address(asset) == address(0); + if (isNative) { + amount = between(amount, 0, address(smartVault).balance); + _vaultBalanceBefore = address(smartVault).balance; + _toBalanceBefore = to.balance; + } else { + amount = between(amount, 0, asset.balanceOf(address(smartVault))); + _vaultBalanceBefore = asset.balanceOf(address(smartVault)); + _toBalanceBefore = asset.balanceOf(to); + } + + vm.prank(VAULT_OWNER); + (success, returnData) = + address(smartVault).call(abi.encodeCall(smartVault.removeAsset, (address(asset), amount, to))); + + if (success) { + __after(smartVault); + + if (collateralTokens.contains(address(asset))) { + gte(_before.totalCollateralValue, _after.totalCollateralValue, REMOVE_ASSET_01); + // for (uint256 i = 0; i < _before.collateral.length; i++) { + // if (_before.collateral[i].token.symbol == symbol) { + // eq( + // _before.collateral[i].amount - amount, + // _after.collateral[i].amount, + // REMOVE_ASSET_02 + // ); + // } + // } + if (isNative) { + eq(_toBalanceBefore + amount, to.balance, REMOVE_ASSET_03); + } else { + eq(_toBalanceBefore + amount, asset.balanceOf(to), REMOVE_ASSET_03); + } + t(!_after.undercollateralised, REMOVE_ASSET_04); + } else { + eq(_before.totalCollateralValue, _after.totalCollateralValue, REMOVE_ASSET_05); + eq(_vaultBalanceBefore - amount, asset.balanceOf(address(smartVault)), REMOVE_ASSET_06); + eq(_toBalanceBefore + amount, asset.balanceOf(to), REMOVE_ASSET_07); + } + } + } + + function smartVaultV4_mint(address to, uint256 amount) public checkExpectedErrors(MINT_DEBT_ERRORS) { + amount = between(amount, 0, type(uint96).max); + + __before(smartVault); + + uint256 _toBalanceBefore = usds.balanceOf(to); + + vm.prank(VAULT_OWNER); + (success, returnData) = address(smartVault).call(abi.encodeCall(smartVault.mint, (to, amount))); + + if (success) { + __after(smartVault); + + eq(_toBalanceBefore + amount, usds.balanceOf(to), MINT_01); + gte(_after.minted, _before.minted + amount, MINT_02); // to account for fee + gte(_before.maxMintable, _after.minted, MINT_03); + t(!_after.undercollateralised, MINT_04); + } + } + + function smartVaultV4_burn(uint256 amount) public checkExpectedErrors(BURN_DEBT_ERRORS) { + amount = between(amount, 0, type(uint96).max); + + __before(smartVault); + + uint256 _msgSenderBalanceBefore = usds.balanceOf(msgSender); + + vm.prank(VAULT_OWNER); // NOTE: can be called by any address but prank owner for simplicity + (success, returnData) = address(smartVault).call(abi.encodeCall(smartVault.burn, amount)); + + if (success) { + __after(smartVault); + + gte(_msgSenderBalanceBefore - amount, usds.balanceOf(msgSender), BURN_01); // to account for fee + eq(_before.minted - amount, _after.minted, BURN_02); + } + } + + function smartVaultV4_swap(uint256 inTokenIndex, uint256 outTokenIndex, uint256 amount, uint256 requestedMinOut) + public + checkExpectedErrors(SWAP_COLLATERAL_ERRORS) + { + (ERC20Mock inToken, bytes32 inSymbol) = _getRandomCollateral(inTokenIndex); + (ERC20Mock outToken, bytes32 outSymbol) = _getRandomCollateral(outTokenIndex); + + uint256 maxIn = inToken.balanceOf(address(uniswapRouter)) > inToken.balanceOf(address(smartVault)) + ? inToken.balanceOf(address(smartVault)) + : inToken.balanceOf(address(uniswapRouter)); + amount = between(amount, 0, maxIn); + + requestedMinOut = between(requestedMinOut, 0, outToken.balanceOf(address(uniswapRouter))); + + __before(smartVault); + + vm.prank(VAULT_OWNER); + (success, returnData) = + address(smartVault).call(abi.encodeCall(smartVault.swap, (inSymbol, outSymbol, amount, requestedMinOut))); + + if (success) { + __after(smartVault); + + t(!_after.undercollateralised, SWAP_01); + gte(_before.totalCollateralValue, _after.totalCollateralValue, SWAP_02); + // for (uint256 i = 0; i < _before.collateral.length; i++) { + // if (_before.collateral[i].token.symbol == inToken) { + // eq( + // _before.collateral[i].amount - amount, + // _after.collateral[i].amount, + // SWAP_03 + // ); + // } + + // if (_before.collateral[i].token.symbol == outToken) { + // eq( + // _before.collateral[i].amount + requestedMinOut, + // _after.collateral[i].amount, + // SWAP_04 + // ); + // } + // } + } + } + + function smartVaultV4_depositYield(uint256 symbolIndex, uint256 stablePercentage) + public + checkExpectedErrors(DEPOSIT_YIELD_ERRORS) + { + (, bytes32 symbol) = _getRandomCollateral(symbolIndex); + stablePercentage = between(stablePercentage, MIN_STABLE_PERCENTAGE, MAX_STABLE_PERCENTAGE); + + __before(smartVault); + + vm.prank(VAULT_OWNER); + (success, returnData) = + address(smartVault).call(abi.encodeCall(smartVault.depositYield, (symbol, stablePercentage))); + + if (success) { + __after(smartVault); + + _addHypervisor(address(usdsHypervisor)); + if (stablePercentage < MAX_STABLE_PERCENTAGE) { + _addHypervisor(address(collateralData[symbol].hypervisor)); // TODO: for some reason, uniswap pool slot0 reverts within _swapToRatio + } + + t(!_after.undercollateralised, DEPOSIT_YIELD_01); + } + } + + function smartVaultV4_withdrawYield(uint256 hypervisorIndex, uint256 symbolIndex) + public + checkExpectedErrors(WITHDRAW_YIELD_ERRORS) + { + (, bytes32 symbol) = _getRandomCollateral(symbolIndex); + address hypervisor = _getRandomHypervisor(hypervisorIndex); + + if (hypervisor == address(0)) { + return; + } + + __before(smartVault); + + vm.prank(VAULT_OWNER); + (success, returnData) = address(smartVault).call(abi.encodeCall(smartVault.withdrawYield, (hypervisor, symbol))); + + if (success) { + __after(smartVault); + _removeHypervisor(hypervisor); + + t(!_after.undercollateralised, WITHDRAW_YIELD_01); + } + } + + // NOTE: SmartVaultV4 view functions not checked for unexpected reverts: status, undercollateralised, getToken, getTokenisedAddr, calculateMinimumAmountOut, yieldAssets + + // NOTE: these probably aren't needed as they essentially just call Hypervisor functions the long way round + // function smartVaultYieldManager_deposit(address token, uint256 usdPercentage) public checkExpectedErrors(DEPOSIT_YIELD_ERRORS) {} + // function smartVaultYieldManager_withdraw(address hypervisor, address token) public checkExpectedErrors(WITHDRAW_YIELD_ERRORS) {} + + function smartVaultManagerV6_liquidateVault() public checkExpectedErrors(LIQUIDATE_VAULT_ERRORS) { + // NOTE: this is a bit hacky – we should get/store the token id in the setup + uint256[] memory tokenIds = smartVaultIndex.getTokenIds(VAULT_OWNER); + + __before(smartVault); + + vm.prank(LIQUIDATOR); + (success, returnData) = + address(smartVaultManager).call(abi.encodeCall(smartVaultManager.liquidateVault, tokenIds[0])); + + if (success) { + __after(smartVault); + + t(_before.undercollateralised, LIQUIDATE_01); + // for (uint256 i = 0; i < _before.collateral.length; i++) { + // gte( + // _after.protocol.collateral[i].amount, + // _before.protocol.collateral[i].amount, + // LIQUIDATE_02 + // ); + // } + eq(_after.minted, 0, LIQUIDATE_03); + t(_after.liquidated, LIQUIDATE_04); + eq(_after.maxMintable, 0, LIQUIDATE_05); + eq(_after.totalCollateralValue, 0, LIQUIDATE_06); + } + } + + function helper_setPrice(int256 price, uint256 index) public clear { + ChainlinkMock priceFeed = _getRandomPriceFeed(index); + priceFeed.setPrice(between(price, DEFAULT_CL_MIN, DEFAULT_CL_MAX)); + } +} diff --git a/test/foundry/invariant/crytic/CryticTester.sol b/test/foundry/invariant/crytic/CryticTester.sol new file mode 100644 index 0000000..000064a --- /dev/null +++ b/test/foundry/invariant/crytic/CryticTester.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {TargetFunctions} from "../TargetFunctions.sol"; +import {CryticAsserts} from "@chimera/CryticAsserts.sol"; + +// echidna . --contract CryticTester --config echidna.yaml +// medusa fuzz +contract CryticTester is TargetFunctions, CryticAsserts { + constructor() payable { + setup(); + } +} diff --git a/test/foundry/invariant/foundry/CryticToFoundry.sol b/test/foundry/invariant/foundry/CryticToFoundry.sol new file mode 100644 index 0000000..572861b --- /dev/null +++ b/test/foundry/invariant/foundry/CryticToFoundry.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {Test} from "forge-std/Test.sol"; +import {TargetFunctions} from "../TargetFunctions.sol"; +import {FoundryAsserts} from "@chimera/FoundryAsserts.sol"; +import "forge-std/console2.sol"; + +contract CryticToFoundry is Test, TargetFunctions, FoundryAsserts { + function setUp() public override { + vm.deal(address(USER1), 100e18); + vm.deal(address(USER2), 100e18); + vm.deal(address(USER3), 100e18); + + // warp to initial Echidna timestamp and + // roll to the corresponding block number + vm.warp(1524785992); + vm.roll(4370000); + + setup(); + + msgSender = USER1; + + // targetContract(address(TODO)); + } + + function _setUp(address _user, uint256 _time, uint256 _block) internal { + msgSender = _user; + vm.warp(block.timestamp + _time); + vm.roll(block.number + _block); + } + + function test_CryticToFoundry_01() public { + // TODO: add failing property tests here for debugging + + _setUp(USER2, 314435 seconds, 29826); + } +} diff --git a/test/foundry/invariant/foundry/FoundryHandler.sol b/test/foundry/invariant/foundry/FoundryHandler.sol new file mode 100644 index 0000000..fc30812 --- /dev/null +++ b/test/foundry/invariant/foundry/FoundryHandler.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {TargetFunctions} from "../TargetFunctions.sol"; +import {FoundryAsserts} from "@chimera/FoundryAsserts.sol"; + +contract FoundryHandler is TargetFunctions, FoundryAsserts { + constructor() { + vm.deal(address(USER1), 100e18); + vm.deal(address(USER2), 100e18); + vm.deal(address(USER3), 100e18); + + setup(); + } + + modifier getMsgSender() override { + msgSender = uint160(msg.sender) % 3 == 0 + ? address(USER1) + : uint160(msg.sender) % 3 == 1 ? address(USER2) : address(USER3); + _; + } +} diff --git a/test/foundry/invariant/foundry/FoundryTester.sol b/test/foundry/invariant/foundry/FoundryTester.sol new file mode 100644 index 0000000..cb632e1 --- /dev/null +++ b/test/foundry/invariant/foundry/FoundryTester.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {FoundryHandler} from "./FoundryHandler.sol"; + +import {PropertiesSpecifications} from "../PropertiesSpecifications.sol"; +import {Test} from "forge-std/Test.sol"; + +contract FoundryTester is Test, PropertiesSpecifications { + FoundryHandler public handler; + + function setUp() public { + handler = new FoundryHandler(); + targetContract(address(handler)); + } + + function invariant() public { + // assertTrue(handler.invariant_true()); + } +} diff --git a/test/foundry/invariant/interfaces/ITargetFunctions.sol b/test/foundry/invariant/interfaces/ITargetFunctions.sol new file mode 100644 index 0000000..56ed060 --- /dev/null +++ b/test/foundry/invariant/interfaces/ITargetFunctions.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +interface ITargetFunctions { + function helper_addSmartVaultCollateral(uint256 symbolIndex) external; + function smartVaultManagerV6_liquidateVault(uint256 tokenId) external; + function smartVaultV4_burn(uint256 amount) external; + function smartVaultV4_depositYield(uint256 symbolIndex, uint256 stablePercentage) external; + function smartVaultV4_mint(address to, uint256 amount) external; + function smartVaultV4_removeAsset(bool removeCollateral, uint256 symbolIndex, uint256 amount, address to) + external; + function smartVaultV4_removeCollateral(uint256 symbolIndex, uint256 amount, address to) external; + function smartVaultV4_removeCollateralNative(uint256 amount, address payable to) external; + function smartVaultV4_swap(uint256 inTokenIndex, uint256 outTokenIndex, uint256 amount, uint256 requestedMinOut) + external; + function smartVaultV4_withdrawYield(uint256 hypervisorIndex, uint256 symbolIndex) external; +} diff --git a/yarn.lock b/yarn.lock index a237c7e..aed9408 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,42 +2,9 @@ # yarn lockfile v1 -"@aws-crypto/sha256-js@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz#02acd1a1fda92896fc5a28ec7c6e164644ea32fc" - integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== - dependencies: - "@aws-crypto/util" "^1.2.2" - "@aws-sdk/types" "^3.1.0" - tslib "^1.11.1" - -"@aws-crypto/util@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-1.2.2.tgz#b28f7897730eb6538b21c18bd4de22d0ea09003c" - integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== - dependencies: - "@aws-sdk/types" "^3.1.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" - -"@aws-sdk/types@^3.1.0": - version "3.598.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.598.0.tgz#b840d2446dee19a2a4731e6166f2327915d846db" - integrity sha512-742uRl6z7u0LFmZwDrFP6r1wlZcgVPw+/TilluDJmCAR8BgRw3IR+743kUXKBGd8QZDRW2n6v/PYsi/AWCDDMQ== - dependencies: - "@smithy/types" "^3.1.0" - tslib "^2.6.2" - -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== - dependencies: - tslib "^2.3.1" - "@chainlink/contracts@^0.6.1": version "0.6.1" - resolved "https://registry.yarnpkg.com/@chainlink/contracts/-/contracts-0.6.1.tgz#8842b57e755793cbdbcbc45277fb5d179c993e19" + resolved "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.6.1.tgz" integrity sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ== dependencies: "@eth-optimism/contracts" "^0.5.21" @@ -47,19 +14,19 @@ "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@eth-optimism/contracts@^0.5.21": version "0.5.40" - resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.40.tgz#d13a04a15ea947a69055e6fc74d87e215d4c936a" + resolved "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.5.40.tgz" integrity sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== dependencies: "@eth-optimism/core-utils" "0.12.0" @@ -68,7 +35,7 @@ "@eth-optimism/core-utils@0.12.0": version "0.12.0" - resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz#6337e4599a34de23f8eceb20378de2a2de82b0ea" + resolved "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz" integrity sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== dependencies: "@ethersproject/abi" "^5.7.0" @@ -88,23 +55,9 @@ bufio "^1.0.7" chai "^4.3.4" -"@ethereumjs/rlp@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" - integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== - -"@ethereumjs/util@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" - integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== - dependencies: - "@ethereumjs/rlp" "^4.0.1" - ethereum-cryptography "^2.0.0" - micro-ftch "^0.3.1" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.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.4.7", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" @@ -117,9 +70,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@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.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -130,9 +83,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@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.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -141,9 +94,9 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -152,47 +105,47 @@ "@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.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + 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.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@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.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + 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.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + 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.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== dependencies: "@ethersproject/abi" "^5.7.0" @@ -206,9 +159,9 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@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.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -221,9 +174,9 @@ "@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.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -239,9 +192,9 @@ "@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.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" @@ -258,44 +211,44 @@ 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.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@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.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + 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.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@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.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + 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.7.2", "@ethersproject/providers@^5.7.0": +"@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.4.7", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@5.7.2": version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -319,34 +272,34 @@ 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.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@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.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@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.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" "@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.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -358,7 +311,7 @@ "@ethersproject/solidity@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -368,18 +321,18 @@ "@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.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@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.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" @@ -394,7 +347,7 @@ "@ethersproject/units@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" @@ -403,7 +356,7 @@ "@ethersproject/wallet@5.7.0": version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" @@ -422,9 +375,9 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" @@ -433,9 +386,9 @@ "@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.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" @@ -444,24 +397,19 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@fastify/busboy@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" - integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== - "@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -469,7 +417,7 @@ "@metamask/eth-sig-util@^4.0.0": version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + resolved "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== dependencies: ethereumjs-abi "^0.6.8" @@ -478,207 +426,223 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/curves@1.4.0", "@noble/curves@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - -"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== +"@noble/hashes@~1.1.1", "@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== -"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== +"@noble/secp256k1@~1.6.0", "@noble/secp256k1@1.6.3": + version "1.6.3" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/edr-darwin-arm64@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.0.tgz#bbb43f0e01f40839b0bd38c2c443cb6910ae955f" - integrity sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg== +"@nomicfoundation/ethereumjs-block@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz" + integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" -"@nomicfoundation/edr-darwin-x64@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.0.tgz#b1ffcd9142418fd8498de34a7336b3f977907c86" - integrity sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg== +"@nomicfoundation/ethereumjs-blockchain@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz" + integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-ethash" "^2.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" -"@nomicfoundation/edr-linux-arm64-gnu@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.0.tgz#8173d16d4f6f2b3e82ba7096d2a1ea3619d8bfa7" - integrity sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ== +"@nomicfoundation/ethereumjs-common@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz" + integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== + dependencies: + "@nomicfoundation/ethereumjs-util" "^8.0.0" + crc-32 "^1.2.0" -"@nomicfoundation/edr-linux-arm64-musl@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.0.tgz#b1ce293a7c3e0d9f70391e1aef1a82b83b997567" - integrity sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg== +"@nomicfoundation/ethereumjs-ethash@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz" + integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" -"@nomicfoundation/edr-linux-x64-gnu@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.0.tgz#4c12c4e4bfd3d837f5663ad7cbf7cb6d5634ef83" - integrity sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA== +"@nomicfoundation/ethereumjs-evm@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz" + integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" -"@nomicfoundation/edr-linux-x64-musl@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.0.tgz#8842004aa1a47c504f10863687da28b65dca7baa" - integrity sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw== +"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": + version "4.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz" + integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== -"@nomicfoundation/edr-win32-x64-msvc@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.0.tgz#29d8bbb2edf9912a95f5453855cf17cdcb269957" - integrity sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A== +"@nomicfoundation/ethereumjs-statemanager@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz" + integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" -"@nomicfoundation/edr@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.4.0.tgz#4895ecb6ef321136db837458949c37cce4a29459" - integrity sha512-T96DMSogO8TCdbKKctvxfsDljbhFOUKWc9fHJhSeUh71EEho2qR4951LKQF7t7UWEzguVYh/idQr5L/E3QeaMw== - dependencies: - "@nomicfoundation/edr-darwin-arm64" "0.4.0" - "@nomicfoundation/edr-darwin-x64" "0.4.0" - "@nomicfoundation/edr-linux-arm64-gnu" "0.4.0" - "@nomicfoundation/edr-linux-arm64-musl" "0.4.0" - "@nomicfoundation/edr-linux-x64-gnu" "0.4.0" - "@nomicfoundation/edr-linux-x64-musl" "0.4.0" - "@nomicfoundation/edr-win32-x64-msvc" "0.4.0" - -"@nomicfoundation/ethereumjs-common@4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" - integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== - dependencies: - "@nomicfoundation/ethereumjs-util" "9.0.4" - -"@nomicfoundation/ethereumjs-rlp@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" - integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== - -"@nomicfoundation/ethereumjs-tx@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" - integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== - dependencies: - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-rlp" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" +"@nomicfoundation/ethereumjs-trie@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz" + integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz" + integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-util@9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" - integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== +"@nomicfoundation/ethereumjs-util@^8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz" + integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== dependencies: - "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@^6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz" + integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" "@nomicfoundation/hardhat-chai-matchers@^1.0.0": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" - integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== + version "1.0.5" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.5.tgz" + integrity sha512-+W5C/+5FHI2xBajUN9THSNc1UP6FUsA7LeLmfnaC9VMi/50/DEjjxd8OmizEXgV1Bjck7my4NVQLL1Ti39FkpA== dependencies: "@ethersproject/abi" "^5.1.2" "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" + chalk "^2.4.2" deep-eql "^4.0.1" ordinal "^1.0.3" "@nomicfoundation/hardhat-network-helpers@^1.0.0": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.11.tgz#64096829661b960b88679bd5c4fbcb50654672d1" - integrity sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA== + version "1.0.7" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.7.tgz" + integrity sha512-X+3mNvn8B7BY5hpIaLO+TrfzWq12bpux+ajGGdmdcfC78NXmYmOZkAtiz1QZx1YIZGMS1LaXzPXyBExxKFpCaw== dependencies: ethereumjs-util "^7.1.4" "@nomicfoundation/hardhat-toolbox@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz#ec95f23b53cb4e71a1a7091380fa223aad18f156" - integrity sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg== - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" - integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" - integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" - integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" - integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" - integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" - integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + version "2.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz" + integrity sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ== -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" - integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz" + integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== "@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" - integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + version "0.1.0" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz" + integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" "@nomiclabs/hardhat-ethers@^2.0.0": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" - integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + version "2.2.1" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz" + integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== -"@nomiclabs/hardhat-etherscan@^3.1.7": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.8.tgz#3c12ee90b3733e0775e05111146ef9418d4f5a38" - integrity sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ== +"@nomiclabs/hardhat-etherscan@^3.0.0", "@nomiclabs/hardhat-etherscan@^3.1.0", "@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== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" @@ -692,120 +656,78 @@ undici "^5.14.0" "@openzeppelin/contracts-upgradeable@^4.7.3", "@openzeppelin/contracts-upgradeable@^4.8.2": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz#38b21708a719da647de4bb0e4802ee235a0d24df" - integrity sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA== + version "4.8.2" + resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz" + integrity sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag== "@openzeppelin/contracts-v0.7@npm:@openzeppelin/contracts@v3.4.2": version "3.4.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2.tgz#d81f786fda2871d1eb8a8c5a73e455753ba53527" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz" integrity sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== -"@openzeppelin/contracts@3.4.2-solc-0.7": - version "3.4.2-solc-0.7" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" - integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== - "@openzeppelin/contracts@^4.8.0": - version "4.9.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.6.tgz#2a880a24eb19b4f8b25adc2a5095f2aa27f39677" - integrity sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA== + version "4.8.0" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.0.tgz" + integrity sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw== "@openzeppelin/contracts@~4.3.3": version "4.3.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.3.tgz#ff6ee919fc2a1abaf72b22814bfb72ed129ec137" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz" integrity sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== -"@openzeppelin/defender-base-client@^1.46.0": - version "1.54.6" - resolved "https://registry.yarnpkg.com/@openzeppelin/defender-base-client/-/defender-base-client-1.54.6.tgz#b65a90dba49375ac1439d638832382344067a0b9" - integrity sha512-PTef+rMxkM5VQ7sLwLKSjp2DBakYQd661ZJiSRywx+q/nIpm3B/HYGcz5wPZCA5O/QcEP6TatXXDoeMwimbcnw== - dependencies: - amazon-cognito-identity-js "^6.0.1" - async-retry "^1.3.3" - axios "^1.4.0" - lodash "^4.17.19" - node-fetch "^2.6.0" +"@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" + integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== "@openzeppelin/hardhat-upgrades@^1.22.1": - version "1.28.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.28.0.tgz#6361f313a8a879d8a08a5e395acf0933bc190950" - integrity sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ== + version "1.22.1" + resolved "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz" + integrity sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ== dependencies: - "@openzeppelin/defender-base-client" "^1.46.0" - "@openzeppelin/platform-deploy-client" "^0.8.0" - "@openzeppelin/upgrades-core" "^1.27.0" + "@openzeppelin/upgrades-core" "^1.20.0" chalk "^4.1.0" debug "^4.1.1" proper-lockfile "^4.1.1" -"@openzeppelin/platform-deploy-client@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.8.0.tgz#af6596275a19c283d6145f0128cc1247d18223c1" - integrity sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA== - dependencies: - "@ethersproject/abi" "^5.6.3" - "@openzeppelin/defender-base-client" "^1.46.0" - axios "^0.21.2" - lodash "^4.17.19" - node-fetch "^2.6.0" - -"@openzeppelin/upgrades-core@^1.27.0": - version "1.34.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.34.1.tgz#660301692e706c7e701395467267128cc43c1de9" - integrity sha512-LV3hHm60htmP3HJjn2VoGqXNPn1RLFSSInRyXNbm15Z2oWKGxOfAWSC4+okRckum0yVB5g3k4/SEyqjsJRB07A== +"@openzeppelin/upgrades-core@^1.20.0": + version "1.24.1" + resolved "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.24.1.tgz" + integrity sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A== dependencies: - cbor "^9.0.0" + cbor "^8.0.0" chalk "^4.1.0" - compare-versions "^6.0.0" + compare-versions "^5.0.0" debug "^4.1.1" ethereumjs-util "^7.0.3" - minimist "^1.2.7" proper-lockfile "^4.1.1" - solidity-ast "^0.4.51" + solidity-ast "^0.4.15" -"@scure/base@~1.1.0", "@scure/base@~1.1.6": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.7.tgz#fe973311a5c6267846aa131bc72e96c5d40d2b30" - integrity sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== -"@scure/bip32@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" "@scure/base" "~1.1.0" -"@scure/bip32@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== - dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - -"@scure/bip39@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== +"@scure/bip39@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== dependencies: - "@noble/hashes" "~1.2.0" + "@noble/hashes" "~1.1.1" "@scure/base" "~1.1.0" -"@scure/bip39@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== - dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -816,7 +738,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -825,7 +747,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -834,7 +756,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -849,7 +771,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -860,114 +782,107 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" tslib "^1.9.3" -"@smithy/types@^3.1.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.2.0.tgz#1350fe8a50d5e35e12ffb34be46d946860b2b5ab" - integrity sha512-cKyeKAPazZRVqm7QPvcPD2jEIt2wqDPAL1KJKb0f/5I7uhollvsWZuZKLclmyP6a+Jwmr3OV3t+X0pZUUHS9BA== - dependencies: - tslib "^2.6.2" - -"@solidity-parser/parser@^0.14.0": +"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" - integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== - "@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@typechain/ethers-v5@^10.1.0": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" - integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== +"@typechain/ethers-v5@^10.1.0", "@typechain/ethers-v5@^10.2.0": + version "10.2.0" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz" + integrity sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" "@typechain/hardhat@^6.1.2": - version "6.1.6" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" - integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== + version "6.1.5" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz" + integrity sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q== dependencies: fs-extra "^9.1.0" +"@types/async-eventemitter@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz" + integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== + "@types/bn.js@^4.11.3": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" - integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + 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/chai-as-promised@^7.1.3": - version "7.1.8" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" - integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + version "7.1.5" + resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz" + integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.0": - version "4.3.16" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" - integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== + version "4.3.4" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/concat-stream@^1.6.0": version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== dependencies: "@types/node" "*" "@types/form-data@0.0.33": version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" "@types/glob@^7.1.1": version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" @@ -975,78 +890,76 @@ "@types/lru-cache@^5.1.0": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== -"@types/mocha@>=9.1.0": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.7.tgz#4c620090f28ca7f905a94b706f74dc5b57b44f2f" - integrity sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw== +"@types/mocha@^9.1.0": + version "9.1.1" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== -"@types/node@*": - version "20.14.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" - integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== - dependencies: - undici-types "~5.26.4" +"@types/node@*", "@types/node@>=12.0.0": + version "18.11.17" + resolved "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz" + integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== "@types/node@^10.0.3": version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^8.0.0": version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/pbkdf2@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" - integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + version "3.1.0" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + version "2.7.1" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== "@types/qs@^6.2.31": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/secp256k1@^4.0.1": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" - integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + version "4.0.3" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" "@uniswap/lib@^4.0.1-alpha": version "4.0.1-alpha" - resolved "https://registry.yarnpkg.com/@uniswap/lib/-/lib-4.0.1-alpha.tgz#2881008e55f075344675b3bca93f020b028fbd02" + resolved "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz" integrity sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA== "@uniswap/v2-core@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" + 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.yarnpkg.com/@uniswap/v3-core/-/v3-core-1.0.1.tgz#b6d2bdc6ba3c3fbd610bdc502395d86cd35264a0" + resolved "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz" integrity sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ== "@uniswap/v3-periphery@^1.4.4": version "1.4.4" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz#d2756c23b69718173c5874f37fd4ad57d2f021b7" + resolved "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz" integrity sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw== dependencies: "@openzeppelin/contracts" "3.4.2-solc-0.7" @@ -1055,135 +968,162 @@ "@uniswap/v3-core" "^1.0.0" base64-sol "1.0.1" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: +abbrev@1, abbrev@1.0.x: version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== -acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +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" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - acorn "^8.11.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.11.0, acorn@^8.4.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== +acorn@^8.4.1: + version "8.8.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + +address@^1.0.1: + version "1.2.2" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^8.0.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + version "8.11.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: - fast-deep-equal "^3.1.3" + fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.4.1" - -amazon-cognito-identity-js@^6.0.1: - version "6.3.12" - resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz#af73df033094ad4c679c19cf6122b90058021619" - integrity sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg== - dependencies: - "@aws-crypto/sha256-js" "1.2.2" - buffer "4.9.2" - fast-base64-decode "^1.0.0" - isomorphic-unfetch "^3.0.0" - js-cookie "^2.2.1" + uri-js "^4.2.2" amdefine@>=0.0.4: version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" +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" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + 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.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== -anymatch@~3.1.2: +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1191,204 +1131,207 @@ anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== -array-back@^4.0.1, array-back@^4.0.2: +array-back@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" +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== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array-uniq@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array.prototype.findlast@^1.2.2: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" asap@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.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== + assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-retry@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== +async-eventemitter@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async@^2.4.0: + version "2.6.4" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: - retry "0.13.1" + lodash "^4.17.14" async@1.x: version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + 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.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^0.21.2: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== -axios@^1.4.0, axios@^1.5.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2: +base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base64-sol@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/base64-sol/-/base64-sol-1.0.1.tgz#91317aa341f0bc763811783c5729f1c2574600f6" + resolved "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz" integrity sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bigint-crypto-utils@^3.0.23: + version "3.1.7" + resolved "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz" + integrity sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA== + dependencies: + bigint-mod-arith "^3.1.0" + +bigint-mod-arith@^3.1.0: + version "3.1.2" + resolved "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz" + integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== + binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== +bn.js@^4.11.0: + 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@^4.11.8: + 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@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.11.9: version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -boxen@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" +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== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1396,31 +1339,41 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - fill-range "^7.1.1" + fill-range "^7.0.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -1432,14 +1385,14 @@ browserify-aes@^1.2.0: bs58@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -1448,100 +1401,114 @@ bs58check@^2.1.2: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + base64-js "^1.3.1" + ieee754 "^1.2.1" bufio@^1.0.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.2.1.tgz#8d4ab3ddfcd5faa90f996f922f9397d41cbaf2de" - integrity sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== + version "1.2.0" + resolved "https://registry.npmjs.org/bufio/-/bufio-1.2.0.tgz" + integrity sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA== + +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +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" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" -camelcase@^6.0.0, camelcase@^6.2.0: +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -cbor@^8.1.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== + +cbor@^8.0.0, cbor@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" -cbor@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.2.tgz#536b4f2d544411e70ec2b19a2453f10f83cd9fdb" - integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== - dependencies: - nofilter "^3.1.0" - chai-as-promised@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" - integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== + version "7.1.1" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== dependencies: check-error "^1.0.2" -chai@^4.3.4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== +chai@^4.2.0, chai@^4.3.4, "chai@>= 2.1.2 < 5": + version "4.3.7" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" pathval "^1.1.1" - type-detect "^4.0.8" + type-detect "^4.0.5" chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.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.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1549,19 +1516,17 @@ chalk@^4.0.0, chalk@^4.1.0: "charenc@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -check-error@^1.0.2, check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@3.5.3: +chokidar@^3.4.0, chokidar@3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -1574,47 +1539,53 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chokidar@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: - anymatch "~3.1.2" + anymatch "~3.1.1" braces "~3.0.2" - glob-parent "~5.1.2" + glob-parent "~5.1.0" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + readdirp "~3.2.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.1.1" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" +classic-level@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz" + integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-table3@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: object-assign "^4.1.0" @@ -1623,17 +1594,26 @@ cli-table3@^0.5.0: colors "^1.1.2" cli-table3@^0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + version "0.6.3" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" optionalDependencies: "@colors/colors" "1.5.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1642,48 +1622,48 @@ cliui@^7.0.2: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + 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: +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: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -1693,7 +1673,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -1703,22 +1683,22 @@ command-line-usage@^6.1.0: commander@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -compare-versions@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" - integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== +compare-versions@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz" + integrity sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^1.6.0, concat-stream@^1.6.2: version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" @@ -1728,17 +1708,22 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +core-util-is@~1.0.0, 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== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -1749,7 +1734,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -1761,142 +1746,138 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== "crypt@>= 0.0.1": version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" + assert-plus "^1.0.0" death@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@4, debug@^4.1.1, debug@^4.3.1: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -debug@4.3.4: +debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@4, debug@4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +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" + +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== + decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -deep-eql@^4.0.1, deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== +deep-eql@^4.0.1, deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-data-property@^1.0.1, define-data-property@^1.1.4: +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + difflib@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== dependencies: heap ">= 0.2.0" dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dotenv@^16.0.3: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.0.3" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" -elliptic@6.5.4: +elliptic@^6.5.2, elliptic@^6.5.4, elliptic@6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -1907,127 +1888,67 @@ elliptic@6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -elliptic@^6.5.2, elliptic@^6.5.4: - version "6.5.5" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enquirer@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + version "2.3.6" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" - strip-ansi "^6.0.1" env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.20.5" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz" + integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== + dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" + has "^1.0.3" + has-property-descriptors "^1.0.0" has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" + internal-slot "^1.0.3" is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" + is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.13.1" + object-inspect "^1.12.2" object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" -es-define-property@^1.0.0: +es-array-method-boxes-properly@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -2035,23 +1956,23 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +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.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escodegen@1.8.x: version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" @@ -2061,55 +1982,57 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -esprima@2.7.x, esprima@^2.7.1: +esprima@^2.7.1, esprima@2.7.x: version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^1.9.1: version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eth-gas-reporter@^0.2.25: - version "0.2.27" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" - integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== + version "0.2.25" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" + integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== dependencies: + "@ethersproject/abi" "^5.0.0-beta.146" "@solidity-parser/parser" "^0.14.0" - axios "^1.5.1" cli-table3 "^0.5.0" colors "1.4.0" ethereum-cryptography "^1.0.3" - ethers "^5.7.2" + ethers "^4.0.40" fs-readdir-recursive "^1.1.0" lodash "^4.17.14" markdown-table "^1.1.3" - mocha "^10.2.0" + mocha "^7.1.1" req-cwd "^2.0.0" + request "^2.88.0" + request-promise-native "^1.0.5" sha1 "^1.1.1" sync-request "^6.0.0" ethereum-bloom-filters@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.1.0.tgz#b3fc1eb789509ee30db0bf99a2988ccacb8d0397" - integrity sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw== + version "1.0.10" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== dependencies: - "@noble/hashes" "^1.4.0" + js-sha3 "^0.8.0" -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -2129,28 +2052,39 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + version "1.1.2" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz" + integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" -ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.0.tgz#06e2d9c0d89f98ffc6a83818f55bf85afecd50dc" - integrity sha512-hsm9JhfytIf8QME/3B7j4bc8V+VdTU+Vas1aJlvIS96ffoNAosudXvGoEvWmc7QZYdkC8mrMJz9r0fcbw7GyCA== +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== dependencies: - "@noble/curves" "1.4.0" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" ethereumjs-abi@^0.6.8: version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" @@ -2158,7 +2092,7 @@ ethereumjs-abi@^0.6.8: ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -2169,9 +2103,20 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4: +ethereumjs-util@^7.0.3: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + 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" + +ethereumjs-util@^7.1.0: version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" @@ -2180,9 +2125,35 @@ ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.4: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.4.7, ethers@^5.7.2: +ethereumjs-util@^7.1.4: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + 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" + +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" + +ethers@^5, ethers@^5.0.0, ethers@^5.0.5, ethers@^5.1.3, ethers@^5.4.7: version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" @@ -2218,42 +2189,52 @@ ethers@^5.4.7, ethers@^5.7.2: ethjs-unit@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== dependencies: 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.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +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== + evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" -fast-base64-decode@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" - integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@^1.2.0, 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-deep-equal@^3.1.3: +fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.0.3: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2261,95 +2242,98 @@ fast-glob@^3.0.3: merge2 "^1.3.0" micromatch "^4.0.4" +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.14.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" +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: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: - locate-path "^2.0.0" + is-buffer "~2.0.3" flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +follow-redirects@^1.12.1: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== +form-data@^2.2.0, form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" mime-types "^2.1.12" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fp-ts@1.19.3: +fp-ts@^1.0.0, fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - fs-extra@^0.30.0: version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" @@ -2360,7 +2344,7 @@ fs-extra@^0.30.0: fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -2369,7 +2353,7 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -2378,7 +2362,7 @@ fs-extra@^8.1.0: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -2388,104 +2372,117 @@ fs-extra@^9.1.0: fs-readdir-recursive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" -functions-have-names@^1.2.3: +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" + function-bind "^1.1.1" + has "^1.0.3" has-symbols "^1.0.3" - hasown "^2.0.0" get-port@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== +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" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" + assert-plus "^1.0.0" ghost-testrpc@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== dependencies: chalk "^2.4.2" node-emoji "^1.10.0" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +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.2.0: +glob@^7.0.0, glob@^7.1.3, glob@7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -2495,67 +2492,49 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +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 "^5.0.1" - once "^1.3.0" - -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== - dependencies: - 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.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - 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" global-modules@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" global-prefix@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" kind-of "^6.0.2" which "^1.3.1" -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - globby@^10.0.1: version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== dependencies: "@types/glob" "^7.1.1" @@ -2569,65 +2548,88 @@ globby@^10.0.1: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" 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.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + version "4.7.7" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" - neo-async "^2.6.2" + neo-async "^2.6.0" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + hardhat-contract-sizer@^2.6.1: - version "2.10.0" - resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz#72646f43bfe50e9a5702c9720c9bc3e77d93a2c9" - integrity sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA== + version "2.6.1" + resolved "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.6.1.tgz" + integrity sha512-b8wS7DBvyo22kmVwpzstAQTdDCThpl/ySBqZh5ga9Yxjf61/uTL12TEg5nl7lDeWy73ntEUzxMwY6XxbQEc2wA== dependencies: chalk "^4.0.0" cli-table3 "^0.6.0" - strip-ansi "^6.0.0" hardhat-gas-reporter@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz#ebe5bda5334b5def312747580cd923c2b09aef1b" - integrity sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA== + version "1.0.9" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.12.4: - version "2.22.5" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.5.tgz#7e1a4311fa9e34a1cfe337784eae06706f6469a5" - integrity sha512-9Zq+HonbXCSy6/a13GY1cgHglQRfh4qkzmj1tpPlhxJDwNVnhxlReV6K7hCWFKlOrV13EQwsdcD0rjcaQKWRZw== +hardhat@^2.0.0, hardhat@^2.0.2, hardhat@^2.0.4, hardhat@^2.11.0, hardhat@^2.12.4, hardhat@^2.9.4, hardhat@^2.9.5, hardhat@^2.9.9: + version "2.12.4" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.12.4.tgz" + integrity sha512-rc9S2U/4M+77LxW1Kg7oqMMmjl81tzn5rNFARhbXKUA1am/nhfMJEujOjuKvt+ZGMiZ11PYSe8gyIpB/aRNDgw== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/edr" "^0.4.0" - "@nomicfoundation/ethereumjs-common" "4.0.4" - "@nomicfoundation/ethereumjs-tx" "5.0.4" - "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@nomicfoundation/ethereumjs-vm" "^6.0.0" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" + abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" - boxen "^5.1.2" chalk "^2.4.2" chokidar "^3.4.0" ci-info "^2.0.0" @@ -2647,6 +2649,7 @@ hardhat@^2.12.4: mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" + qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" @@ -2654,91 +2657,94 @@ hardhat@^2.12.4: source-map-support "^0.5.13" stacktrace-parser "^0.1.10" tsort "0.0.1" - undici "^5.14.0" + undici "^5.4.0" uuid "^8.3.2" ws "^7.4.6" has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - es-define-property "^1.0.0" + get-intrinsic "^1.1.1" -has-proto@^1.0.1, has-proto@^1.0.3: +has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - has-symbols "^1.0.3" + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +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.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + 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" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== +hash.js@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: - function-bind "^1.1.2" + inherits "^2.0.3" + minimalistic-assert "^1.0.0" he@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== "heap@>= 0.2.0": version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" @@ -2747,7 +2753,7 @@ hmac-drbg@^1.0.1: http-basic@^8.1.1: version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== dependencies: caseless "^0.12.0" @@ -2757,7 +2763,7 @@ http-basic@^8.1.1: http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -2768,14 +2774,23 @@ http-errors@2.0.0: http-response-object@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== dependencies: "@types/node" "^10.0.3" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -2783,259 +2798,240 @@ https-proxy-agent@^5.0.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.4: +ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.2.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.2.tgz" + integrity sha512-m1MJSy4Z2NAcyhoYpxQeBsc1ZdNQwYjN0wGbLBlnVArdJ90Gtr8IhNSfZZcCoR0fM/0E0BJ0mf1KnLNDOCJP4w== immutable@^4.0.0-rc.12: - version "4.3.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" - integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + version "4.1.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.5: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== +internal-slot@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" + get-intrinsic "^1.1.3" + has "^1.0.3" side-channel "^1.0.4" interpret@^1.0.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== io-ts@1.10.4: version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-buffer@^2.0.5, is-buffer@~2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.2" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" +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== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" -isarray@^1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isomorphic-unfetch@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -js-cookie@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/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.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + 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-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@3.x: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3043,33 +3039,53 @@ js-yaml@3.x: js-yaml@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -3078,13 +3094,23 @@ jsonfile@^6.0.1: jsonschema@^1.2.4: version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + keccak@^3.0.0, keccak@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" - integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + version "3.0.2" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -3092,19 +3118,40 @@ keccak@^3.0.0, keccak@^3.0.2: kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klaw@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/level/-/level-8.0.0.tgz" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== + dependencies: + browser-level "^1.0.1" + classic-level "^1.2.0" + levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -3112,167 +3159,212 @@ levn@~0.3.0: locate-path@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + log-symbols@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: - get-func-name "^2.0.1" + get-func-name "^2.0.0" lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + 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" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== markdown-table@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" safe-buffer "^5.1.2" +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micro-ftch@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" - integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== - micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.3" + braces "^3.0.2" picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + 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.12, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + 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" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + 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.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, "minimatch@2 || 3": version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimatch@5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: brace-expansion "^2.0.1" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +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" mkdirp@0.5.x: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" -mocha@^10.0.0, mocha@^10.2.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" - integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== +mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: ansi-colors "4.1.1" browser-stdout "1.3.1" @@ -3281,12 +3373,13 @@ mocha@^10.0.0, mocha@^10.2.0: diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "8.1.0" + glob "7.2.0" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" minimatch "5.0.1" ms "2.1.3" + nanoid "3.3.3" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" @@ -3295,110 +3388,216 @@ mocha@^10.0.0, mocha@^10.2.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" +mocha@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + 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@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" + +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.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -neo-async@^2.6.2: +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + +neo-async@^2.6.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-emoji@^1.10.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: lodash "^4.17.21" -node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: - whatwg-url "^5.0.0" + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" -node-gyp-build@^4.2.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.5.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@3.x: version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== number-to-bn@1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: bn.js "4.11.6" strip-hex-prefix "1.0.0" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== +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.5" - define-properties "^1.2.1" + 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" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.5" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + obliterator@^2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@1.x, once@^1.3.0: +once@^1.3.0, once@1.x: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -3410,92 +3609,111 @@ optionator@^0.8.1: ordinal@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + resolved "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@^1.1.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + parse-cache-control@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== path-exists@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17: version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" @@ -3504,85 +3722,90 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier@^2.3.1: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + version "2.8.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== promise@^8.0.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" proper-lockfile@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== dependencies: graceful-fs "^4.2.4" retry "^0.12.0" signal-exit "^3.0.2" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@^6.4.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== +qs@^6.4.0, qs@^6.7.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.6" + side-channel "^1.0.4" -queue-microtask@^1.2.2: +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" raw-body@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -3590,9 +3813,9 @@ raw-body@^2.4.1: unpipe "1.0.0" readable-stream@^2.2.2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -3603,125 +3826,164 @@ readable-stream@^2.2.2: util-deprecate "~1.0.1" readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.6.2: version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" recursive-readdir@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== dependencies: minimatch "^3.0.5" reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" req-cwd@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== dependencies: req-from "^2.0.0" req-from@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== dependencies: resolve-from "^3.0.0" +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.34, request@^2.88.0: + version "2.88.2" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + 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@^2.0.0, require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + 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@^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-from@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: +resolve@^1.1.6, resolve@1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + 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.6: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== +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== retry@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + 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.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.2.8: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -3729,55 +3991,57 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + 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-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== 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.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" + call-bind "^1.0.2" + get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3": +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sc-istanbul@^0.4.5: version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + resolved "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== dependencies: abbrev "1.0.x" @@ -3795,14 +4059,19 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@^3.0.0, scrypt-js@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + 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.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -3810,62 +4079,57 @@ secp256k1@^4.0.1: node-gyp-build "^4.2.0" semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.7.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.4: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" serialize-javascript@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" +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.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + 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== + setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -3873,7 +4137,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha1@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== dependencies: charenc ">= 0.0.1" @@ -3881,36 +4145,35 @@ sha1@^1.1.1: shelljs@^0.8.3: version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" interpret "^1.0.0" rechoir "^0.6.2" -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" @@ -3919,7 +4182,7 @@ slice-ansi@^4.0.0: solc@0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== dependencies: command-exists "^1.2.8" @@ -3932,30 +4195,29 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solidity-ast@^0.4.51: - version "0.4.56" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.56.tgz#94fe296f12e8de1a3bed319bc06db8d05a113d7a" - integrity sha512-HgmsA/Gfklm/M8GFbCX/J1qkVH0spXHgALCNZ8fA8x5X+MFdn/8CP2gr5OVyXjXw6RZTPC/Sxl2RUDQOXyNMeA== - dependencies: - array.prototype.findlast "^1.2.2" +solidity-ast@^0.4.15: + version "0.4.46" + resolved "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.46.tgz" + integrity sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA== -solidity-coverage@^0.8.2: - version "0.8.12" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.12.tgz#c4fa2f64eff8ada7a1387b235d6b5b0e6c6985ed" - integrity sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw== +solidity-coverage@^0.8.1, solidity-coverage@^0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz" + integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== dependencies: "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.18.0" + "@solidity-parser/parser" "^0.14.1" chalk "^2.4.2" death "^1.1.0" + detect-port "^1.3.0" difflib "^0.2.4" fs-extra "^8.1.0" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" - lodash "^4.17.21" - mocha "^10.2.0" + lodash "^4.17.15" + mocha "7.1.2" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" @@ -3966,7 +4228,7 @@ solidity-coverage@^0.8.2: source-map-support@^0.5.13: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -3974,159 +4236,205 @@ source-map-support@^0.5.13: source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stacktrace-parser@^0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== dependencies: type-fest "^0.7.1" statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +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.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== +"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.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + 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@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +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== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: - safe-buffer "~5.2.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: - safe-buffer "~5.1.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" +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.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + 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.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^3.1.0: version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +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" sync-request@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== dependencies: http-response-object "^3.0.1" @@ -4135,14 +4443,14 @@ sync-request@^6.0.0: sync-rpc@^1.2.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== dependencies: get-port "^3.1.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -4151,9 +4459,9 @@ table-layout@^1.0.2: wordwrapjs "^4.0.0" table@^6.8.0: - version "6.8.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" - integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + version "6.8.1" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -4163,7 +4471,7 @@ table@^6.8.0: then-request@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== dependencies: "@types/concat-stream" "^1.6.0" @@ -4180,32 +4488,35 @@ then-request@^6.0.0: tmp@0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" ts-command-line-args@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" - integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + version "2.3.1" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz" + integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== dependencies: chalk "^4.1.0" command-line-args "^5.1.1" @@ -4214,13 +4525,13 @@ ts-command-line-args@^2.2.0: ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -ts-node@>=8.0.0: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== +ts-node@*, ts-node@>=8.0.0: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -4236,62 +4547,69 @@ ts-node@>=8.0.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^1.11.1, tslib@^1.9.3: +tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.3.1, tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + tweetnacl-util@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== +tweetnacl@^0.14.3: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typechain@^8.1.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" - integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== +typechain@^8.1.0, typechain@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz" + integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== dependencies: "@types/prettier" "^2.1.1" debug "^4.3.1" @@ -4304,78 +4622,34 @@ typechain@^8.1.0: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - typedarray@^0.0.6: version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@>=4.5.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" - integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== +typescript@*, typescript@>=2.7, typescript@>=3.7.0, typescript@>=4.3.0, typescript@>=4.5.0: + version "4.9.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.18.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.18.0.tgz#73b576a7e8fda63d2831e293aeead73e0a270deb" - integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== + version "3.17.4" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -4383,95 +4657,90 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici@^5.14.0: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== +undici@^5.14.0, undici@^5.4.0: + version "5.14.0" + resolved "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz" + integrity sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ== dependencies: - "@fastify/busboy" "^2.0.0" - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -uri-js@^4.4.1: +uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" utf8@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +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-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + web3-utils@^1.3.6: - version "1.10.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" - integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + version "1.8.1" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.1.tgz" + integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== dependencies: - "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereum-cryptography "^2.1.2" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -4480,44 +4749,38 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== -which@^1.1.1, which@^1.3.1: +which@^1.1.1, which@^1.3.1, which@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^4.0.0" + string-width "^1.0.2 || 2" word-wrap@~1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -4525,12 +4788,21 @@ wordwrapjs@^4.0.0: workerpool@6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4539,37 +4811,69 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +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.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.4.6: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== +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== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@20.2.4: +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "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: + version "13.1.2" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2, yargs-parser@20.2.4: version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + 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.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" yargs-unparser@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -4577,9 +4881,25 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" +yargs@^13.3.0, yargs@13.3.2: + version "13.3.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -4592,10 +4912,10 @@ yargs@16.2.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==