diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 6c3f2336f..feb5ca1e7 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -49,7 +49,7 @@ jobs: ${{ runner.os }}- - name: Installing Packages - run: npm ci + run: npm ci --parallel=1 - name: Checking Formatting run: npm run lint && npm run prettier && npm run prettier-check - name: Running Test diff --git a/.gitignore b/.gitignore index 43cb3b351..abef556e9 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,10 @@ typechain/ !.github/ */deployments/localhost */deployments/*forked* +!*/deployments/ethBobTenderyForkedMainnet +!*/deployments/tenderlyForkedEthMainnet venv/ !/external/artifacts/ cache_hardhat/ -foundry/ \ No newline at end of file +foundry/ +!remappings.txt \ No newline at end of file diff --git a/brownie-config.yaml b/brownie-config.yaml index 746bb543c..1c8804328 100644 --- a/brownie-config.yaml +++ b/brownie-config.yaml @@ -40,7 +40,8 @@ compiler: optimizer: enabled: true runs: 200 - remappings: null + remappings: + - "@openzeppelin=OpenZeppelin/openzeppelin-contracts@4.9.5" console: show_colors: true diff --git a/contracts/integrations/bob/SafeDepositsSender.sol b/contracts/integrations/bob/SafeDepositsSender.sol new file mode 100644 index 000000000..ccaba3984 --- /dev/null +++ b/contracts/integrations/bob/SafeDepositsSender.sol @@ -0,0 +1,441 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +import { ISafeDepositsSender } from "./interfaces/ISafeDepositsSender.sol"; +import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +interface GnosisSafe { + enum Operation { + Call, + DelegateCall + } + + /// @dev Allows a Module to execute a Safe transaction without any further confirmations. + /// @param to Destination address of module transaction. + /// @param value Ether value of module transaction. + /// @param data Data payload of module transaction. + /// @param operation Operation type of module transaction. + function execTransactionFromModule( + address to, + uint256 value, + bytes calldata data, + Operation operation + ) external returns (bool success); +} + +/** + * @title SafeDepositsSender + * @notice This contract is a gateway for depositing funds into the Bob locker contracts + */ +contract SafeDepositsSender is ISafeDepositsSender { + using SafeERC20 for IERC20; + address public constant ETH_TOKEN_ADDRESS = address(0x01); + GnosisSafe private immutable SAFE; + address private immutable SOV_TOKEN_ADDRESS; + address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract + address private lockDropAddress; + uint256 private stopBlock; // if set the contract is stopped forever - irreversible + bool private paused; + + /** + * @param _safeAddress Address of the Gnosis Safe + * @param _lockDrop Address of the BOB FusionLock contract + * @param _sovToken Address of the SOV token contract + * @param _depositor Address of the depositor account + */ + constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) { + require(_safeAddress != address(0), "SafeDepositsSender: Invalid safe address"); + require(_lockDrop != address(0), "SafeDepositsSender: Invalid lockdrop address"); + require(_sovToken != address(0), "SafeDepositsSender: Invalid sov token address"); + require(_depositor != address(0), "SafeDepositsSender: Invalid depositor token address"); + SAFE = GnosisSafe(_safeAddress); + SOV_TOKEN_ADDRESS = _sovToken; + lockdropDepositorAddress = _depositor; + lockDropAddress = _lockDrop; + } + + receive() external payable {} + + // MODIFIERS // + + modifier onlySafe() { + require(msg.sender == address(SAFE), "SafeDepositsSender: Only Safe"); + _; + } + + modifier onlyDepositor() { + require(msg.sender == lockdropDepositorAddress, "SafeDepositsSender: Only Depositor"); + _; + } + + modifier onlyDepositorOrSafe() { + require( + msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE), + "SafeDepositsSender: Only Depositor or Safe" + ); + _; + } + + modifier whenNotPaused() { + require(!paused, "SafeDepositsSender: Paused"); + _; + } + + modifier whenPaused() { + require(paused, "SafeDepositsSender: Not paused"); + _; + } + + modifier whenUnstopped() { + require(stopBlock == 0, "SafeDepositsSender: Stopped"); + _; + } + + modifier notZeroAddress(address _address) { + require(_address != address(0), "SafeDepositsSender: Invalid address"); + _; + } + + // CORE FUNCTIONS + + /** + * @notice Sends tokens to the LockDrop contract + * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX + * @dev The function is allowed to be called only by the lockdropDepositorAddress + * @dev Token amounts and SOV amount to send are calculated offchain + * @param tokens List of tokens to send + * @param amounts List of amounts of tokens to send + * @param sovAmount Amount of SOV tokens to send + */ + function sendToLockDropContract( + address[] calldata tokens, + uint256[] calldata amounts, + uint256 sovAmount + ) external onlyDepositorOrSafe whenNotPaused whenUnstopped { + require( + tokens.length == amounts.length, + "SafeDepositsSender: Tokens and amounts length mismatch" + ); + require(sovAmount > 0, "SafeDepositsSender: Invalid SOV amount"); + + bytes memory data; + + for (uint256 i = 0; i < tokens.length; i++) { + require( + tokens[i] != SOV_TOKEN_ADDRESS, + "SafeDepositsSender: SOV token is transferred separately" + ); + + // transfer native token + uint256 balance; + uint256 transferAmount; + if (tokens[i] == ETH_TOKEN_ADDRESS) { + require( + address(SAFE).balance >= amounts[i], + "SafeDepositsSender: Not enough eth balance to deposit" + ); + data = abi.encodeWithSignature("depositEth()"); + require( + SAFE.execTransactionFromModule( + lockDropAddress, + amounts[i], + data, + GnosisSafe.Operation.Call + ), + "SafeDepositsSender: Could not deposit ether" + ); + + // withdraw balance to this contract left after deposit to the LockDrop + balance = address(SAFE).balance; + transferAmount = balance < amounts[i] ? balance : amounts[i]; + if (transferAmount > 0) { + require( + SAFE.execTransactionFromModule( + address(this), + transferAmount, + "", + GnosisSafe.Operation.Call + ), + "SafeDepositsSender: Could not withdraw ether after deposit" + ); + emit WithdrawBalanceFromSafe(tokens[i], transferAmount); + } + } else { + // transfer ERC20 tokens + IERC20 token = IERC20(tokens[i]); + balance = token.balanceOf(address(SAFE)); + require(balance >= amounts[i], "SafeDepositsSender: Not enough tokens to deposit"); + + data = abi.encodeWithSignature( + "approve(address,uint256)", + lockDropAddress, + amounts[i] + ); + require( + SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call), + "SafeDepositsSender: Could not approve token transfer" + ); + + data = abi.encodeWithSignature( + "depositERC20(address,uint256)", + tokens[i], + amounts[i] + ); + require( + SAFE.execTransactionFromModule( + lockDropAddress, + 0, + data, + GnosisSafe.Operation.Call + ), + "SafeDepositsSender: Could not deposit token" + ); + + // withdraw balance to this contract left after deposit to the LockDrop + balance = token.balanceOf(address(SAFE)); + transferAmount = balance < amounts[i] ? balance : amounts[i]; + if (transferAmount > 0) { + data = abi.encodeWithSignature( + "transfer(address,uint256)", + address(this), + transferAmount + ); + require( + SAFE.execTransactionFromModule( + tokens[i], + 0, + data, + GnosisSafe.Operation.Call + ), + "SafeDepositsSender: Could not withdraw token after deposit" + ); + emit WithdrawBalanceFromSafe(tokens[i], transferAmount); + } + } + emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]); + } + + // transfer SOV + data = abi.encodeWithSignature("approve(address,uint256)", lockDropAddress, sovAmount); + require( + SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call), + "SafeDepositsSender: Could not execute SOV transfer" + ); + data = abi.encodeWithSignature( + "depositERC20(address,uint256)", + SOV_TOKEN_ADDRESS, + sovAmount + ); + require( + SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call), + "SafeDepositsSender: Could not execute SOV transfer" + ); + + emit DepositSOVToLockdrop(lockDropAddress, sovAmount); + } + + /// @notice Maps depositor on ethereum to receiver on BOB + /// @notice Receiver from the last emitted event called by msg.sender will be used + /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB + function mapDepositorToReceiver(address receiver) external { + emit MapDepositorToReceiver(msg.sender, receiver); + } + + // ADMINISTRATIVE FUNCTIONS // + + /** + * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe + * @param to Destination address of module transaction. + * @param value Ether value of module transaction. + * @param data Data payload of module transaction. + * @param operation Operation type of module transaction. + * @return success Boolean flag indicating if the call succeeded. + */ + function execTransactionFromSafe( + address to, + uint256 value, + bytes memory data, + GnosisSafe.Operation operation + ) external onlySafe returns (bool success) { + success = execute(to, value, data, operation, type(uint256).max); + } + + /** + * @notice Executes either a delegatecall or a call with provided parameters. + * @dev This method doesn't perform any sanity check of the transaction, such as: + * - if the contract at `to` address has code or not + * It is the responsibility of the caller to perform such checks. + * @param to Destination address. + * @param value Ether value. + * @param data Data payload. + * @param operation Operation type. + * @return success boolean flag indicating if the call succeeded. + */ + function execute( + address to, + uint256 value, + bytes memory data, + GnosisSafe.Operation operation, + uint256 txGas + ) internal returns (bool success) { + if (operation == GnosisSafe.Operation.DelegateCall) { + /* solhint-disable no-inline-assembly */ + /// @solidity memory-safe-assembly + assembly { + success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0) + } + /* solhint-enable no-inline-assembly */ + } else { + /* solhint-disable no-inline-assembly */ + /// @solidity memory-safe-assembly + assembly { + success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0) + } + /* solhint-enable no-inline-assembly */ + } + } + + /// @notice There is no check if _newDepositor is not zero on purpose - that could be required + + /** + * @notice Sets new depositor address + * @dev Only Safe can call this function + * @dev New depositor can be zero address + * @param _newDepositor New depositor address + */ + function setDepositorAddress(address _newDepositor) external onlySafe { + emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor); + lockdropDepositorAddress = _newDepositor; + } + + /** + * @notice Sets new LockDrop address + * @dev Only Safe can call this function + * @dev New LockDrop can't be zero address + * @param _newLockdrop New depositor address + */ + function setLockDropAddress(address _newLockdrop) external onlySafe { + require(_newLockdrop != address(0), "SafeDepositsSender: Zero address not allowed"); + emit SetLockDropAddress(lockDropAddress, _newLockdrop); + lockDropAddress = _newLockdrop; + } + + /** + * @notice Withdraws tokens from this contract to a recipient address + * @notice Withdrawal to the Safe address will affect balances and rewards + * @notice Amount > 0 should be checked by the caller before calling this function + * @dev Only Safe can call this function + * @dev Recipient should not be a zero address + * @param tokens List of token addresses to withdraw + * @param amounts List of token amounts to withdraw + * @param recipient Recipient address + */ + function withdraw( + address[] calldata tokens, + uint256[] calldata amounts, + address recipient + ) external onlySafe notZeroAddress(recipient) { + require( + tokens.length == amounts.length, + "SafeDepositsSender: Tokens and amounts length mismatch" + ); + + for (uint256 i = 0; i < tokens.length; i++) { + require(tokens[i] != address(0x00), "SafeDepositsSender: Zero address not allowed"); + require(amounts[i] != 0, "SafeDepositsSender: Zero amount not allowed"); + if (tokens[i] == ETH_TOKEN_ADDRESS) { + require( + address(this).balance >= amounts[i], + "SafeDepositsSender: Not enough funds" + ); + (bool success, ) = payable(recipient).call{ value: amounts[i] }(""); + require(success, "Could not withdraw ether"); + continue; + } + + IERC20 token = IERC20(tokens[i]); + uint256 balance = token.balanceOf(address(this)); + require(balance >= amounts[i], "SafeDepositsSender: Not enough funds"); + + token.safeTransfer(recipient, amounts[i]); + + emit Withdraw(recipient, tokens[i], amounts[i]); + } + } + + /** + * @notice Withdraws all tokens from this contract to a recipient + * @notice Amount > 0 should be checked by the caller before calling this function + * @dev Only Safe can call this function + * @dev Recipient should not be a zero address + * @notice Withdrawal to the Safe address will affect balances and rewards + * @param tokens List of token addresses to withdraw + * @param recipient Recipient address + */ + function withdrawAll( + address[] calldata tokens, + address recipient + ) external onlySafe notZeroAddress(recipient) { + for (uint256 i = 0; i < tokens.length; i++) { + if (tokens[i] == ETH_TOKEN_ADDRESS) { + (bool success, ) = payable(recipient).call{ value: address(this).balance }(""); + require(success, "SafeDepositsSender: Could not withdraw ether"); + continue; + } + IERC20 token = IERC20(tokens[i]); + uint256 balance = token.balanceOf(address(this)); + if (balance > 0) { + token.safeTransfer(recipient, balance); + } + + emit Withdraw(recipient, tokens[i], balance); + } + } + + /// @notice pause the contract - no funds can be sent to the LockDrop contract + function pause() external onlySafe whenNotPaused { + paused = true; + emit Pause(); + } + + /// @notice unpause the contract + function unpause() external onlySafe whenPaused { + paused = false; + emit Unpause(); + } + + /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible + function stop() external onlySafe { + stopBlock = block.number; + emit Stop(); + } + + // GETTERS // + function getSafeAddress() external view returns (address) { + return address(SAFE); + } + + function getLockDropAddress() external view returns (address) { + return lockDropAddress; + } + + function getSovTokenAddress() external view returns (address) { + return SOV_TOKEN_ADDRESS; + } + + function getDepositorAddress() external view returns (address) { + return lockdropDepositorAddress; + } + + function isStopped() external view returns (bool) { + return stopBlock != 0; + } + + function getStopBlock() external view returns (uint256) { + return stopBlock; + } + + function isPaused() external view returns (bool) { + return paused; + } +} diff --git a/contracts/integrations/bob/interfaces/ILockDrop.sol b/contracts/integrations/bob/interfaces/ILockDrop.sol new file mode 100644 index 000000000..2df195ede --- /dev/null +++ b/contracts/integrations/bob/interfaces/ILockDrop.sol @@ -0,0 +1,140 @@ +pragma solidity 0.8.17; + +/** + * @dev Interface for BOB (Build on Bitcoin) LockDrop contract + * The contract is used for deposits and BOB reward points allocation + */ +interface ILockDrop { + // Events + event TokenAllowed(address token, TokenInfo info); + event TokenL2DepositAddressChange(address l1Token, address l2Token); + event BridgeAddress(address bridgeAddress); + event WithdrawalTimeUpdated(uint256 endTime); + event Deposit( + address indexed depositOwner, + address indexed token, + uint256 amount, + uint256 depositTime + ); + event WithdrawToL1(address indexed owner, address indexed token, uint256 amount); + event WithdrawToL2( + address indexed owner, + address indexed receiver, + address indexed l1Token, + address l2Token, + uint256 amount + ); + + // Struct to hold token information. + struct TokenInfo { + bool isAllowed; // Flag indicating whether the token is allowed for deposit. + address l2TokenAddress; // Address of the corresponding token on Layer 2. + } + + // Struct to hold L1 and L2 token addresses. + struct TokenAddressPair { + address l1TokenAddress; + address l2TokenAddress; + } + + /** getter */ + function allowedTokens(address) external view returns (TokenInfo memory); + function deposits(address, address) external view returns (uint256); + function withdrawalStartTime() external view returns (uint256); + function bridgeProxyAddress() external view returns (address); + + /** + * @dev Deposit ERC20 tokens. + * @param token Address of the ERC20 token. + * @param amount Amount of tokens to deposit. + */ + function depositERC20(address token, uint256 amount) external; + + /** + * @dev Deposit Ether + * Allows users to deposit Ether into the contract. + */ + function depositEth() external payable; + + /** + * @dev Function to withdraw all deposits to Layer 2 for multiple tokens. + * @param tokens Array of token addresses to withdraw. + * @param minGasLimit Minimum gas limit for the withdrawal transactions. + */ + function withdrawDepositsToL2( + address[] memory tokens, + uint32 minGasLimit, + address receiver + ) external; + + /** + * @dev Function to withdraw all deposits to Layer 1 for multiple tokens. + * @param tokens Array of token addresses to withdraw. + */ + function withdrawDepositsToL1(address[] calldata tokens) external; + + /** + * @dev Function to allow ERC20 tokens for deposit. + * This function allows the contract owner to allow specific ERC20 tokens for deposit. + * @param l1TokenAddress Address of the ERC20 token to allow on Layer 1. + * @param l2TokenAddress Address of the corresponding token on Layer 2. + */ + function allow(address l1TokenAddress, address l2TokenAddress) external; + + /** + * @dev Function to change the Layer 2 (L2) address of tokens that were allowed for deposit. + * This function allows the contract owner to change the L2 address of tokens that were previously allowed for deposit. + * @param tokenPairs An array of structs, each containing a pair of addresses representing the Layer 1 (L1) token address + * and its corresponding Layer 2 (L2) token address. + */ + function changeMultipleL2TokenAddresses(TokenAddressPair[] calldata tokenPairs) external; + + /** + * @dev Function to change the withdrawal time. + * This function allows the contract owner to change the withdrawal time. + * @param newWithdrawalStartTime New withdrawal start time. + */ + function changeWithdrawalTime(uint256 newWithdrawalStartTime) external; + + /** + * @dev Function to set the address of the bridge proxy. + * This function allows the contract owner to set the address of the bridge proxy for token transfers between Layer 1 and Layer 2. + * @param l2BridgeProxyAddress Address of the bridge proxy contract. + */ + function setBridgeProxyAddress(address l2BridgeProxyAddress) external; + /** + * @dev Function to pause contract, Overridden functions from Pausable contract + */ + function pause() external; + + /** + * @dev Function to unpause contract, Overridden functions from Pausable contract + */ + function unpause() external; + + /** + * @dev Function to check if the withdrawal time has started. + * @return bool true if the withdrawal time has started, false otherwise. + */ + function isWithdrawalTimeStarted() external view returns (bool); + + /** + * @dev Get the Ether balance of the contract + * @return uint256 Ether balance of the contract + */ + function getEthBalance() external view returns (uint256); + + /** + * @dev Function to retrieve information about a token's allowance for deposit. + * @param token Address of the token to retrieve information for. + */ + function getTokenInfo(address token) external view returns (TokenInfo memory); + + /** + * @dev Get the deposited amount of a token for a given user + * @param depositOwner Address of the user + * @param token Address of the token + * @return uint256 Amount of tokens deposited + */ + function getDepositAmount(address depositOwner, address token) external view returns (uint256); +} diff --git a/contracts/integrations/bob/interfaces/ISafeDepositsSender.sol b/contracts/integrations/bob/interfaces/ISafeDepositsSender.sol new file mode 100644 index 000000000..c3f33ef92 --- /dev/null +++ b/contracts/integrations/bob/interfaces/ISafeDepositsSender.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.17; + +interface ISafeDepositsSender { + event Withdraw(address indexed from, address indexed token, uint256 amount); + event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount); + event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount); + event WithdrawBalanceFromSafe(address indexed token, uint256 balance); + event Pause(); + event Unpause(); + event Stop(); + event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor); + event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop); + event MapDepositorToReceiver(address indexed depositor, address indexed receiver); + + function getSafeAddress() external view returns (address); + function getLockDropAddress() external view returns (address); + function getSovTokenAddress() external view returns (address); + function getDepositorAddress() external view returns (address); + function isStopped() external view returns (bool); + function isPaused() external view returns (bool); + + // @note amount > 0 should be checked by the caller + function withdraw( + address[] calldata tokens, + uint256[] calldata amounts, + address recipient + ) external; + + function withdrawAll(address[] calldata tokens, address recipient) external; + + function pause() external; + + function unpause() external; + + function stop() external; + + function setDepositorAddress(address _newDepositor) external; + + function sendToLockDropContract( + address[] calldata tokens, + uint256[] calldata amounts, + uint256 sovAmount + ) external; +} diff --git a/deployment/deploy/9000-deploy-SafeDepositsSender.js b/deployment/deploy/9000-deploy-SafeDepositsSender.js new file mode 100644 index 000000000..1d8c26e02 --- /dev/null +++ b/deployment/deploy/9000-deploy-SafeDepositsSender.js @@ -0,0 +1,38 @@ +const path = require("path"); +const { getContractNameFromScriptFileName } = require("../helpers/utils"); +const col = require("cli-color"); +const func = async function (hre) { + const { + deployments: { deploy, get, log }, + getNamedAccounts, + ethers, + } = hre; + const { signer2: deployer } = await getNamedAccounts(); //await ethers.getSigners(); // + let totalGas = ethers.BigNumber.from(0); + + const args = [ + (await get("SafeBobDeposits")).address, + (await get("BobLockDrop")).address, + (await get("SOV")).address, + "0x86De732721FfFCdf163629C64e3925B5BF7F371A".toLowerCase(), + ]; + // Deploy loan token logic beacon LM // + log(col.bgYellow("Deploying SafeDepositsSender...")); + const tx = await deploy("SafeDepositsSender", { + from: deployer, + args: args, + log: true, + }); + if (tx.newlyDeployed) { + totalGas = totalGas.add(tx.receipt.cumulativeGasUsed); + log("cumulative gas:", tx.receipt.cumulativeGasUsed.toString()); + log( + col.bgYellow( + "Create Safe transaction to register SafeDepositsSender module", + tx.address + ) + ); + } +}; +func.tags = ["SafeDepositsSender"]; +module.exports = func; diff --git a/deployment/deployments/ethMainnet/SafeDepositsSender.json b/deployment/deployments/ethMainnet/SafeDepositsSender.json new file mode 100644 index 000000000..dc0ecf041 --- /dev/null +++ b/deployment/deployments/ethMainnet/SafeDepositsSender.json @@ -0,0 +1,643 @@ +{ + "address": "0x5ddC7eB2958C07c1F02f0A834FbA8982487d1940", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_safeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockDrop", + "type": "address" + }, + { + "internalType": "address", + "name": "_sovToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_depositor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lockDrop", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositSOVToLockdrop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lockDrop", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositToLockdrop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "MapDepositorToReceiver", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldDepositor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newDepositor", + "type": "address" + } + ], + "name": "SetDepositorAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldLockDrop", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newLockDrop", + "type": "address" + } + ], + "name": "SetLockDropAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Stop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "name": "WithdrawBalanceFromSafe", + "type": "event" + }, + { + "inputs": [], + "name": "ETH_TOKEN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum GnosisSafe.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromSafe", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDepositorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLockDropAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSafeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSovTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStopBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isStopped", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "mapDepositorToReceiver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "sovAmount", + "type": "uint256" + } + ], + "name": "sendToLockDropContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newDepositor", + "type": "address" + } + ], + "name": "setDepositorAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newLockdrop", + "type": "address" + } + ], + "name": "setLockDropAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stop", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdrawAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x0d409672a487131a3dc1c9ccf09910c5efc6a14143c5ac6d0002fd9e44cb798e", + "receipt": { + "to": null, + "from": "0x8C9143221F2b72Fcef391893c3a02Cf0fE84f50b", + "contractAddress": "0x5ddC7eB2958C07c1F02f0A834FbA8982487d1940", + "transactionIndex": 6, + "gasUsed": "2352662", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x48217594d0baaeb2efb4fb50a23215b5ee065a845f0ebae5d36048463e13c0cb", + "transactionHash": "0x0d409672a487131a3dc1c9ccf09910c5efc6a14143c5ac6d0002fd9e44cb798e", + "logs": [], + "blockNumber": 19533106, + "cumulativeGasUsed": "3388160", + "status": 1, + "byzantium": true + }, + "args": [ + "0x949cf9295d2950b6bd9b7334846101e9ae44bbb0", + "0x61dc14b28d4dbcd6cf887e9b72018b9da1ce6ff7", + "0xbdab72602e9ad40fc6a6852caf43258113b8f7a5", + "0x86de732721fffcdf163629c64e3925b5bf7f371a" + ], + "numDeployments": 1, + "solcInputHash": "b6ccc7dc4fb34511b9d8d031557b3d58", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_safeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lockDrop\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sovToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositor\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockDrop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositSOVToLockdrop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockDrop\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositToLockdrop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"MapDepositorToReceiver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldDepositor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newDepositor\",\"type\":\"address\"}],\"name\":\"SetDepositorAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldLockDrop\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newLockDrop\",\"type\":\"address\"}],\"name\":\"SetLockDropAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Stop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"WithdrawBalanceFromSafe\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ETH_TOKEN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum GnosisSafe.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockDropAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSafeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSovTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStopBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isStopped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"mapDepositorToReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sovAmount\",\"type\":\"uint256\"}],\"name\":\"sendToLockDropContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newDepositor\",\"type\":\"address\"}],\"name\":\"setDepositorAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newLockdrop\",\"type\":\"address\"}],\"name\":\"setLockDropAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_depositor\":\"Address of the depositor account\",\"_lockDrop\":\"Address of the BOB FusionLock contract\",\"_safeAddress\":\"Address of the Gnosis Safe\",\"_sovToken\":\"Address of the SOV token contract\"}},\"execTransactionFromSafe(address,uint256,bytes,uint8)\":{\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"},\"returns\":{\"success\":\"Boolean flag indicating if the call succeeded.\"}},\"mapDepositorToReceiver(address)\":{\"params\":{\"receiver\":\"Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\"}},\"sendToLockDropContract(address[],uint256[],uint256)\":{\"details\":\"This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEXThe function is allowed to be called only by the lockdropDepositorAddressToken amounts and SOV amount to send are calculated offchain\",\"params\":{\"amounts\":\"List of amounts of tokens to send\",\"sovAmount\":\"Amount of SOV tokens to send\",\"tokens\":\"List of tokens to send\"}},\"setDepositorAddress(address)\":{\"details\":\"Only Safe can call this functionNew depositor can be zero address\",\"params\":{\"_newDepositor\":\"New depositor address\"}},\"setLockDropAddress(address)\":{\"details\":\"Only Safe can call this functionNew LockDrop can't be zero address\",\"params\":{\"_newLockdrop\":\"New depositor address\"}},\"withdraw(address[],uint256[],address)\":{\"details\":\"Only Safe can call this functionRecipient should not be a zero address\",\"params\":{\"amounts\":\"List of token amounts to withdraw\",\"recipient\":\"Recipient address\",\"tokens\":\"List of token addresses to withdraw\"}},\"withdrawAll(address[],address)\":{\"details\":\"Only Safe can call this functionRecipient should not be a zero address\",\"params\":{\"recipient\":\"Recipient address\",\"tokens\":\"List of token addresses to withdraw\"}}},\"title\":\"SafeDepositsSender\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execTransactionFromSafe(address,uint256,bytes,uint8)\":{\"notice\":\"Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\"},\"mapDepositorToReceiver(address)\":{\"notice\":\"Maps depositor on ethereum to receiver on BOBReceiver from the last emitted event called by msg.sender will be used\"},\"pause()\":{\"notice\":\"pause the contract - no funds can be sent to the LockDrop contract\"},\"sendToLockDropContract(address[],uint256[],uint256)\":{\"notice\":\"Sends tokens to the LockDrop contract\"},\"setDepositorAddress(address)\":{\"notice\":\"Sets new depositor address\"},\"setLockDropAddress(address)\":{\"notice\":\"Sets new LockDrop address\"},\"stop()\":{\"notice\":\"stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\"},\"unpause()\":{\"notice\":\"unpause the contract\"},\"withdraw(address[],uint256[],address)\":{\"notice\":\"Withdraws tokens from this contract to a recipient addressWithdrawal to the Safe address will affect balances and rewardsAmount > 0 should be checked by the caller before calling this function\"},\"withdrawAll(address[],address)\":{\"notice\":\"Withdraws all tokens from this contract to a recipientAmount > 0 should be checked by the caller before calling this functionWithdrawal to the Safe address will affect balances and rewards\"}},\"notice\":\"This contract is a gateway for depositing funds into the Bob locker contracts\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/integrations/bob/SafeDepositsSender.sol\":\"SafeDepositsSender\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=contracts/\",\":ds-test/=foundry/lib/forge-std/lib/ds-test/src/\",\":forge-std/=foundry/lib/forge-std/src/\"]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n * doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n * token.safeTransferFrom(msg.sender, address(this), value);\\n * ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n *\\n * CAUTION: See Security Considerations above.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n * to be set to zero before setting it to a non-zero value, such as USDT.\\n */\\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"contracts/integrations/bob/SafeDepositsSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport { ISafeDepositsSender } from \\\"./interfaces/ISafeDepositsSender.sol\\\";\\nimport { SafeERC20, IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\ninterface GnosisSafe {\\n enum Operation {\\n Call,\\n DelegateCall\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Operation operation\\n ) external returns (bool success);\\n}\\n\\n/**\\n * @title SafeDepositsSender\\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\\n */\\ncontract SafeDepositsSender is ISafeDepositsSender {\\n using SafeERC20 for IERC20;\\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\\n GnosisSafe private immutable SAFE;\\n address private immutable SOV_TOKEN_ADDRESS;\\n address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract\\n address private lockDropAddress;\\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\\n bool private paused;\\n\\n /**\\n * @param _safeAddress Address of the Gnosis Safe\\n * @param _lockDrop Address of the BOB FusionLock contract\\n * @param _sovToken Address of the SOV token contract\\n * @param _depositor Address of the depositor account\\n */\\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\\n require(_safeAddress != address(0), \\\"SafeDepositsSender: Invalid safe address\\\");\\n require(_lockDrop != address(0), \\\"SafeDepositsSender: Invalid lockdrop address\\\");\\n require(_sovToken != address(0), \\\"SafeDepositsSender: Invalid sov token address\\\");\\n require(_depositor != address(0), \\\"SafeDepositsSender: Invalid depositor token address\\\");\\n SAFE = GnosisSafe(_safeAddress);\\n SOV_TOKEN_ADDRESS = _sovToken;\\n lockdropDepositorAddress = _depositor;\\n lockDropAddress = _lockDrop;\\n }\\n\\n receive() external payable {}\\n\\n // MODIFIERS //\\n\\n modifier onlySafe() {\\n require(msg.sender == address(SAFE), \\\"SafeDepositsSender: Only Safe\\\");\\n _;\\n }\\n\\n modifier onlyDepositor() {\\n require(msg.sender == lockdropDepositorAddress, \\\"SafeDepositsSender: Only Depositor\\\");\\n _;\\n }\\n\\n modifier onlyDepositorOrSafe() {\\n require(\\n msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE),\\n \\\"SafeDepositsSender: Only Depositor or Safe\\\"\\n );\\n _;\\n }\\n\\n modifier whenNotPaused() {\\n require(!paused, \\\"SafeDepositsSender: Paused\\\");\\n _;\\n }\\n\\n modifier whenPaused() {\\n require(paused, \\\"SafeDepositsSender: Not paused\\\");\\n _;\\n }\\n\\n modifier whenUnstopped() {\\n require(stopBlock == 0, \\\"SafeDepositsSender: Stopped\\\");\\n _;\\n }\\n\\n modifier notZeroAddress(address _address) {\\n require(_address != address(0), \\\"SafeDepositsSender: Invalid address\\\");\\n _;\\n }\\n\\n // CORE FUNCTIONS\\n\\n /**\\n * @notice Sends tokens to the LockDrop contract\\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\\n * @dev The function is allowed to be called only by the lockdropDepositorAddress\\n * @dev Token amounts and SOV amount to send are calculated offchain\\n * @param tokens List of tokens to send\\n * @param amounts List of amounts of tokens to send\\n * @param sovAmount Amount of SOV tokens to send\\n */\\n function sendToLockDropContract(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n uint256 sovAmount\\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\\n require(\\n tokens.length == amounts.length,\\n \\\"SafeDepositsSender: Tokens and amounts length mismatch\\\"\\n );\\n require(sovAmount > 0, \\\"SafeDepositsSender: Invalid SOV amount\\\");\\n\\n bytes memory data;\\n\\n for (uint256 i = 0; i < tokens.length; i++) {\\n require(\\n tokens[i] != SOV_TOKEN_ADDRESS,\\n \\\"SafeDepositsSender: SOV token is transferred separately\\\"\\n );\\n\\n // transfer native token\\n uint256 balance;\\n uint256 transferAmount;\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n require(\\n address(SAFE).balance >= amounts[i],\\n \\\"SafeDepositsSender: Not enough eth balance to deposit\\\"\\n );\\n data = abi.encodeWithSignature(\\\"depositEth()\\\");\\n require(\\n SAFE.execTransactionFromModule(\\n lockDropAddress,\\n amounts[i],\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not deposit ether\\\"\\n );\\n\\n // withdraw balance to this contract left after deposit to the LockDrop\\n balance = address(SAFE).balance;\\n transferAmount = balance < amounts[i] ? balance : amounts[i];\\n if (transferAmount > 0) {\\n require(\\n SAFE.execTransactionFromModule(\\n address(this),\\n transferAmount,\\n \\\"\\\",\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not withdraw ether after deposit\\\"\\n );\\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\\n }\\n } else {\\n // transfer ERC20 tokens\\n IERC20 token = IERC20(tokens[i]);\\n balance = token.balanceOf(address(SAFE));\\n require(balance >= amounts[i], \\\"SafeDepositsSender: Not enough tokens to deposit\\\");\\n\\n data = abi.encodeWithSignature(\\n \\\"approve(address,uint256)\\\",\\n lockDropAddress,\\n amounts[i]\\n );\\n require(\\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not approve token transfer\\\"\\n );\\n\\n data = abi.encodeWithSignature(\\n \\\"depositERC20(address,uint256)\\\",\\n tokens[i],\\n amounts[i]\\n );\\n require(\\n SAFE.execTransactionFromModule(\\n lockDropAddress,\\n 0,\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not deposit token\\\"\\n );\\n\\n // withdraw balance to this contract left after deposit to the LockDrop\\n balance = token.balanceOf(address(SAFE));\\n transferAmount = balance < amounts[i] ? balance : amounts[i];\\n if (transferAmount > 0) {\\n data = abi.encodeWithSignature(\\n \\\"transfer(address,uint256)\\\",\\n address(this),\\n transferAmount\\n );\\n require(\\n SAFE.execTransactionFromModule(\\n tokens[i],\\n 0,\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not withdraw token after deposit\\\"\\n );\\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\\n }\\n }\\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\\n }\\n\\n // transfer SOV\\n data = abi.encodeWithSignature(\\\"approve(address,uint256)\\\", lockDropAddress, sovAmount);\\n require(\\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not execute SOV transfer\\\"\\n );\\n data = abi.encodeWithSignature(\\n \\\"depositERC20(address,uint256)\\\",\\n SOV_TOKEN_ADDRESS,\\n sovAmount\\n );\\n require(\\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not execute SOV transfer\\\"\\n );\\n\\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\\n }\\n\\n /// @notice Maps depositor on ethereum to receiver on BOB\\n /// @notice Receiver from the last emitted event called by msg.sender will be used\\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\\n function mapDepositorToReceiver(address receiver) external {\\n emit MapDepositorToReceiver(msg.sender, receiver);\\n }\\n\\n // ADMINISTRATIVE FUNCTIONS //\\n\\n /**\\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\\n * @param to Destination address of module transaction.\\n * @param value Ether value of module transaction.\\n * @param data Data payload of module transaction.\\n * @param operation Operation type of module transaction.\\n * @return success Boolean flag indicating if the call succeeded.\\n */\\n function execTransactionFromSafe(\\n address to,\\n uint256 value,\\n bytes memory data,\\n GnosisSafe.Operation operation\\n ) external onlySafe returns (bool success) {\\n success = execute(to, value, data, operation, type(uint256).max);\\n }\\n\\n /**\\n * @notice Executes either a delegatecall or a call with provided parameters.\\n * @dev This method doesn't perform any sanity check of the transaction, such as:\\n * - if the contract at `to` address has code or not\\n * It is the responsibility of the caller to perform such checks.\\n * @param to Destination address.\\n * @param value Ether value.\\n * @param data Data payload.\\n * @param operation Operation type.\\n * @return success boolean flag indicating if the call succeeded.\\n */\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n GnosisSafe.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == GnosisSafe.Operation.DelegateCall) {\\n /* solhint-disable no-inline-assembly */\\n /// @solidity memory-safe-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n /* solhint-enable no-inline-assembly */\\n } else {\\n /* solhint-disable no-inline-assembly */\\n /// @solidity memory-safe-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n /* solhint-enable no-inline-assembly */\\n }\\n }\\n\\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\\n\\n /**\\n * @notice Sets new depositor address\\n * @dev Only Safe can call this function\\n * @dev New depositor can be zero address\\n * @param _newDepositor New depositor address\\n */\\n function setDepositorAddress(address _newDepositor) external onlySafe {\\n emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor);\\n lockdropDepositorAddress = _newDepositor;\\n }\\n\\n /**\\n * @notice Sets new LockDrop address\\n * @dev Only Safe can call this function\\n * @dev New LockDrop can't be zero address\\n * @param _newLockdrop New depositor address\\n */\\n function setLockDropAddress(address _newLockdrop) external onlySafe {\\n require(_newLockdrop != address(0), \\\"SafeDepositsSender: Zero address not allowed\\\");\\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\\n lockDropAddress = _newLockdrop;\\n }\\n\\n /**\\n * @notice Withdraws tokens from this contract to a recipient address\\n * @notice Withdrawal to the Safe address will affect balances and rewards\\n * @notice Amount > 0 should be checked by the caller before calling this function\\n * @dev Only Safe can call this function\\n * @dev Recipient should not be a zero address\\n * @param tokens List of token addresses to withdraw\\n * @param amounts List of token amounts to withdraw\\n * @param recipient Recipient address\\n */\\n function withdraw(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n address recipient\\n ) external onlySafe notZeroAddress(recipient) {\\n require(\\n tokens.length == amounts.length,\\n \\\"SafeDepositsSender: Tokens and amounts length mismatch\\\"\\n );\\n\\n for (uint256 i = 0; i < tokens.length; i++) {\\n require(tokens[i] != address(0x00), \\\"SafeDepositsSender: Zero address not allowed\\\");\\n require(amounts[i] != 0, \\\"SafeDepositsSender: Zero amount not allowed\\\");\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n require(\\n address(this).balance >= amounts[i],\\n \\\"SafeDepositsSender: Not enough funds\\\"\\n );\\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\\\"\\\");\\n require(success, \\\"Could not withdraw ether\\\");\\n continue;\\n }\\n\\n IERC20 token = IERC20(tokens[i]);\\n uint256 balance = token.balanceOf(address(this));\\n require(balance >= amounts[i], \\\"SafeDepositsSender: Not enough funds\\\");\\n\\n token.safeTransfer(recipient, amounts[i]);\\n\\n emit Withdraw(recipient, tokens[i], amounts[i]);\\n }\\n }\\n\\n /**\\n * @notice Withdraws all tokens from this contract to a recipient\\n * @notice Amount > 0 should be checked by the caller before calling this function\\n * @dev Only Safe can call this function\\n * @dev Recipient should not be a zero address\\n * @notice Withdrawal to the Safe address will affect balances and rewards\\n * @param tokens List of token addresses to withdraw\\n * @param recipient Recipient address\\n */\\n function withdrawAll(\\n address[] calldata tokens,\\n address recipient\\n ) external onlySafe notZeroAddress(recipient) {\\n for (uint256 i = 0; i < tokens.length; i++) {\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\\\"\\\");\\n require(success, \\\"SafeDepositsSender: Could not withdraw ether\\\");\\n continue;\\n }\\n IERC20 token = IERC20(tokens[i]);\\n uint256 balance = token.balanceOf(address(this));\\n if (balance > 0) {\\n token.safeTransfer(recipient, balance);\\n }\\n\\n emit Withdraw(recipient, tokens[i], balance);\\n }\\n }\\n\\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\\n function pause() external onlySafe whenNotPaused {\\n paused = true;\\n emit Pause();\\n }\\n\\n /// @notice unpause the contract\\n function unpause() external onlySafe whenPaused {\\n paused = false;\\n emit Unpause();\\n }\\n\\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\\n function stop() external onlySafe {\\n stopBlock = block.number;\\n emit Stop();\\n }\\n\\n // GETTERS //\\n function getSafeAddress() external view returns (address) {\\n return address(SAFE);\\n }\\n\\n function getLockDropAddress() external view returns (address) {\\n return lockDropAddress;\\n }\\n\\n function getSovTokenAddress() external view returns (address) {\\n return SOV_TOKEN_ADDRESS;\\n }\\n\\n function getDepositorAddress() external view returns (address) {\\n return lockdropDepositorAddress;\\n }\\n\\n function isStopped() external view returns (bool) {\\n return stopBlock != 0;\\n }\\n\\n function getStopBlock() external view returns (uint256) {\\n return stopBlock;\\n }\\n\\n function isPaused() external view returns (bool) {\\n return paused;\\n }\\n}\\n\",\"keccak256\":\"0x7b0054d143e6643b8f9e17cf4fe8d931a16012bdbdc8f0cd70c6db441ee4273d\",\"license\":\"MIT\"},\"contracts/integrations/bob/interfaces/ISafeDepositsSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\ninterface ISafeDepositsSender {\\n event Withdraw(address indexed from, address indexed token, uint256 amount);\\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\\n event Pause();\\n event Unpause();\\n event Stop();\\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\\n\\n function getSafeAddress() external view returns (address);\\n function getLockDropAddress() external view returns (address);\\n function getSovTokenAddress() external view returns (address);\\n function getDepositorAddress() external view returns (address);\\n function isStopped() external view returns (bool);\\n function isPaused() external view returns (bool);\\n\\n // @note amount > 0 should be checked by the caller\\n function withdraw(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n address recipient\\n ) external;\\n\\n function withdrawAll(address[] calldata tokens, address recipient) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function stop() external;\\n\\n function setDepositorAddress(address _newDepositor) external;\\n\\n function sendToLockDropContract(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n uint256 sovAmount\\n ) external;\\n}\\n\",\"keccak256\":\"0xb80080b92446a1edc1a9f4ed3576ffea3df483aaff33b33a2d2168212f7d2812\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162002c2238038062002c22833981016040819052620000349162000254565b6001600160a01b038416620000a15760405162461bcd60e51b815260206004820152602860248201527f536166654465706f7369747353656e6465723a20496e76616c69642073616665604482015267206164647265737360c01b60648201526084015b60405180910390fd5b6001600160a01b0383166200010e5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20496e76616c6964206c6f636b60448201526b64726f70206164647265737360a01b606482015260840162000098565b6001600160a01b0382166200017c5760405162461bcd60e51b815260206004820152602d60248201527f536166654465706f7369747353656e6465723a20496e76616c696420736f762060448201526c746f6b656e206164647265737360981b606482015260840162000098565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152603360248201527f536166654465706f7369747353656e6465723a20496e76616c6964206465706f60448201527f7369746f7220746f6b656e206164647265737300000000000000000000000000606482015260840162000098565b6001600160a01b0393841660805290831660a052600080549184166001600160a01b031992831617905560018054929093169116179055620002b1565b80516001600160a01b03811681146200024f57600080fd5b919050565b600080600080608085870312156200026b57600080fd5b620002768562000237565b9350620002866020860162000237565b9250620002966040860162000237565b9150620002a66060860162000237565b905092959194509250565b60805160a0516128aa620003786000396000818161022701528181610f2a01528181611c330152611cce015260008181610305015281816103720152818161042b0152818161086f01528181610b2001528181610bef01528181610c9201528181610d790152818161104a0152818161111801528181611221015281816112aa01528181611448015281816115ba01528181611779015281816118700152818161197501528181611c0601528181611d4301528181611e340152611f0001526128aa6000f3fe60806040526004361061010d5760003560e01c80635d9dac1011610095578063b187bd2611610064578063b187bd26146102be578063b6e7377d146102d6578063d17b8f98146102f6578063d7c3e7b314610329578063f5f52e2e1461034957600080fd5b80635d9dac101461024b578063813ddbf41461026b5780638456cb5914610289578063af0776521461029e57600080fd5b8063397a079b116100dc578063397a079b146101a25780633f4ba83a146101c25780633f683b6a146101d75780634768b497146101fa5780634bcfe7261461021857600080fd5b806307da68f5146101195780631878d1f1146101305780631d1372e41461016257806326f915061461018257600080fd5b3661011457005b600080fd5b34801561012557600080fd5b5061012e610367565b005b34801561013c57600080fd5b50610145600181565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012e61017d366004612272565b6103e7565b34801561018e57600080fd5b5061012e61019d3660046122e0565b610420565b3480156101ae57600080fd5b5061012e6101bd366004612361565b610864565b3480156101ce57600080fd5b5061012e610b15565b3480156101e357600080fd5b5060025415155b6040519015158152602001610159565b34801561020657600080fd5b506000546001600160a01b0316610145565b34801561022457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561025757600080fd5b5061012e610266366004612272565b610be4565b34801561027757600080fd5b506001546001600160a01b0316610145565b34801561029557600080fd5b5061012e610c87565b3480156102aa57600080fd5b5061012e6102b93660046123b5565b610d5a565b3480156102ca57600080fd5b5060035460ff166101ea565b3480156102e257600080fd5b5061012e6102f1366004612272565b611e29565b34801561030257600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561033557600080fd5b506101ea61034436600461244e565b611ef3565b34801561035557600080fd5b50600254604051908152602001610159565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b85760405162461bcd60e51b81526004016103af9061252a565b60405180910390fd5b436002556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b90600090a1565b6040516001600160a01b0382169033907f256f07b5eef8212c06c8cbb78abeb76d2b66770a68e81686fd14c3a0454551e190600090a350565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104685760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b03811661048f5760405162461bcd60e51b81526004016103af90612561565b8483146104ae5760405162461bcd60e51b81526004016103af906125a4565b60005b8581101561085b5760008787838181106104cd576104cd6125fa565b90506020020160208101906104e29190612272565b6001600160a01b0316036105085760405162461bcd60e51b81526004016103af90612610565b84848281811061051a5761051a6125fa565b905060200201356000036105845760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a205a65726f20616d6f756e742060448201526a1b9bdd08185b1b1bddd95960aa1b60648201526084016103af565b6001878783818110610598576105986125fa565b90506020020160208101906105ad9190612272565b6001600160a01b0316036106b4578484828181106105cd576105cd6125fa565b905060200201354710156105f35760405162461bcd60e51b81526004016103af9061265c565b6000836001600160a01b0316868684818110610611576106116125fa565b9050602002013560405160006040518083038185875af1925050503d8060008114610658576040519150601f19603f3d011682016040523d82523d6000602084013e61065d565b606091505b50509050806106ae5760405162461bcd60e51b815260206004820152601860248201527f436f756c64206e6f74207769746864726177206574686572000000000000000060448201526064016103af565b50610849565b60008787838181106106c8576106c86125fa565b90506020020160208101906106dd9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b91906126a0565b905086868481811061075f5761075f6125fa565b905060200201358110156107855760405162461bcd60e51b81526004016103af9061265c565b6107bb8588888681811061079b5761079b6125fa565b90506020020135846001600160a01b0316611f559092919063ffffffff16565b8888848181106107cd576107cd6125fa565b90506020020160208101906107e29190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb898987818110610828576108286125fa565b9050602002013560405161083e91815260200190565b60405180910390a350505b80610853816126b9565b9150506104b1565b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ac5760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b0381166108d35760405162461bcd60e51b81526004016103af90612561565b60005b83811015610b0e5760018585838181106108f2576108f26125fa565b90506020020160208101906109079190612272565b6001600160a01b0316036109d3576000836001600160a01b03164760405160006040518083038185875af1925050503d8060008114610962576040519150601f19603f3d011682016040523d82523d6000602084013e610967565b606091505b50509050806109cd5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201526b3a34323930bb9032ba3432b960a11b60648201526084016103af565b50610afc565b60008585838181106109e7576109e76125fa565b90506020020160208101906109fc9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a91906126a0565b90508015610a8657610a866001600160a01b0383168683611f55565b868684818110610a9857610a986125fa565b9050602002016020810190610aad9190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83604051610af191815260200190565b60405180910390a350505b80610b06816126b9565b9150506108d6565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b5d5760405162461bcd60e51b81526004016103af9061252a565b60035460ff16610baf5760405162461bcd60e51b815260206004820152601e60248201527f536166654465706f7369747353656e6465723a204e6f7420706175736564000060448201526064016103af565b6003805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c2c5760405162461bcd60e51b81526004016103af9061252a565b600080546040516001600160a01b03808516939216917fad63b85612b3c457488f5a3a8fe770cdb830f4a4c74ed076937f49c50ca6a82091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ccf5760405162461bcd60e51b81526004016103af9061252a565b60035460ff1615610d225760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b6003805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000546001600160a01b0316331480610d9b5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610dfa5760405162461bcd60e51b815260206004820152602a60248201527f536166654465706f7369747353656e6465723a204f6e6c79204465706f7369746044820152696f72206f72205361666560b01b60648201526084016103af565b60035460ff1615610e4d5760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b60025415610e9d5760405162461bcd60e51b815260206004820152601b60248201527f536166654465706f7369747353656e6465723a2053746f70706564000000000060448201526064016103af565b838214610ebc5760405162461bcd60e51b81526004016103af906125a4565b60008111610f1b5760405162461bcd60e51b815260206004820152602660248201527f536166654465706f7369747353656e6465723a20496e76616c696420534f5620604482015265185b5bdd5b9d60d21b60648201526084016103af565b606060005b85811015611ba3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878783818110610f6457610f646125fa565b9050602002016020810190610f799190612272565b6001600160a01b031603610ff55760405162461bcd60e51b815260206004820152603760248201527f536166654465706f7369747353656e6465723a20534f5620746f6b656e20697360448201527f207472616e736665727265642073657061726174656c7900000000000000000060648201526084016103af565b600080600189898581811061100c5761100c6125fa565b90506020020160208101906110219190612272565b6001600160a01b03160361140857868684818110611041576110416125fa565b905060200201357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163110156110df5760405162461bcd60e51b815260206004820152603560248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f75676820656044820152741d1a0818985b185b98d9481d1bc819195c1bdcda5d605a1b60648201526084016103af565b6040805160048152602481019091526020810180516001600160e01b031663439370b160e01b1790526001549094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163468721a79116898987818110611153576111536125fa565b905060200201358760006040518563ffffffff1660e01b815260040161117c9493929190612768565b6020604051808303816000875af115801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf919061279e565b61121f5760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba1032ba3432b960a91b60648201526084016103af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031631915086868481811061125e5761125e6125fa565b9050602002013582106112895786868481811061127d5761127d6125fa565b9050602002013561128b565b815b905080156114035760405163468721a760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a7906112e490309085906000906004016127c0565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611327919061279e565b6113995760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f746864726177206574686572206166746572206465706f73697400000000000060648201526084016103af565b8888848181106113ab576113ab6125fa565b90506020020160208101906113c09190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b692826040516113fa91815260200190565b60405180910390a25b611b06565b600089898581811061141c5761141c6125fa565b90506020020160208101906114319190612272565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919250908216906370a0823190602401602060405180830381865afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf91906126a0565b92508787858181106114d3576114d36125fa565b905060200201358310156115425760405162461bcd60e51b815260206004820152603060248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f756768207460448201526f1bdad95b9cc81d1bc819195c1bdcda5d60821b60648201526084016103af565b6001546001600160a01b0316888886818110611560576115606125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106115f1576115f16125fa565b90506020020160208101906116069190612272565b60008860006040518563ffffffff1660e01b815260040161162a9493929190612768565b6020604051808303816000875af1158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d919061279e565b6116d65760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f74206170604482015273383937bb32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b8989858181106116e8576116e86125fa565b90506020020160208101906116fd9190612272565b88888681811061170f5761170f6125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529196506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a7926117b69216906000908a908290600401612768565b6020604051808303816000875af11580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f9919061279e565b6118595760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba103a37b5b2b760a91b60648201526084016103af565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528216906370a0823190602401602060405180830381865afa1580156118bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e391906126a0565b92508787858181106118f7576118f76125fa565b90506020020135831061192257878785818110611916576119166125fa565b90506020020135611924565b825b91508115611b04576040513060248201526044810183905260640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106119ac576119ac6125fa565b90506020020160208101906119c19190612272565b60008860006040518563ffffffff1660e01b81526004016119e59493929190612768565b6020604051808303816000875af1158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a28919061279e565b611a9a5760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f74686472617720746f6b656e206166746572206465706f73697400000000000060648201526084016103af565b898985818110611aac57611aac6125fa565b9050602002016020810190611ac19190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b69283604051611afb91815260200190565b60405180910390a25b505b888884818110611b1857611b186125fa565b9050602002016020810190611b2d9190612272565b6001546001600160a01b0391821691167f83e351ace74af42916cc159bb2c353842d1fe21125f26f3ab645aeac206b663c898987818110611b7057611b706125fa565b90506020020135604051611b8691815260200190565b60405180910390a350508080611b9b906126b9565b915050610f20565b506001546040516001600160a01b0390911660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b1790525163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a790611c62907f00000000000000000000000000000000000000000000000000000000000000009060009086908290600401612768565b6020604051808303816000875af1158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca5919061279e565b611cc15760405162461bcd60e51b81526004016103af906127f3565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a792611d8092169060009086908290600401612768565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc3919061279e565b611ddf5760405162461bcd60e51b81526004016103af906127f3565b6001546040518381526001600160a01b03909116907fece2604abb1c0d8f143c1c8961c88ecda8a2c7b650545e98255665063e7321859060200160405180910390a2505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e715760405162461bcd60e51b81526004016103af9061252a565b6001600160a01b038116611e975760405162461bcd60e51b81526004016103af90612610565b6001546040516001600160a01b038084169216907f571b0cfddc37eea7ea50ec6529f701f4c53e523eb459eb1238fb38a16fee9d4490600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611f3d5760405162461bcd60e51b81526004016103af9061252a565b611f4c85858585600019611fac565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611fa7908490611ff1565b505050565b60006001836001811115611fc257611fc2612730565b03611fda576000808551602087018986f49050611f4c565b600080855160208701888a87f19695505050505050565b6000612046826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120c69092919063ffffffff16565b9050805160001480612067575080806020019051810190612067919061279e565b611fa75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103af565b60606120d584846000856120dd565b949350505050565b60608247101561213e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103af565b600080866001600160a01b0316858760405161215a9190612845565b60006040518083038185875af1925050503d8060008114612197576040519150601f19603f3d011682016040523d82523d6000602084013e61219c565b606091505b50915091506121ad878383876121b8565b979650505050505050565b60608315612227578251600003612220576001600160a01b0385163b6122205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103af565b50816120d5565b6120d5838381511561223c5781518083602001fd5b8060405162461bcd60e51b81526004016103af9190612861565b80356001600160a01b038116811461226d57600080fd5b919050565b60006020828403121561228457600080fd5b61228d82612256565b9392505050565b60008083601f8401126122a657600080fd5b50813567ffffffffffffffff8111156122be57600080fd5b6020830191508360208260051b85010111156122d957600080fd5b9250929050565b6000806000806000606086880312156122f857600080fd5b853567ffffffffffffffff8082111561231057600080fd5b61231c89838a01612294565b9097509550602088013591508082111561233557600080fd5b5061234288828901612294565b9094509250612355905060408701612256565b90509295509295909350565b60008060006040848603121561237657600080fd5b833567ffffffffffffffff81111561238d57600080fd5b61239986828701612294565b90945092506123ac905060208501612256565b90509250925092565b6000806000806000606086880312156123cd57600080fd5b853567ffffffffffffffff808211156123e557600080fd5b6123f189838a01612294565b9097509550602088013591508082111561240a57600080fd5b5061241788828901612294565b96999598509660400135949350505050565b634e487b7160e01b600052604160045260246000fd5b80356002811061226d57600080fd5b6000806000806080858703121561246457600080fd5b61246d85612256565b935060208501359250604085013567ffffffffffffffff8082111561249157600080fd5b818701915087601f8301126124a557600080fd5b8135818111156124b7576124b7612429565b604051601f8201601f19908116603f011681019083821181831017156124df576124df612429565b816040528281528a60208487010111156124f857600080fd5b82602086016020830137600060208483010152809650505050505061251f6060860161243f565b905092959194509250565b6020808252601d908201527f536166654465706f7369747353656e6465723a204f6e6c792053616665000000604082015260600190565b60208082526023908201527f536166654465706f7369747353656e6465723a20496e76616c6964206164647260408201526265737360e81b606082015260800190565b60208082526036908201527f536166654465706f7369747353656e6465723a20546f6b656e7320616e6420616040820152750dadeeadce8e640d8cadccee8d040dad2e6dac2e8c6d60531b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602c908201527f536166654465706f7369747353656e6465723a205a65726f206164647265737360408201526b081b9bdd08185b1b1bddd95960a21b606082015260800190565b60208082526024908201527f536166654465706f7369747353656e6465723a204e6f7420656e6f7567682066604082015263756e647360e01b606082015260800190565b6000602082840312156126b257600080fd5b5051919050565b6000600182016126d957634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b838110156126fb5781810151838201526020016126e3565b50506000910152565b6000815180845261271c8160208601602086016126e0565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6002811061276457634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b038516815283602082015260806040820152600061278f6080830185612704565b9050611f4c6060830184612746565b6000602082840312156127b057600080fd5b8151801515811461228d57600080fd5b6001600160a01b03841681526020810183905260806040820181905260009082015260a081016120d56060830184612746565b60208082526032908201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860408201527132b1baba329029a7ab103a3930b739b332b960711b606082015260800190565b600082516128578184602087016126e0565b9190910192915050565b60208152600061228d602083018461270456fea264697066735822122079436df57107ad03a8a62cb0ffaabfeebb3ab9643ced815126b2474370014c4c64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061010d5760003560e01c80635d9dac1011610095578063b187bd2611610064578063b187bd26146102be578063b6e7377d146102d6578063d17b8f98146102f6578063d7c3e7b314610329578063f5f52e2e1461034957600080fd5b80635d9dac101461024b578063813ddbf41461026b5780638456cb5914610289578063af0776521461029e57600080fd5b8063397a079b116100dc578063397a079b146101a25780633f4ba83a146101c25780633f683b6a146101d75780634768b497146101fa5780634bcfe7261461021857600080fd5b806307da68f5146101195780631878d1f1146101305780631d1372e41461016257806326f915061461018257600080fd5b3661011457005b600080fd5b34801561012557600080fd5b5061012e610367565b005b34801561013c57600080fd5b50610145600181565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012e61017d366004612272565b6103e7565b34801561018e57600080fd5b5061012e61019d3660046122e0565b610420565b3480156101ae57600080fd5b5061012e6101bd366004612361565b610864565b3480156101ce57600080fd5b5061012e610b15565b3480156101e357600080fd5b5060025415155b6040519015158152602001610159565b34801561020657600080fd5b506000546001600160a01b0316610145565b34801561022457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561025757600080fd5b5061012e610266366004612272565b610be4565b34801561027757600080fd5b506001546001600160a01b0316610145565b34801561029557600080fd5b5061012e610c87565b3480156102aa57600080fd5b5061012e6102b93660046123b5565b610d5a565b3480156102ca57600080fd5b5060035460ff166101ea565b3480156102e257600080fd5b5061012e6102f1366004612272565b611e29565b34801561030257600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561033557600080fd5b506101ea61034436600461244e565b611ef3565b34801561035557600080fd5b50600254604051908152602001610159565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b85760405162461bcd60e51b81526004016103af9061252a565b60405180910390fd5b436002556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b90600090a1565b6040516001600160a01b0382169033907f256f07b5eef8212c06c8cbb78abeb76d2b66770a68e81686fd14c3a0454551e190600090a350565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104685760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b03811661048f5760405162461bcd60e51b81526004016103af90612561565b8483146104ae5760405162461bcd60e51b81526004016103af906125a4565b60005b8581101561085b5760008787838181106104cd576104cd6125fa565b90506020020160208101906104e29190612272565b6001600160a01b0316036105085760405162461bcd60e51b81526004016103af90612610565b84848281811061051a5761051a6125fa565b905060200201356000036105845760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a205a65726f20616d6f756e742060448201526a1b9bdd08185b1b1bddd95960aa1b60648201526084016103af565b6001878783818110610598576105986125fa565b90506020020160208101906105ad9190612272565b6001600160a01b0316036106b4578484828181106105cd576105cd6125fa565b905060200201354710156105f35760405162461bcd60e51b81526004016103af9061265c565b6000836001600160a01b0316868684818110610611576106116125fa565b9050602002013560405160006040518083038185875af1925050503d8060008114610658576040519150601f19603f3d011682016040523d82523d6000602084013e61065d565b606091505b50509050806106ae5760405162461bcd60e51b815260206004820152601860248201527f436f756c64206e6f74207769746864726177206574686572000000000000000060448201526064016103af565b50610849565b60008787838181106106c8576106c86125fa565b90506020020160208101906106dd9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b91906126a0565b905086868481811061075f5761075f6125fa565b905060200201358110156107855760405162461bcd60e51b81526004016103af9061265c565b6107bb8588888681811061079b5761079b6125fa565b90506020020135846001600160a01b0316611f559092919063ffffffff16565b8888848181106107cd576107cd6125fa565b90506020020160208101906107e29190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb898987818110610828576108286125fa565b9050602002013560405161083e91815260200190565b60405180910390a350505b80610853816126b9565b9150506104b1565b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ac5760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b0381166108d35760405162461bcd60e51b81526004016103af90612561565b60005b83811015610b0e5760018585838181106108f2576108f26125fa565b90506020020160208101906109079190612272565b6001600160a01b0316036109d3576000836001600160a01b03164760405160006040518083038185875af1925050503d8060008114610962576040519150601f19603f3d011682016040523d82523d6000602084013e610967565b606091505b50509050806109cd5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201526b3a34323930bb9032ba3432b960a11b60648201526084016103af565b50610afc565b60008585838181106109e7576109e76125fa565b90506020020160208101906109fc9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a91906126a0565b90508015610a8657610a866001600160a01b0383168683611f55565b868684818110610a9857610a986125fa565b9050602002016020810190610aad9190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83604051610af191815260200190565b60405180910390a350505b80610b06816126b9565b9150506108d6565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b5d5760405162461bcd60e51b81526004016103af9061252a565b60035460ff16610baf5760405162461bcd60e51b815260206004820152601e60248201527f536166654465706f7369747353656e6465723a204e6f7420706175736564000060448201526064016103af565b6003805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c2c5760405162461bcd60e51b81526004016103af9061252a565b600080546040516001600160a01b03808516939216917fad63b85612b3c457488f5a3a8fe770cdb830f4a4c74ed076937f49c50ca6a82091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ccf5760405162461bcd60e51b81526004016103af9061252a565b60035460ff1615610d225760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b6003805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000546001600160a01b0316331480610d9b5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610dfa5760405162461bcd60e51b815260206004820152602a60248201527f536166654465706f7369747353656e6465723a204f6e6c79204465706f7369746044820152696f72206f72205361666560b01b60648201526084016103af565b60035460ff1615610e4d5760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b60025415610e9d5760405162461bcd60e51b815260206004820152601b60248201527f536166654465706f7369747353656e6465723a2053746f70706564000000000060448201526064016103af565b838214610ebc5760405162461bcd60e51b81526004016103af906125a4565b60008111610f1b5760405162461bcd60e51b815260206004820152602660248201527f536166654465706f7369747353656e6465723a20496e76616c696420534f5620604482015265185b5bdd5b9d60d21b60648201526084016103af565b606060005b85811015611ba3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878783818110610f6457610f646125fa565b9050602002016020810190610f799190612272565b6001600160a01b031603610ff55760405162461bcd60e51b815260206004820152603760248201527f536166654465706f7369747353656e6465723a20534f5620746f6b656e20697360448201527f207472616e736665727265642073657061726174656c7900000000000000000060648201526084016103af565b600080600189898581811061100c5761100c6125fa565b90506020020160208101906110219190612272565b6001600160a01b03160361140857868684818110611041576110416125fa565b905060200201357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163110156110df5760405162461bcd60e51b815260206004820152603560248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f75676820656044820152741d1a0818985b185b98d9481d1bc819195c1bdcda5d605a1b60648201526084016103af565b6040805160048152602481019091526020810180516001600160e01b031663439370b160e01b1790526001549094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163468721a79116898987818110611153576111536125fa565b905060200201358760006040518563ffffffff1660e01b815260040161117c9493929190612768565b6020604051808303816000875af115801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf919061279e565b61121f5760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba1032ba3432b960a91b60648201526084016103af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031631915086868481811061125e5761125e6125fa565b9050602002013582106112895786868481811061127d5761127d6125fa565b9050602002013561128b565b815b905080156114035760405163468721a760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a7906112e490309085906000906004016127c0565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611327919061279e565b6113995760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f746864726177206574686572206166746572206465706f73697400000000000060648201526084016103af565b8888848181106113ab576113ab6125fa565b90506020020160208101906113c09190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b692826040516113fa91815260200190565b60405180910390a25b611b06565b600089898581811061141c5761141c6125fa565b90506020020160208101906114319190612272565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919250908216906370a0823190602401602060405180830381865afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf91906126a0565b92508787858181106114d3576114d36125fa565b905060200201358310156115425760405162461bcd60e51b815260206004820152603060248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f756768207460448201526f1bdad95b9cc81d1bc819195c1bdcda5d60821b60648201526084016103af565b6001546001600160a01b0316888886818110611560576115606125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106115f1576115f16125fa565b90506020020160208101906116069190612272565b60008860006040518563ffffffff1660e01b815260040161162a9493929190612768565b6020604051808303816000875af1158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d919061279e565b6116d65760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f74206170604482015273383937bb32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b8989858181106116e8576116e86125fa565b90506020020160208101906116fd9190612272565b88888681811061170f5761170f6125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529196506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a7926117b69216906000908a908290600401612768565b6020604051808303816000875af11580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f9919061279e565b6118595760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba103a37b5b2b760a91b60648201526084016103af565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528216906370a0823190602401602060405180830381865afa1580156118bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e391906126a0565b92508787858181106118f7576118f76125fa565b90506020020135831061192257878785818110611916576119166125fa565b90506020020135611924565b825b91508115611b04576040513060248201526044810183905260640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106119ac576119ac6125fa565b90506020020160208101906119c19190612272565b60008860006040518563ffffffff1660e01b81526004016119e59493929190612768565b6020604051808303816000875af1158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a28919061279e565b611a9a5760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f74686472617720746f6b656e206166746572206465706f73697400000000000060648201526084016103af565b898985818110611aac57611aac6125fa565b9050602002016020810190611ac19190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b69283604051611afb91815260200190565b60405180910390a25b505b888884818110611b1857611b186125fa565b9050602002016020810190611b2d9190612272565b6001546001600160a01b0391821691167f83e351ace74af42916cc159bb2c353842d1fe21125f26f3ab645aeac206b663c898987818110611b7057611b706125fa565b90506020020135604051611b8691815260200190565b60405180910390a350508080611b9b906126b9565b915050610f20565b506001546040516001600160a01b0390911660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b1790525163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a790611c62907f00000000000000000000000000000000000000000000000000000000000000009060009086908290600401612768565b6020604051808303816000875af1158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca5919061279e565b611cc15760405162461bcd60e51b81526004016103af906127f3565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a792611d8092169060009086908290600401612768565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc3919061279e565b611ddf5760405162461bcd60e51b81526004016103af906127f3565b6001546040518381526001600160a01b03909116907fece2604abb1c0d8f143c1c8961c88ecda8a2c7b650545e98255665063e7321859060200160405180910390a2505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e715760405162461bcd60e51b81526004016103af9061252a565b6001600160a01b038116611e975760405162461bcd60e51b81526004016103af90612610565b6001546040516001600160a01b038084169216907f571b0cfddc37eea7ea50ec6529f701f4c53e523eb459eb1238fb38a16fee9d4490600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611f3d5760405162461bcd60e51b81526004016103af9061252a565b611f4c85858585600019611fac565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611fa7908490611ff1565b505050565b60006001836001811115611fc257611fc2612730565b03611fda576000808551602087018986f49050611f4c565b600080855160208701888a87f19695505050505050565b6000612046826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120c69092919063ffffffff16565b9050805160001480612067575080806020019051810190612067919061279e565b611fa75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103af565b60606120d584846000856120dd565b949350505050565b60608247101561213e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103af565b600080866001600160a01b0316858760405161215a9190612845565b60006040518083038185875af1925050503d8060008114612197576040519150601f19603f3d011682016040523d82523d6000602084013e61219c565b606091505b50915091506121ad878383876121b8565b979650505050505050565b60608315612227578251600003612220576001600160a01b0385163b6122205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103af565b50816120d5565b6120d5838381511561223c5781518083602001fd5b8060405162461bcd60e51b81526004016103af9190612861565b80356001600160a01b038116811461226d57600080fd5b919050565b60006020828403121561228457600080fd5b61228d82612256565b9392505050565b60008083601f8401126122a657600080fd5b50813567ffffffffffffffff8111156122be57600080fd5b6020830191508360208260051b85010111156122d957600080fd5b9250929050565b6000806000806000606086880312156122f857600080fd5b853567ffffffffffffffff8082111561231057600080fd5b61231c89838a01612294565b9097509550602088013591508082111561233557600080fd5b5061234288828901612294565b9094509250612355905060408701612256565b90509295509295909350565b60008060006040848603121561237657600080fd5b833567ffffffffffffffff81111561238d57600080fd5b61239986828701612294565b90945092506123ac905060208501612256565b90509250925092565b6000806000806000606086880312156123cd57600080fd5b853567ffffffffffffffff808211156123e557600080fd5b6123f189838a01612294565b9097509550602088013591508082111561240a57600080fd5b5061241788828901612294565b96999598509660400135949350505050565b634e487b7160e01b600052604160045260246000fd5b80356002811061226d57600080fd5b6000806000806080858703121561246457600080fd5b61246d85612256565b935060208501359250604085013567ffffffffffffffff8082111561249157600080fd5b818701915087601f8301126124a557600080fd5b8135818111156124b7576124b7612429565b604051601f8201601f19908116603f011681019083821181831017156124df576124df612429565b816040528281528a60208487010111156124f857600080fd5b82602086016020830137600060208483010152809650505050505061251f6060860161243f565b905092959194509250565b6020808252601d908201527f536166654465706f7369747353656e6465723a204f6e6c792053616665000000604082015260600190565b60208082526023908201527f536166654465706f7369747353656e6465723a20496e76616c6964206164647260408201526265737360e81b606082015260800190565b60208082526036908201527f536166654465706f7369747353656e6465723a20546f6b656e7320616e6420616040820152750dadeeadce8e640d8cadccee8d040dad2e6dac2e8c6d60531b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602c908201527f536166654465706f7369747353656e6465723a205a65726f206164647265737360408201526b081b9bdd08185b1b1bddd95960a21b606082015260800190565b60208082526024908201527f536166654465706f7369747353656e6465723a204e6f7420656e6f7567682066604082015263756e647360e01b606082015260800190565b6000602082840312156126b257600080fd5b5051919050565b6000600182016126d957634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b838110156126fb5781810151838201526020016126e3565b50506000910152565b6000815180845261271c8160208601602086016126e0565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6002811061276457634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b038516815283602082015260806040820152600061278f6080830185612704565b9050611f4c6060830184612746565b6000602082840312156127b057600080fd5b8151801515811461228d57600080fd5b6001600160a01b03841681526020810183905260806040820181905260009082015260a081016120d56060830184612746565b60208082526032908201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860408201527132b1baba329029a7ab103a3930b739b332b960711b606082015260800190565b600082516128578184602087016126e0565b9190910192915050565b60208152600061228d602083018461270456fea264697066735822122079436df57107ad03a8a62cb0ffaabfeebb3ab9643ced815126b2474370014c4c64736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_depositor": "Address of the depositor account", + "_lockDrop": "Address of the BOB FusionLock contract", + "_safeAddress": "Address of the Gnosis Safe", + "_sovToken": "Address of the SOV token contract" + } + }, + "execTransactionFromSafe(address,uint256,bytes,uint8)": { + "params": { + "data": "Data payload of module transaction.", + "operation": "Operation type of module transaction.", + "to": "Destination address of module transaction.", + "value": "Ether value of module transaction." + }, + "returns": { + "success": "Boolean flag indicating if the call succeeded." + } + }, + "mapDepositorToReceiver(address)": { + "params": { + "receiver": "Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB" + } + }, + "sendToLockDropContract(address[],uint256[],uint256)": { + "details": "This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEXThe function is allowed to be called only by the lockdropDepositorAddressToken amounts and SOV amount to send are calculated offchain", + "params": { + "amounts": "List of amounts of tokens to send", + "sovAmount": "Amount of SOV tokens to send", + "tokens": "List of tokens to send" + } + }, + "setDepositorAddress(address)": { + "details": "Only Safe can call this functionNew depositor can be zero address", + "params": { + "_newDepositor": "New depositor address" + } + }, + "setLockDropAddress(address)": { + "details": "Only Safe can call this functionNew LockDrop can't be zero address", + "params": { + "_newLockdrop": "New depositor address" + } + }, + "withdraw(address[],uint256[],address)": { + "details": "Only Safe can call this functionRecipient should not be a zero address", + "params": { + "amounts": "List of token amounts to withdraw", + "recipient": "Recipient address", + "tokens": "List of token addresses to withdraw" + } + }, + "withdrawAll(address[],address)": { + "details": "Only Safe can call this functionRecipient should not be a zero address", + "params": { + "recipient": "Recipient address", + "tokens": "List of token addresses to withdraw" + } + } + }, + "title": "SafeDepositsSender", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "execTransactionFromSafe(address,uint256,bytes,uint8)": { + "notice": "Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe" + }, + "mapDepositorToReceiver(address)": { + "notice": "Maps depositor on ethereum to receiver on BOBReceiver from the last emitted event called by msg.sender will be used" + }, + "pause()": { + "notice": "pause the contract - no funds can be sent to the LockDrop contract" + }, + "sendToLockDropContract(address[],uint256[],uint256)": { + "notice": "Sends tokens to the LockDrop contract" + }, + "setDepositorAddress(address)": { + "notice": "Sets new depositor address" + }, + "setLockDropAddress(address)": { + "notice": "Sets new LockDrop address" + }, + "stop()": { + "notice": "stops the contract - no funds can be sent to the LockDrop contract, this is irreversible" + }, + "unpause()": { + "notice": "unpause the contract" + }, + "withdraw(address[],uint256[],address)": { + "notice": "Withdraws tokens from this contract to a recipient addressWithdrawal to the Safe address will affect balances and rewardsAmount > 0 should be checked by the caller before calling this function" + }, + "withdrawAll(address[],address)": { + "notice": "Withdraws all tokens from this contract to a recipientAmount > 0 should be checked by the caller before calling this functionWithdrawal to the Safe address will affect balances and rewards" + } + }, + "notice": "This contract is a gateway for depositing funds into the Bob locker contracts", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 865, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "lockdropDepositorAddress", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 867, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "lockDropAddress", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 869, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "stopBlock", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 871, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "paused", + "offset": 0, + "slot": "3", + "type": "t_bool" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployment/deployments/ethMainnet/solcInputs/b56b8eb6690792f979c902816cf00985.json b/deployment/deployments/ethMainnet/solcInputs/b56b8eb6690792f979c902816cf00985.json new file mode 100644 index 000000000..62abacd94 --- /dev/null +++ b/deployment/deployments/ethMainnet/solcInputs/b56b8eb6690792f979c902816cf00985.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n address private lockDropAddress;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n lockDropAddress = _lockDrop;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n lockDropAddress,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", lockDropAddress, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external onlyDepositorOrSafe {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\n lockDropAddress = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return lockDropAddress;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/ethMainnet/solcInputs/b6ccc7dc4fb34511b9d8d031557b3d58.json b/deployment/deployments/ethMainnet/solcInputs/b6ccc7dc4fb34511b9d8d031557b3d58.json new file mode 100644 index 000000000..e32fd851e --- /dev/null +++ b/deployment/deployments/ethMainnet/solcInputs/b6ccc7dc4fb34511b9d8d031557b3d58.json @@ -0,0 +1,55 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\nimport { SafeERC20, IERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n using SafeERC20 for IERC20;\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract\n address private lockDropAddress;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the BOB FusionLock contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n SOV_TOKEN_ADDRESS = _sovToken;\n lockdropDepositorAddress = _depositor;\n lockDropAddress = _lockDrop;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == lockdropDepositorAddress, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the lockdropDepositorAddress\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n uint256 transferAmount;\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough eth balance to deposit\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not deposit ether\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n transferAmount = balance < amounts[i] ? balance : amounts[i];\n if (transferAmount > 0) {\n require(\n SAFE.execTransactionFromModule(\n address(this),\n transferAmount,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not withdraw ether after deposit\"\n );\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\n }\n } else {\n // transfer ERC20 tokens\n IERC20 token = IERC20(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough tokens to deposit\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n lockDropAddress,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not deposit token\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n transferAmount = balance < amounts[i] ? balance : amounts[i];\n if (transferAmount > 0) {\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n transferAmount\n );\n require(\n SAFE.execTransactionFromModule(\n tokens[i],\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not withdraw token after deposit\"\n );\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\n }\n }\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", lockDropAddress, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /**\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\n * @param to Destination address of module transaction.\n * @param value Ether value of module transaction.\n * @param data Data payload of module transaction.\n * @param operation Operation type of module transaction.\n * @return success Boolean flag indicating if the call succeeded.\n */\n function execTransactionFromSafe(\n address to,\n uint256 value,\n bytes memory data,\n GnosisSafe.Operation operation\n ) external onlySafe returns (bool success) {\n success = execute(to, value, data, operation, type(uint256).max);\n }\n\n /**\n * @notice Executes either a delegatecall or a call with provided parameters.\n * @dev This method doesn't perform any sanity check of the transaction, such as:\n * - if the contract at `to` address has code or not\n * It is the responsibility of the caller to perform such checks.\n * @param to Destination address.\n * @param value Ether value.\n * @param data Data payload.\n * @param operation Operation type.\n * @return success boolean flag indicating if the call succeeded.\n */\n function execute(\n address to,\n uint256 value,\n bytes memory data,\n GnosisSafe.Operation operation,\n uint256 txGas\n ) internal returns (bool success) {\n if (operation == GnosisSafe.Operation.DelegateCall) {\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n /* solhint-enable no-inline-assembly */\n } else {\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n /* solhint-enable no-inline-assembly */\n }\n }\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor);\n lockdropDepositorAddress = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\n lockDropAddress = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20 token = IERC20(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.safeTransfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"SafeDepositsSender: Could not withdraw ether\");\n continue;\n }\n IERC20 token = IERC20(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.safeTransfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return lockDropAddress;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return lockdropDepositorAddress;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/ethSepoliaTestnet/.chainId b/deployment/deployments/ethSepoliaTestnet/.chainId new file mode 100644 index 000000000..bd8d1cd44 --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/.chainId @@ -0,0 +1 @@ +11155111 \ No newline at end of file diff --git a/deployment/deployments/ethSepoliaTestnet/MultiSigWallet.json b/deployment/deployments/ethSepoliaTestnet/MultiSigWallet.json new file mode 100644 index 000000000..df8fbd097 --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/MultiSigWallet.json @@ -0,0 +1,592 @@ +{ + "address": "0x010B1d4D75d840981906e04acDbbF51D47689DfA", + "abi": [ + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "_required", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Confirmation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Execution", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "ExecutionFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerAddition", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "OwnerRemoval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "required", + "type": "uint256" + } + ], + "name": "RequirementChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Revocation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Submission", + "type": "event" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_OWNER_COUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_required", + "type": "uint256" + } + ], + "name": "changeRequirement", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "confirmTransaction", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "confirmations", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "executeTransaction", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "getConfirmationCount", + "outputs": [ + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "getConfirmations", + "outputs": [ + { + "internalType": "address[]", + "name": "_confirmations", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "bool", + "name": "pending", + "type": "bool" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + } + ], + "name": "getTransactionCount", + "outputs": [ + { + "internalType": "uint256", + "name": "count", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "from", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "to", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "pending", + "type": "bool" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + } + ], + "name": "getTransactionIds", + "outputs": [ + { + "internalType": "uint256[]", + "name": "_transactionIds", + "type": "uint256[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "isConfirmed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "replaceOwner", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "required", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "name": "revokeConfirmation", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "submitTransaction", + "outputs": [ + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "transactionCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "transactions", + "outputs": [ + { + "internalType": "address", + "name": "destination", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bool", + "name": "executed", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ] +} diff --git a/deployment/deployments/ethSepoliaTestnet/SOV.json b/deployment/deployments/ethSepoliaTestnet/SOV.json new file mode 100644 index 000000000..35e6e51e5 --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/SOV.json @@ -0,0 +1,418 @@ +{ + "address": "0x3E610F32806e09C2Ba65b8c88A6E4f777c8Cb559", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_initialAmount", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "approveAndCall", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ] +} diff --git a/deployment/deployments/ethSepoliaTestnet/SafeDepositsSender.json b/deployment/deployments/ethSepoliaTestnet/SafeDepositsSender.json new file mode 100644 index 000000000..1dc77924c --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/SafeDepositsSender.json @@ -0,0 +1,643 @@ +{ + "address": "0x6138a1c3c2a419075E50f2C8A8600366D4105f8d", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_safeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockDrop", + "type": "address" + }, + { + "internalType": "address", + "name": "_sovToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_depositor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lockDrop", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositSOVToLockdrop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lockDrop", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositToLockdrop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "MapDepositorToReceiver", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldDepositor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newDepositor", + "type": "address" + } + ], + "name": "SetDepositorAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldLockDrop", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newLockDrop", + "type": "address" + } + ], + "name": "SetLockDropAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Stop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "name": "WithdrawBalanceFromSafe", + "type": "event" + }, + { + "inputs": [], + "name": "ETH_TOKEN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum GnosisSafe.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromSafe", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDepositorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLockDropAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSafeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSovTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStopBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isStopped", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "mapDepositorToReceiver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "sovAmount", + "type": "uint256" + } + ], + "name": "sendToLockDropContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newDepositor", + "type": "address" + } + ], + "name": "setDepositorAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newLockdrop", + "type": "address" + } + ], + "name": "setLockDropAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stop", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdrawAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x3d05387b947975b0b2fb26dbf2a8543fc5dea9a9d8659f748fc51508a090f4a8", + "receipt": { + "to": null, + "from": "0xCF311E7375083b9513566a47B9f3e93F1FcdCfBF", + "contractAddress": "0x6138a1c3c2a419075E50f2C8A8600366D4105f8d", + "transactionIndex": 19, + "gasUsed": "2352650", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x56c37436efe5799dc4213df72a605b57990f773ea3359acb2fb211652617d06e", + "transactionHash": "0x3d05387b947975b0b2fb26dbf2a8543fc5dea9a9d8659f748fc51508a090f4a8", + "logs": [], + "blockNumber": 5577011, + "cumulativeGasUsed": "4105874", + "status": 1, + "byzantium": true + }, + "args": [ + "0x064A379c959dB1Ed1318114E2363a6c8d103ADd3", + "0x007b3aa69a846cb1f76b60b3088230a52d2a83ac", + "0x3E610F32806e09C2Ba65b8c88A6E4f777c8Cb559", + "0x86de732721fffcdf163629c64e3925b5bf7f371a" + ], + "numDeployments": 4, + "solcInputHash": "b6ccc7dc4fb34511b9d8d031557b3d58", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_safeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lockDrop\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sovToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositor\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockDrop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositSOVToLockdrop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockDrop\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositToLockdrop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"MapDepositorToReceiver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldDepositor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newDepositor\",\"type\":\"address\"}],\"name\":\"SetDepositorAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldLockDrop\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newLockDrop\",\"type\":\"address\"}],\"name\":\"SetLockDropAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Stop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"WithdrawBalanceFromSafe\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ETH_TOKEN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum GnosisSafe.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockDropAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSafeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSovTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStopBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isStopped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"mapDepositorToReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sovAmount\",\"type\":\"uint256\"}],\"name\":\"sendToLockDropContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newDepositor\",\"type\":\"address\"}],\"name\":\"setDepositorAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newLockdrop\",\"type\":\"address\"}],\"name\":\"setLockDropAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_depositor\":\"Address of the depositor account\",\"_lockDrop\":\"Address of the BOB FusionLock contract\",\"_safeAddress\":\"Address of the Gnosis Safe\",\"_sovToken\":\"Address of the SOV token contract\"}},\"execTransactionFromSafe(address,uint256,bytes,uint8)\":{\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"},\"returns\":{\"success\":\"Boolean flag indicating if the call succeeded.\"}},\"mapDepositorToReceiver(address)\":{\"params\":{\"receiver\":\"Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\"}},\"sendToLockDropContract(address[],uint256[],uint256)\":{\"details\":\"This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEXThe function is allowed to be called only by the lockdropDepositorAddressToken amounts and SOV amount to send are calculated offchain\",\"params\":{\"amounts\":\"List of amounts of tokens to send\",\"sovAmount\":\"Amount of SOV tokens to send\",\"tokens\":\"List of tokens to send\"}},\"setDepositorAddress(address)\":{\"details\":\"Only Safe can call this functionNew depositor can be zero address\",\"params\":{\"_newDepositor\":\"New depositor address\"}},\"setLockDropAddress(address)\":{\"details\":\"Only Safe can call this functionNew LockDrop can't be zero address\",\"params\":{\"_newLockdrop\":\"New depositor address\"}},\"withdraw(address[],uint256[],address)\":{\"details\":\"Only Safe can call this functionRecipient should not be a zero address\",\"params\":{\"amounts\":\"List of token amounts to withdraw\",\"recipient\":\"Recipient address\",\"tokens\":\"List of token addresses to withdraw\"}},\"withdrawAll(address[],address)\":{\"details\":\"Only Safe can call this functionRecipient should not be a zero address\",\"params\":{\"recipient\":\"Recipient address\",\"tokens\":\"List of token addresses to withdraw\"}}},\"title\":\"SafeDepositsSender\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execTransactionFromSafe(address,uint256,bytes,uint8)\":{\"notice\":\"Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\"},\"mapDepositorToReceiver(address)\":{\"notice\":\"Maps depositor on ethereum to receiver on BOBReceiver from the last emitted event called by msg.sender will be used\"},\"pause()\":{\"notice\":\"pause the contract - no funds can be sent to the LockDrop contract\"},\"sendToLockDropContract(address[],uint256[],uint256)\":{\"notice\":\"Sends tokens to the LockDrop contract\"},\"setDepositorAddress(address)\":{\"notice\":\"Sets new depositor address\"},\"setLockDropAddress(address)\":{\"notice\":\"Sets new LockDrop address\"},\"stop()\":{\"notice\":\"stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\"},\"unpause()\":{\"notice\":\"unpause the contract\"},\"withdraw(address[],uint256[],address)\":{\"notice\":\"Withdraws tokens from this contract to a recipient addressWithdrawal to the Safe address will affect balances and rewardsAmount > 0 should be checked by the caller before calling this function\"},\"withdrawAll(address[],address)\":{\"notice\":\"Withdraws all tokens from this contract to a recipientAmount > 0 should be checked by the caller before calling this functionWithdrawal to the Safe address will affect balances and rewards\"}},\"notice\":\"This contract is a gateway for depositing funds into the Bob locker contracts\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/integrations/bob/SafeDepositsSender.sol\":\"SafeDepositsSender\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=contracts/\",\":ds-test/=foundry/lib/forge-std/lib/ds-test/src/\",\":forge-std/=foundry/lib/forge-std/src/\"]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n * doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n * token.safeTransferFrom(msg.sender, address(this), value);\\n * ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n *\\n * CAUTION: See Security Considerations above.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n * to be set to zero before setting it to a non-zero value, such as USDT.\\n */\\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"contracts/integrations/bob/SafeDepositsSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport { ISafeDepositsSender } from \\\"./interfaces/ISafeDepositsSender.sol\\\";\\nimport { SafeERC20, IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\ninterface GnosisSafe {\\n enum Operation {\\n Call,\\n DelegateCall\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Operation operation\\n ) external returns (bool success);\\n}\\n\\n/**\\n * @title SafeDepositsSender\\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\\n */\\ncontract SafeDepositsSender is ISafeDepositsSender {\\n using SafeERC20 for IERC20;\\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\\n GnosisSafe private immutable SAFE;\\n address private immutable SOV_TOKEN_ADDRESS;\\n address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract\\n address private lockDropAddress;\\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\\n bool private paused;\\n\\n /**\\n * @param _safeAddress Address of the Gnosis Safe\\n * @param _lockDrop Address of the BOB FusionLock contract\\n * @param _sovToken Address of the SOV token contract\\n * @param _depositor Address of the depositor account\\n */\\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\\n require(_safeAddress != address(0), \\\"SafeDepositsSender: Invalid safe address\\\");\\n require(_lockDrop != address(0), \\\"SafeDepositsSender: Invalid lockdrop address\\\");\\n require(_sovToken != address(0), \\\"SafeDepositsSender: Invalid sov token address\\\");\\n require(_depositor != address(0), \\\"SafeDepositsSender: Invalid depositor token address\\\");\\n SAFE = GnosisSafe(_safeAddress);\\n SOV_TOKEN_ADDRESS = _sovToken;\\n lockdropDepositorAddress = _depositor;\\n lockDropAddress = _lockDrop;\\n }\\n\\n receive() external payable {}\\n\\n // MODIFIERS //\\n\\n modifier onlySafe() {\\n require(msg.sender == address(SAFE), \\\"SafeDepositsSender: Only Safe\\\");\\n _;\\n }\\n\\n modifier onlyDepositor() {\\n require(msg.sender == lockdropDepositorAddress, \\\"SafeDepositsSender: Only Depositor\\\");\\n _;\\n }\\n\\n modifier onlyDepositorOrSafe() {\\n require(\\n msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE),\\n \\\"SafeDepositsSender: Only Depositor or Safe\\\"\\n );\\n _;\\n }\\n\\n modifier whenNotPaused() {\\n require(!paused, \\\"SafeDepositsSender: Paused\\\");\\n _;\\n }\\n\\n modifier whenPaused() {\\n require(paused, \\\"SafeDepositsSender: Not paused\\\");\\n _;\\n }\\n\\n modifier whenUnstopped() {\\n require(stopBlock == 0, \\\"SafeDepositsSender: Stopped\\\");\\n _;\\n }\\n\\n modifier notZeroAddress(address _address) {\\n require(_address != address(0), \\\"SafeDepositsSender: Invalid address\\\");\\n _;\\n }\\n\\n // CORE FUNCTIONS\\n\\n /**\\n * @notice Sends tokens to the LockDrop contract\\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\\n * @dev The function is allowed to be called only by the lockdropDepositorAddress\\n * @dev Token amounts and SOV amount to send are calculated offchain\\n * @param tokens List of tokens to send\\n * @param amounts List of amounts of tokens to send\\n * @param sovAmount Amount of SOV tokens to send\\n */\\n function sendToLockDropContract(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n uint256 sovAmount\\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\\n require(\\n tokens.length == amounts.length,\\n \\\"SafeDepositsSender: Tokens and amounts length mismatch\\\"\\n );\\n require(sovAmount > 0, \\\"SafeDepositsSender: Invalid SOV amount\\\");\\n\\n bytes memory data;\\n\\n for (uint256 i = 0; i < tokens.length; i++) {\\n require(\\n tokens[i] != SOV_TOKEN_ADDRESS,\\n \\\"SafeDepositsSender: SOV token is transferred separately\\\"\\n );\\n\\n // transfer native token\\n uint256 balance;\\n uint256 transferAmount;\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n require(\\n address(SAFE).balance >= amounts[i],\\n \\\"SafeDepositsSender: Not enough eth balance to deposit\\\"\\n );\\n data = abi.encodeWithSignature(\\\"depositEth()\\\");\\n require(\\n SAFE.execTransactionFromModule(\\n lockDropAddress,\\n amounts[i],\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not deposit ether\\\"\\n );\\n\\n // withdraw balance to this contract left after deposit to the LockDrop\\n balance = address(SAFE).balance;\\n transferAmount = balance < amounts[i] ? balance : amounts[i];\\n if (transferAmount > 0) {\\n require(\\n SAFE.execTransactionFromModule(\\n address(this),\\n transferAmount,\\n \\\"\\\",\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not withdraw ether after deposit\\\"\\n );\\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\\n }\\n } else {\\n // transfer ERC20 tokens\\n IERC20 token = IERC20(tokens[i]);\\n balance = token.balanceOf(address(SAFE));\\n require(balance >= amounts[i], \\\"SafeDepositsSender: Not enough tokens to deposit\\\");\\n\\n data = abi.encodeWithSignature(\\n \\\"approve(address,uint256)\\\",\\n lockDropAddress,\\n amounts[i]\\n );\\n require(\\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not approve token transfer\\\"\\n );\\n\\n data = abi.encodeWithSignature(\\n \\\"depositERC20(address,uint256)\\\",\\n tokens[i],\\n amounts[i]\\n );\\n require(\\n SAFE.execTransactionFromModule(\\n lockDropAddress,\\n 0,\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not deposit token\\\"\\n );\\n\\n // withdraw balance to this contract left after deposit to the LockDrop\\n balance = token.balanceOf(address(SAFE));\\n transferAmount = balance < amounts[i] ? balance : amounts[i];\\n if (transferAmount > 0) {\\n data = abi.encodeWithSignature(\\n \\\"transfer(address,uint256)\\\",\\n address(this),\\n transferAmount\\n );\\n require(\\n SAFE.execTransactionFromModule(\\n tokens[i],\\n 0,\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not withdraw token after deposit\\\"\\n );\\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\\n }\\n }\\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\\n }\\n\\n // transfer SOV\\n data = abi.encodeWithSignature(\\\"approve(address,uint256)\\\", lockDropAddress, sovAmount);\\n require(\\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not execute SOV transfer\\\"\\n );\\n data = abi.encodeWithSignature(\\n \\\"depositERC20(address,uint256)\\\",\\n SOV_TOKEN_ADDRESS,\\n sovAmount\\n );\\n require(\\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not execute SOV transfer\\\"\\n );\\n\\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\\n }\\n\\n /// @notice Maps depositor on ethereum to receiver on BOB\\n /// @notice Receiver from the last emitted event called by msg.sender will be used\\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\\n function mapDepositorToReceiver(address receiver) external {\\n emit MapDepositorToReceiver(msg.sender, receiver);\\n }\\n\\n // ADMINISTRATIVE FUNCTIONS //\\n\\n /**\\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\\n * @param to Destination address of module transaction.\\n * @param value Ether value of module transaction.\\n * @param data Data payload of module transaction.\\n * @param operation Operation type of module transaction.\\n * @return success Boolean flag indicating if the call succeeded.\\n */\\n function execTransactionFromSafe(\\n address to,\\n uint256 value,\\n bytes memory data,\\n GnosisSafe.Operation operation\\n ) external onlySafe returns (bool success) {\\n success = execute(to, value, data, operation, type(uint256).max);\\n }\\n\\n /**\\n * @notice Executes either a delegatecall or a call with provided parameters.\\n * @dev This method doesn't perform any sanity check of the transaction, such as:\\n * - if the contract at `to` address has code or not\\n * It is the responsibility of the caller to perform such checks.\\n * @param to Destination address.\\n * @param value Ether value.\\n * @param data Data payload.\\n * @param operation Operation type.\\n * @return success boolean flag indicating if the call succeeded.\\n */\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n GnosisSafe.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == GnosisSafe.Operation.DelegateCall) {\\n /* solhint-disable no-inline-assembly */\\n /// @solidity memory-safe-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n /* solhint-enable no-inline-assembly */\\n } else {\\n /* solhint-disable no-inline-assembly */\\n /// @solidity memory-safe-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n /* solhint-enable no-inline-assembly */\\n }\\n }\\n\\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\\n\\n /**\\n * @notice Sets new depositor address\\n * @dev Only Safe can call this function\\n * @dev New depositor can be zero address\\n * @param _newDepositor New depositor address\\n */\\n function setDepositorAddress(address _newDepositor) external onlySafe {\\n emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor);\\n lockdropDepositorAddress = _newDepositor;\\n }\\n\\n /**\\n * @notice Sets new LockDrop address\\n * @dev Only Safe can call this function\\n * @dev New LockDrop can't be zero address\\n * @param _newLockdrop New depositor address\\n */\\n function setLockDropAddress(address _newLockdrop) external onlySafe {\\n require(_newLockdrop != address(0), \\\"SafeDepositsSender: Zero address not allowed\\\");\\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\\n lockDropAddress = _newLockdrop;\\n }\\n\\n /**\\n * @notice Withdraws tokens from this contract to a recipient address\\n * @notice Withdrawal to the Safe address will affect balances and rewards\\n * @notice Amount > 0 should be checked by the caller before calling this function\\n * @dev Only Safe can call this function\\n * @dev Recipient should not be a zero address\\n * @param tokens List of token addresses to withdraw\\n * @param amounts List of token amounts to withdraw\\n * @param recipient Recipient address\\n */\\n function withdraw(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n address recipient\\n ) external onlySafe notZeroAddress(recipient) {\\n require(\\n tokens.length == amounts.length,\\n \\\"SafeDepositsSender: Tokens and amounts length mismatch\\\"\\n );\\n\\n for (uint256 i = 0; i < tokens.length; i++) {\\n require(tokens[i] != address(0x00), \\\"SafeDepositsSender: Zero address not allowed\\\");\\n require(amounts[i] != 0, \\\"SafeDepositsSender: Zero amount not allowed\\\");\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n require(\\n address(this).balance >= amounts[i],\\n \\\"SafeDepositsSender: Not enough funds\\\"\\n );\\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\\\"\\\");\\n require(success, \\\"Could not withdraw ether\\\");\\n continue;\\n }\\n\\n IERC20 token = IERC20(tokens[i]);\\n uint256 balance = token.balanceOf(address(this));\\n require(balance >= amounts[i], \\\"SafeDepositsSender: Not enough funds\\\");\\n\\n token.safeTransfer(recipient, amounts[i]);\\n\\n emit Withdraw(recipient, tokens[i], amounts[i]);\\n }\\n }\\n\\n /**\\n * @notice Withdraws all tokens from this contract to a recipient\\n * @notice Amount > 0 should be checked by the caller before calling this function\\n * @dev Only Safe can call this function\\n * @dev Recipient should not be a zero address\\n * @notice Withdrawal to the Safe address will affect balances and rewards\\n * @param tokens List of token addresses to withdraw\\n * @param recipient Recipient address\\n */\\n function withdrawAll(\\n address[] calldata tokens,\\n address recipient\\n ) external onlySafe notZeroAddress(recipient) {\\n for (uint256 i = 0; i < tokens.length; i++) {\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\\\"\\\");\\n require(success, \\\"SafeDepositsSender: Could not withdraw ether\\\");\\n continue;\\n }\\n IERC20 token = IERC20(tokens[i]);\\n uint256 balance = token.balanceOf(address(this));\\n if (balance > 0) {\\n token.safeTransfer(recipient, balance);\\n }\\n\\n emit Withdraw(recipient, tokens[i], balance);\\n }\\n }\\n\\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\\n function pause() external onlySafe whenNotPaused {\\n paused = true;\\n emit Pause();\\n }\\n\\n /// @notice unpause the contract\\n function unpause() external onlySafe whenPaused {\\n paused = false;\\n emit Unpause();\\n }\\n\\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\\n function stop() external onlySafe {\\n stopBlock = block.number;\\n emit Stop();\\n }\\n\\n // GETTERS //\\n function getSafeAddress() external view returns (address) {\\n return address(SAFE);\\n }\\n\\n function getLockDropAddress() external view returns (address) {\\n return lockDropAddress;\\n }\\n\\n function getSovTokenAddress() external view returns (address) {\\n return SOV_TOKEN_ADDRESS;\\n }\\n\\n function getDepositorAddress() external view returns (address) {\\n return lockdropDepositorAddress;\\n }\\n\\n function isStopped() external view returns (bool) {\\n return stopBlock != 0;\\n }\\n\\n function getStopBlock() external view returns (uint256) {\\n return stopBlock;\\n }\\n\\n function isPaused() external view returns (bool) {\\n return paused;\\n }\\n}\\n\",\"keccak256\":\"0x7b0054d143e6643b8f9e17cf4fe8d931a16012bdbdc8f0cd70c6db441ee4273d\",\"license\":\"MIT\"},\"contracts/integrations/bob/interfaces/ISafeDepositsSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\ninterface ISafeDepositsSender {\\n event Withdraw(address indexed from, address indexed token, uint256 amount);\\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\\n event Pause();\\n event Unpause();\\n event Stop();\\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\\n\\n function getSafeAddress() external view returns (address);\\n function getLockDropAddress() external view returns (address);\\n function getSovTokenAddress() external view returns (address);\\n function getDepositorAddress() external view returns (address);\\n function isStopped() external view returns (bool);\\n function isPaused() external view returns (bool);\\n\\n // @note amount > 0 should be checked by the caller\\n function withdraw(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n address recipient\\n ) external;\\n\\n function withdrawAll(address[] calldata tokens, address recipient) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function stop() external;\\n\\n function setDepositorAddress(address _newDepositor) external;\\n\\n function sendToLockDropContract(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n uint256 sovAmount\\n ) external;\\n}\\n\",\"keccak256\":\"0xb80080b92446a1edc1a9f4ed3576ffea3df483aaff33b33a2d2168212f7d2812\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162002c2238038062002c22833981016040819052620000349162000254565b6001600160a01b038416620000a15760405162461bcd60e51b815260206004820152602860248201527f536166654465706f7369747353656e6465723a20496e76616c69642073616665604482015267206164647265737360c01b60648201526084015b60405180910390fd5b6001600160a01b0383166200010e5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20496e76616c6964206c6f636b60448201526b64726f70206164647265737360a01b606482015260840162000098565b6001600160a01b0382166200017c5760405162461bcd60e51b815260206004820152602d60248201527f536166654465706f7369747353656e6465723a20496e76616c696420736f762060448201526c746f6b656e206164647265737360981b606482015260840162000098565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152603360248201527f536166654465706f7369747353656e6465723a20496e76616c6964206465706f60448201527f7369746f7220746f6b656e206164647265737300000000000000000000000000606482015260840162000098565b6001600160a01b0393841660805290831660a052600080549184166001600160a01b031992831617905560018054929093169116179055620002b1565b80516001600160a01b03811681146200024f57600080fd5b919050565b600080600080608085870312156200026b57600080fd5b620002768562000237565b9350620002866020860162000237565b9250620002966040860162000237565b9150620002a66060860162000237565b905092959194509250565b60805160a0516128aa620003786000396000818161022701528181610f2a01528181611c330152611cce015260008181610305015281816103720152818161042b0152818161086f01528181610b2001528181610bef01528181610c9201528181610d790152818161104a0152818161111801528181611221015281816112aa01528181611448015281816115ba01528181611779015281816118700152818161197501528181611c0601528181611d4301528181611e340152611f0001526128aa6000f3fe60806040526004361061010d5760003560e01c80635d9dac1011610095578063b187bd2611610064578063b187bd26146102be578063b6e7377d146102d6578063d17b8f98146102f6578063d7c3e7b314610329578063f5f52e2e1461034957600080fd5b80635d9dac101461024b578063813ddbf41461026b5780638456cb5914610289578063af0776521461029e57600080fd5b8063397a079b116100dc578063397a079b146101a25780633f4ba83a146101c25780633f683b6a146101d75780634768b497146101fa5780634bcfe7261461021857600080fd5b806307da68f5146101195780631878d1f1146101305780631d1372e41461016257806326f915061461018257600080fd5b3661011457005b600080fd5b34801561012557600080fd5b5061012e610367565b005b34801561013c57600080fd5b50610145600181565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012e61017d366004612272565b6103e7565b34801561018e57600080fd5b5061012e61019d3660046122e0565b610420565b3480156101ae57600080fd5b5061012e6101bd366004612361565b610864565b3480156101ce57600080fd5b5061012e610b15565b3480156101e357600080fd5b5060025415155b6040519015158152602001610159565b34801561020657600080fd5b506000546001600160a01b0316610145565b34801561022457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561025757600080fd5b5061012e610266366004612272565b610be4565b34801561027757600080fd5b506001546001600160a01b0316610145565b34801561029557600080fd5b5061012e610c87565b3480156102aa57600080fd5b5061012e6102b93660046123b5565b610d5a565b3480156102ca57600080fd5b5060035460ff166101ea565b3480156102e257600080fd5b5061012e6102f1366004612272565b611e29565b34801561030257600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561033557600080fd5b506101ea61034436600461244e565b611ef3565b34801561035557600080fd5b50600254604051908152602001610159565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b85760405162461bcd60e51b81526004016103af9061252a565b60405180910390fd5b436002556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b90600090a1565b6040516001600160a01b0382169033907f256f07b5eef8212c06c8cbb78abeb76d2b66770a68e81686fd14c3a0454551e190600090a350565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104685760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b03811661048f5760405162461bcd60e51b81526004016103af90612561565b8483146104ae5760405162461bcd60e51b81526004016103af906125a4565b60005b8581101561085b5760008787838181106104cd576104cd6125fa565b90506020020160208101906104e29190612272565b6001600160a01b0316036105085760405162461bcd60e51b81526004016103af90612610565b84848281811061051a5761051a6125fa565b905060200201356000036105845760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a205a65726f20616d6f756e742060448201526a1b9bdd08185b1b1bddd95960aa1b60648201526084016103af565b6001878783818110610598576105986125fa565b90506020020160208101906105ad9190612272565b6001600160a01b0316036106b4578484828181106105cd576105cd6125fa565b905060200201354710156105f35760405162461bcd60e51b81526004016103af9061265c565b6000836001600160a01b0316868684818110610611576106116125fa565b9050602002013560405160006040518083038185875af1925050503d8060008114610658576040519150601f19603f3d011682016040523d82523d6000602084013e61065d565b606091505b50509050806106ae5760405162461bcd60e51b815260206004820152601860248201527f436f756c64206e6f74207769746864726177206574686572000000000000000060448201526064016103af565b50610849565b60008787838181106106c8576106c86125fa565b90506020020160208101906106dd9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b91906126a0565b905086868481811061075f5761075f6125fa565b905060200201358110156107855760405162461bcd60e51b81526004016103af9061265c565b6107bb8588888681811061079b5761079b6125fa565b90506020020135846001600160a01b0316611f559092919063ffffffff16565b8888848181106107cd576107cd6125fa565b90506020020160208101906107e29190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb898987818110610828576108286125fa565b9050602002013560405161083e91815260200190565b60405180910390a350505b80610853816126b9565b9150506104b1565b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ac5760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b0381166108d35760405162461bcd60e51b81526004016103af90612561565b60005b83811015610b0e5760018585838181106108f2576108f26125fa565b90506020020160208101906109079190612272565b6001600160a01b0316036109d3576000836001600160a01b03164760405160006040518083038185875af1925050503d8060008114610962576040519150601f19603f3d011682016040523d82523d6000602084013e610967565b606091505b50509050806109cd5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201526b3a34323930bb9032ba3432b960a11b60648201526084016103af565b50610afc565b60008585838181106109e7576109e76125fa565b90506020020160208101906109fc9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a91906126a0565b90508015610a8657610a866001600160a01b0383168683611f55565b868684818110610a9857610a986125fa565b9050602002016020810190610aad9190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83604051610af191815260200190565b60405180910390a350505b80610b06816126b9565b9150506108d6565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b5d5760405162461bcd60e51b81526004016103af9061252a565b60035460ff16610baf5760405162461bcd60e51b815260206004820152601e60248201527f536166654465706f7369747353656e6465723a204e6f7420706175736564000060448201526064016103af565b6003805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c2c5760405162461bcd60e51b81526004016103af9061252a565b600080546040516001600160a01b03808516939216917fad63b85612b3c457488f5a3a8fe770cdb830f4a4c74ed076937f49c50ca6a82091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ccf5760405162461bcd60e51b81526004016103af9061252a565b60035460ff1615610d225760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b6003805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000546001600160a01b0316331480610d9b5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610dfa5760405162461bcd60e51b815260206004820152602a60248201527f536166654465706f7369747353656e6465723a204f6e6c79204465706f7369746044820152696f72206f72205361666560b01b60648201526084016103af565b60035460ff1615610e4d5760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b60025415610e9d5760405162461bcd60e51b815260206004820152601b60248201527f536166654465706f7369747353656e6465723a2053746f70706564000000000060448201526064016103af565b838214610ebc5760405162461bcd60e51b81526004016103af906125a4565b60008111610f1b5760405162461bcd60e51b815260206004820152602660248201527f536166654465706f7369747353656e6465723a20496e76616c696420534f5620604482015265185b5bdd5b9d60d21b60648201526084016103af565b606060005b85811015611ba3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878783818110610f6457610f646125fa565b9050602002016020810190610f799190612272565b6001600160a01b031603610ff55760405162461bcd60e51b815260206004820152603760248201527f536166654465706f7369747353656e6465723a20534f5620746f6b656e20697360448201527f207472616e736665727265642073657061726174656c7900000000000000000060648201526084016103af565b600080600189898581811061100c5761100c6125fa565b90506020020160208101906110219190612272565b6001600160a01b03160361140857868684818110611041576110416125fa565b905060200201357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163110156110df5760405162461bcd60e51b815260206004820152603560248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f75676820656044820152741d1a0818985b185b98d9481d1bc819195c1bdcda5d605a1b60648201526084016103af565b6040805160048152602481019091526020810180516001600160e01b031663439370b160e01b1790526001549094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163468721a79116898987818110611153576111536125fa565b905060200201358760006040518563ffffffff1660e01b815260040161117c9493929190612768565b6020604051808303816000875af115801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf919061279e565b61121f5760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba1032ba3432b960a91b60648201526084016103af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031631915086868481811061125e5761125e6125fa565b9050602002013582106112895786868481811061127d5761127d6125fa565b9050602002013561128b565b815b905080156114035760405163468721a760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a7906112e490309085906000906004016127c0565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611327919061279e565b6113995760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f746864726177206574686572206166746572206465706f73697400000000000060648201526084016103af565b8888848181106113ab576113ab6125fa565b90506020020160208101906113c09190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b692826040516113fa91815260200190565b60405180910390a25b611b06565b600089898581811061141c5761141c6125fa565b90506020020160208101906114319190612272565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919250908216906370a0823190602401602060405180830381865afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf91906126a0565b92508787858181106114d3576114d36125fa565b905060200201358310156115425760405162461bcd60e51b815260206004820152603060248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f756768207460448201526f1bdad95b9cc81d1bc819195c1bdcda5d60821b60648201526084016103af565b6001546001600160a01b0316888886818110611560576115606125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106115f1576115f16125fa565b90506020020160208101906116069190612272565b60008860006040518563ffffffff1660e01b815260040161162a9493929190612768565b6020604051808303816000875af1158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d919061279e565b6116d65760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f74206170604482015273383937bb32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b8989858181106116e8576116e86125fa565b90506020020160208101906116fd9190612272565b88888681811061170f5761170f6125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529196506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a7926117b69216906000908a908290600401612768565b6020604051808303816000875af11580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f9919061279e565b6118595760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba103a37b5b2b760a91b60648201526084016103af565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528216906370a0823190602401602060405180830381865afa1580156118bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e391906126a0565b92508787858181106118f7576118f76125fa565b90506020020135831061192257878785818110611916576119166125fa565b90506020020135611924565b825b91508115611b04576040513060248201526044810183905260640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106119ac576119ac6125fa565b90506020020160208101906119c19190612272565b60008860006040518563ffffffff1660e01b81526004016119e59493929190612768565b6020604051808303816000875af1158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a28919061279e565b611a9a5760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f74686472617720746f6b656e206166746572206465706f73697400000000000060648201526084016103af565b898985818110611aac57611aac6125fa565b9050602002016020810190611ac19190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b69283604051611afb91815260200190565b60405180910390a25b505b888884818110611b1857611b186125fa565b9050602002016020810190611b2d9190612272565b6001546001600160a01b0391821691167f83e351ace74af42916cc159bb2c353842d1fe21125f26f3ab645aeac206b663c898987818110611b7057611b706125fa565b90506020020135604051611b8691815260200190565b60405180910390a350508080611b9b906126b9565b915050610f20565b506001546040516001600160a01b0390911660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b1790525163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a790611c62907f00000000000000000000000000000000000000000000000000000000000000009060009086908290600401612768565b6020604051808303816000875af1158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca5919061279e565b611cc15760405162461bcd60e51b81526004016103af906127f3565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a792611d8092169060009086908290600401612768565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc3919061279e565b611ddf5760405162461bcd60e51b81526004016103af906127f3565b6001546040518381526001600160a01b03909116907fece2604abb1c0d8f143c1c8961c88ecda8a2c7b650545e98255665063e7321859060200160405180910390a2505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e715760405162461bcd60e51b81526004016103af9061252a565b6001600160a01b038116611e975760405162461bcd60e51b81526004016103af90612610565b6001546040516001600160a01b038084169216907f571b0cfddc37eea7ea50ec6529f701f4c53e523eb459eb1238fb38a16fee9d4490600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611f3d5760405162461bcd60e51b81526004016103af9061252a565b611f4c85858585600019611fac565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611fa7908490611ff1565b505050565b60006001836001811115611fc257611fc2612730565b03611fda576000808551602087018986f49050611f4c565b600080855160208701888a87f19695505050505050565b6000612046826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120c69092919063ffffffff16565b9050805160001480612067575080806020019051810190612067919061279e565b611fa75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103af565b60606120d584846000856120dd565b949350505050565b60608247101561213e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103af565b600080866001600160a01b0316858760405161215a9190612845565b60006040518083038185875af1925050503d8060008114612197576040519150601f19603f3d011682016040523d82523d6000602084013e61219c565b606091505b50915091506121ad878383876121b8565b979650505050505050565b60608315612227578251600003612220576001600160a01b0385163b6122205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103af565b50816120d5565b6120d5838381511561223c5781518083602001fd5b8060405162461bcd60e51b81526004016103af9190612861565b80356001600160a01b038116811461226d57600080fd5b919050565b60006020828403121561228457600080fd5b61228d82612256565b9392505050565b60008083601f8401126122a657600080fd5b50813567ffffffffffffffff8111156122be57600080fd5b6020830191508360208260051b85010111156122d957600080fd5b9250929050565b6000806000806000606086880312156122f857600080fd5b853567ffffffffffffffff8082111561231057600080fd5b61231c89838a01612294565b9097509550602088013591508082111561233557600080fd5b5061234288828901612294565b9094509250612355905060408701612256565b90509295509295909350565b60008060006040848603121561237657600080fd5b833567ffffffffffffffff81111561238d57600080fd5b61239986828701612294565b90945092506123ac905060208501612256565b90509250925092565b6000806000806000606086880312156123cd57600080fd5b853567ffffffffffffffff808211156123e557600080fd5b6123f189838a01612294565b9097509550602088013591508082111561240a57600080fd5b5061241788828901612294565b96999598509660400135949350505050565b634e487b7160e01b600052604160045260246000fd5b80356002811061226d57600080fd5b6000806000806080858703121561246457600080fd5b61246d85612256565b935060208501359250604085013567ffffffffffffffff8082111561249157600080fd5b818701915087601f8301126124a557600080fd5b8135818111156124b7576124b7612429565b604051601f8201601f19908116603f011681019083821181831017156124df576124df612429565b816040528281528a60208487010111156124f857600080fd5b82602086016020830137600060208483010152809650505050505061251f6060860161243f565b905092959194509250565b6020808252601d908201527f536166654465706f7369747353656e6465723a204f6e6c792053616665000000604082015260600190565b60208082526023908201527f536166654465706f7369747353656e6465723a20496e76616c6964206164647260408201526265737360e81b606082015260800190565b60208082526036908201527f536166654465706f7369747353656e6465723a20546f6b656e7320616e6420616040820152750dadeeadce8e640d8cadccee8d040dad2e6dac2e8c6d60531b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602c908201527f536166654465706f7369747353656e6465723a205a65726f206164647265737360408201526b081b9bdd08185b1b1bddd95960a21b606082015260800190565b60208082526024908201527f536166654465706f7369747353656e6465723a204e6f7420656e6f7567682066604082015263756e647360e01b606082015260800190565b6000602082840312156126b257600080fd5b5051919050565b6000600182016126d957634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b838110156126fb5781810151838201526020016126e3565b50506000910152565b6000815180845261271c8160208601602086016126e0565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6002811061276457634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b038516815283602082015260806040820152600061278f6080830185612704565b9050611f4c6060830184612746565b6000602082840312156127b057600080fd5b8151801515811461228d57600080fd5b6001600160a01b03841681526020810183905260806040820181905260009082015260a081016120d56060830184612746565b60208082526032908201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860408201527132b1baba329029a7ab103a3930b739b332b960711b606082015260800190565b600082516128578184602087016126e0565b9190910192915050565b60208152600061228d602083018461270456fea264697066735822122079436df57107ad03a8a62cb0ffaabfeebb3ab9643ced815126b2474370014c4c64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061010d5760003560e01c80635d9dac1011610095578063b187bd2611610064578063b187bd26146102be578063b6e7377d146102d6578063d17b8f98146102f6578063d7c3e7b314610329578063f5f52e2e1461034957600080fd5b80635d9dac101461024b578063813ddbf41461026b5780638456cb5914610289578063af0776521461029e57600080fd5b8063397a079b116100dc578063397a079b146101a25780633f4ba83a146101c25780633f683b6a146101d75780634768b497146101fa5780634bcfe7261461021857600080fd5b806307da68f5146101195780631878d1f1146101305780631d1372e41461016257806326f915061461018257600080fd5b3661011457005b600080fd5b34801561012557600080fd5b5061012e610367565b005b34801561013c57600080fd5b50610145600181565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012e61017d366004612272565b6103e7565b34801561018e57600080fd5b5061012e61019d3660046122e0565b610420565b3480156101ae57600080fd5b5061012e6101bd366004612361565b610864565b3480156101ce57600080fd5b5061012e610b15565b3480156101e357600080fd5b5060025415155b6040519015158152602001610159565b34801561020657600080fd5b506000546001600160a01b0316610145565b34801561022457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561025757600080fd5b5061012e610266366004612272565b610be4565b34801561027757600080fd5b506001546001600160a01b0316610145565b34801561029557600080fd5b5061012e610c87565b3480156102aa57600080fd5b5061012e6102b93660046123b5565b610d5a565b3480156102ca57600080fd5b5060035460ff166101ea565b3480156102e257600080fd5b5061012e6102f1366004612272565b611e29565b34801561030257600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561033557600080fd5b506101ea61034436600461244e565b611ef3565b34801561035557600080fd5b50600254604051908152602001610159565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b85760405162461bcd60e51b81526004016103af9061252a565b60405180910390fd5b436002556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b90600090a1565b6040516001600160a01b0382169033907f256f07b5eef8212c06c8cbb78abeb76d2b66770a68e81686fd14c3a0454551e190600090a350565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104685760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b03811661048f5760405162461bcd60e51b81526004016103af90612561565b8483146104ae5760405162461bcd60e51b81526004016103af906125a4565b60005b8581101561085b5760008787838181106104cd576104cd6125fa565b90506020020160208101906104e29190612272565b6001600160a01b0316036105085760405162461bcd60e51b81526004016103af90612610565b84848281811061051a5761051a6125fa565b905060200201356000036105845760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a205a65726f20616d6f756e742060448201526a1b9bdd08185b1b1bddd95960aa1b60648201526084016103af565b6001878783818110610598576105986125fa565b90506020020160208101906105ad9190612272565b6001600160a01b0316036106b4578484828181106105cd576105cd6125fa565b905060200201354710156105f35760405162461bcd60e51b81526004016103af9061265c565b6000836001600160a01b0316868684818110610611576106116125fa565b9050602002013560405160006040518083038185875af1925050503d8060008114610658576040519150601f19603f3d011682016040523d82523d6000602084013e61065d565b606091505b50509050806106ae5760405162461bcd60e51b815260206004820152601860248201527f436f756c64206e6f74207769746864726177206574686572000000000000000060448201526064016103af565b50610849565b60008787838181106106c8576106c86125fa565b90506020020160208101906106dd9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074b91906126a0565b905086868481811061075f5761075f6125fa565b905060200201358110156107855760405162461bcd60e51b81526004016103af9061265c565b6107bb8588888681811061079b5761079b6125fa565b90506020020135846001600160a01b0316611f559092919063ffffffff16565b8888848181106107cd576107cd6125fa565b90506020020160208101906107e29190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb898987818110610828576108286125fa565b9050602002013560405161083e91815260200190565b60405180910390a350505b80610853816126b9565b9150506104b1565b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ac5760405162461bcd60e51b81526004016103af9061252a565b806001600160a01b0381166108d35760405162461bcd60e51b81526004016103af90612561565b60005b83811015610b0e5760018585838181106108f2576108f26125fa565b90506020020160208101906109079190612272565b6001600160a01b0316036109d3576000836001600160a01b03164760405160006040518083038185875af1925050503d8060008114610962576040519150601f19603f3d011682016040523d82523d6000602084013e610967565b606091505b50509050806109cd5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201526b3a34323930bb9032ba3432b960a11b60648201526084016103af565b50610afc565b60008585838181106109e7576109e76125fa565b90506020020160208101906109fc9190612272565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a91906126a0565b90508015610a8657610a866001600160a01b0383168683611f55565b868684818110610a9857610a986125fa565b9050602002016020810190610aad9190612272565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83604051610af191815260200190565b60405180910390a350505b80610b06816126b9565b9150506108d6565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b5d5760405162461bcd60e51b81526004016103af9061252a565b60035460ff16610baf5760405162461bcd60e51b815260206004820152601e60248201527f536166654465706f7369747353656e6465723a204e6f7420706175736564000060448201526064016103af565b6003805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c2c5760405162461bcd60e51b81526004016103af9061252a565b600080546040516001600160a01b03808516939216917fad63b85612b3c457488f5a3a8fe770cdb830f4a4c74ed076937f49c50ca6a82091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ccf5760405162461bcd60e51b81526004016103af9061252a565b60035460ff1615610d225760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b6003805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000546001600160a01b0316331480610d9b5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610dfa5760405162461bcd60e51b815260206004820152602a60248201527f536166654465706f7369747353656e6465723a204f6e6c79204465706f7369746044820152696f72206f72205361666560b01b60648201526084016103af565b60035460ff1615610e4d5760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b60025415610e9d5760405162461bcd60e51b815260206004820152601b60248201527f536166654465706f7369747353656e6465723a2053746f70706564000000000060448201526064016103af565b838214610ebc5760405162461bcd60e51b81526004016103af906125a4565b60008111610f1b5760405162461bcd60e51b815260206004820152602660248201527f536166654465706f7369747353656e6465723a20496e76616c696420534f5620604482015265185b5bdd5b9d60d21b60648201526084016103af565b606060005b85811015611ba3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878783818110610f6457610f646125fa565b9050602002016020810190610f799190612272565b6001600160a01b031603610ff55760405162461bcd60e51b815260206004820152603760248201527f536166654465706f7369747353656e6465723a20534f5620746f6b656e20697360448201527f207472616e736665727265642073657061726174656c7900000000000000000060648201526084016103af565b600080600189898581811061100c5761100c6125fa565b90506020020160208101906110219190612272565b6001600160a01b03160361140857868684818110611041576110416125fa565b905060200201357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163110156110df5760405162461bcd60e51b815260206004820152603560248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f75676820656044820152741d1a0818985b185b98d9481d1bc819195c1bdcda5d605a1b60648201526084016103af565b6040805160048152602481019091526020810180516001600160e01b031663439370b160e01b1790526001549094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163468721a79116898987818110611153576111536125fa565b905060200201358760006040518563ffffffff1660e01b815260040161117c9493929190612768565b6020604051808303816000875af115801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf919061279e565b61121f5760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba1032ba3432b960a91b60648201526084016103af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031631915086868481811061125e5761125e6125fa565b9050602002013582106112895786868481811061127d5761127d6125fa565b9050602002013561128b565b815b905080156114035760405163468721a760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a7906112e490309085906000906004016127c0565b6020604051808303816000875af1158015611303573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611327919061279e565b6113995760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f746864726177206574686572206166746572206465706f73697400000000000060648201526084016103af565b8888848181106113ab576113ab6125fa565b90506020020160208101906113c09190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b692826040516113fa91815260200190565b60405180910390a25b611b06565b600089898581811061141c5761141c6125fa565b90506020020160208101906114319190612272565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919250908216906370a0823190602401602060405180830381865afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf91906126a0565b92508787858181106114d3576114d36125fa565b905060200201358310156115425760405162461bcd60e51b815260206004820152603060248201527f536166654465706f7369747353656e6465723a204e6f7420656e6f756768207460448201526f1bdad95b9cc81d1bc819195c1bdcda5d60821b60648201526084016103af565b6001546001600160a01b0316888886818110611560576115606125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106115f1576115f16125fa565b90506020020160208101906116069190612272565b60008860006040518563ffffffff1660e01b815260040161162a9493929190612768565b6020604051808303816000875af1158015611649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166d919061279e565b6116d65760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f74206170604482015273383937bb32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b8989858181106116e8576116e86125fa565b90506020020160208101906116fd9190612272565b88888681811061170f5761170f6125fa565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529196506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a7926117b69216906000908a908290600401612768565b6020604051808303816000875af11580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f9919061279e565b6118595760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420646560448201526a3837b9b4ba103a37b5b2b760a91b60648201526084016103af565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528216906370a0823190602401602060405180830381865afa1580156118bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e391906126a0565b92508787858181106118f7576118f76125fa565b90506020020135831061192257878785818110611916576119166125fa565b90506020020135611924565b825b91508115611b04576040513060248201526044810183905260640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106119ac576119ac6125fa565b90506020020160208101906119c19190612272565b60008860006040518563ffffffff1660e01b81526004016119e59493929190612768565b6020604051808303816000875af1158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a28919061279e565b611a9a5760405162461bcd60e51b815260206004820152603a60248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420776960448201527f74686472617720746f6b656e206166746572206465706f73697400000000000060648201526084016103af565b898985818110611aac57611aac6125fa565b9050602002016020810190611ac19190612272565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b69283604051611afb91815260200190565b60405180910390a25b505b888884818110611b1857611b186125fa565b9050602002016020810190611b2d9190612272565b6001546001600160a01b0391821691167f83e351ace74af42916cc159bb2c353842d1fe21125f26f3ab645aeac206b663c898987818110611b7057611b706125fa565b90506020020135604051611b8691815260200190565b60405180910390a350508080611b9b906126b9565b915050610f20565b506001546040516001600160a01b0390911660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b1790525163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a790611c62907f00000000000000000000000000000000000000000000000000000000000000009060009086908290600401612768565b6020604051808303816000875af1158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca5919061279e565b611cc15760405162461bcd60e51b81526004016103af906127f3565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a792611d8092169060009086908290600401612768565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc3919061279e565b611ddf5760405162461bcd60e51b81526004016103af906127f3565b6001546040518381526001600160a01b03909116907fece2604abb1c0d8f143c1c8961c88ecda8a2c7b650545e98255665063e7321859060200160405180910390a2505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e715760405162461bcd60e51b81526004016103af9061252a565b6001600160a01b038116611e975760405162461bcd60e51b81526004016103af90612610565b6001546040516001600160a01b038084169216907f571b0cfddc37eea7ea50ec6529f701f4c53e523eb459eb1238fb38a16fee9d4490600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611f3d5760405162461bcd60e51b81526004016103af9061252a565b611f4c85858585600019611fac565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611fa7908490611ff1565b505050565b60006001836001811115611fc257611fc2612730565b03611fda576000808551602087018986f49050611f4c565b600080855160208701888a87f19695505050505050565b6000612046826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120c69092919063ffffffff16565b9050805160001480612067575080806020019051810190612067919061279e565b611fa75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103af565b60606120d584846000856120dd565b949350505050565b60608247101561213e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103af565b600080866001600160a01b0316858760405161215a9190612845565b60006040518083038185875af1925050503d8060008114612197576040519150601f19603f3d011682016040523d82523d6000602084013e61219c565b606091505b50915091506121ad878383876121b8565b979650505050505050565b60608315612227578251600003612220576001600160a01b0385163b6122205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103af565b50816120d5565b6120d5838381511561223c5781518083602001fd5b8060405162461bcd60e51b81526004016103af9190612861565b80356001600160a01b038116811461226d57600080fd5b919050565b60006020828403121561228457600080fd5b61228d82612256565b9392505050565b60008083601f8401126122a657600080fd5b50813567ffffffffffffffff8111156122be57600080fd5b6020830191508360208260051b85010111156122d957600080fd5b9250929050565b6000806000806000606086880312156122f857600080fd5b853567ffffffffffffffff8082111561231057600080fd5b61231c89838a01612294565b9097509550602088013591508082111561233557600080fd5b5061234288828901612294565b9094509250612355905060408701612256565b90509295509295909350565b60008060006040848603121561237657600080fd5b833567ffffffffffffffff81111561238d57600080fd5b61239986828701612294565b90945092506123ac905060208501612256565b90509250925092565b6000806000806000606086880312156123cd57600080fd5b853567ffffffffffffffff808211156123e557600080fd5b6123f189838a01612294565b9097509550602088013591508082111561240a57600080fd5b5061241788828901612294565b96999598509660400135949350505050565b634e487b7160e01b600052604160045260246000fd5b80356002811061226d57600080fd5b6000806000806080858703121561246457600080fd5b61246d85612256565b935060208501359250604085013567ffffffffffffffff8082111561249157600080fd5b818701915087601f8301126124a557600080fd5b8135818111156124b7576124b7612429565b604051601f8201601f19908116603f011681019083821181831017156124df576124df612429565b816040528281528a60208487010111156124f857600080fd5b82602086016020830137600060208483010152809650505050505061251f6060860161243f565b905092959194509250565b6020808252601d908201527f536166654465706f7369747353656e6465723a204f6e6c792053616665000000604082015260600190565b60208082526023908201527f536166654465706f7369747353656e6465723a20496e76616c6964206164647260408201526265737360e81b606082015260800190565b60208082526036908201527f536166654465706f7369747353656e6465723a20546f6b656e7320616e6420616040820152750dadeeadce8e640d8cadccee8d040dad2e6dac2e8c6d60531b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602c908201527f536166654465706f7369747353656e6465723a205a65726f206164647265737360408201526b081b9bdd08185b1b1bddd95960a21b606082015260800190565b60208082526024908201527f536166654465706f7369747353656e6465723a204e6f7420656e6f7567682066604082015263756e647360e01b606082015260800190565b6000602082840312156126b257600080fd5b5051919050565b6000600182016126d957634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b838110156126fb5781810151838201526020016126e3565b50506000910152565b6000815180845261271c8160208601602086016126e0565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6002811061276457634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b038516815283602082015260806040820152600061278f6080830185612704565b9050611f4c6060830184612746565b6000602082840312156127b057600080fd5b8151801515811461228d57600080fd5b6001600160a01b03841681526020810183905260806040820181905260009082015260a081016120d56060830184612746565b60208082526032908201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860408201527132b1baba329029a7ab103a3930b739b332b960711b606082015260800190565b600082516128578184602087016126e0565b9190910192915050565b60208152600061228d602083018461270456fea264697066735822122079436df57107ad03a8a62cb0ffaabfeebb3ab9643ced815126b2474370014c4c64736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_depositor": "Address of the depositor account", + "_lockDrop": "Address of the BOB FusionLock contract", + "_safeAddress": "Address of the Gnosis Safe", + "_sovToken": "Address of the SOV token contract" + } + }, + "execTransactionFromSafe(address,uint256,bytes,uint8)": { + "params": { + "data": "Data payload of module transaction.", + "operation": "Operation type of module transaction.", + "to": "Destination address of module transaction.", + "value": "Ether value of module transaction." + }, + "returns": { + "success": "Boolean flag indicating if the call succeeded." + } + }, + "mapDepositorToReceiver(address)": { + "params": { + "receiver": "Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB" + } + }, + "sendToLockDropContract(address[],uint256[],uint256)": { + "details": "This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEXThe function is allowed to be called only by the lockdropDepositorAddressToken amounts and SOV amount to send are calculated offchain", + "params": { + "amounts": "List of amounts of tokens to send", + "sovAmount": "Amount of SOV tokens to send", + "tokens": "List of tokens to send" + } + }, + "setDepositorAddress(address)": { + "details": "Only Safe can call this functionNew depositor can be zero address", + "params": { + "_newDepositor": "New depositor address" + } + }, + "setLockDropAddress(address)": { + "details": "Only Safe can call this functionNew LockDrop can't be zero address", + "params": { + "_newLockdrop": "New depositor address" + } + }, + "withdraw(address[],uint256[],address)": { + "details": "Only Safe can call this functionRecipient should not be a zero address", + "params": { + "amounts": "List of token amounts to withdraw", + "recipient": "Recipient address", + "tokens": "List of token addresses to withdraw" + } + }, + "withdrawAll(address[],address)": { + "details": "Only Safe can call this functionRecipient should not be a zero address", + "params": { + "recipient": "Recipient address", + "tokens": "List of token addresses to withdraw" + } + } + }, + "title": "SafeDepositsSender", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "execTransactionFromSafe(address,uint256,bytes,uint8)": { + "notice": "Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe" + }, + "mapDepositorToReceiver(address)": { + "notice": "Maps depositor on ethereum to receiver on BOBReceiver from the last emitted event called by msg.sender will be used" + }, + "pause()": { + "notice": "pause the contract - no funds can be sent to the LockDrop contract" + }, + "sendToLockDropContract(address[],uint256[],uint256)": { + "notice": "Sends tokens to the LockDrop contract" + }, + "setDepositorAddress(address)": { + "notice": "Sets new depositor address" + }, + "setLockDropAddress(address)": { + "notice": "Sets new LockDrop address" + }, + "stop()": { + "notice": "stops the contract - no funds can be sent to the LockDrop contract, this is irreversible" + }, + "unpause()": { + "notice": "unpause the contract" + }, + "withdraw(address[],uint256[],address)": { + "notice": "Withdraws tokens from this contract to a recipient addressWithdrawal to the Safe address will affect balances and rewardsAmount > 0 should be checked by the caller before calling this function" + }, + "withdrawAll(address[],address)": { + "notice": "Withdraws all tokens from this contract to a recipientAmount > 0 should be checked by the caller before calling this functionWithdrawal to the Safe address will affect balances and rewards" + } + }, + "notice": "This contract is a gateway for depositing funds into the Bob locker contracts", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 865, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "lockdropDepositorAddress", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 867, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "lockDropAddress", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 869, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "stopBlock", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 871, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "paused", + "offset": 0, + "slot": "3", + "type": "t_bool" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployment/deployments/ethSepoliaTestnet/solcInputs/62f7bd5da3d403db52f5aff49c2058e9.json b/deployment/deployments/ethSepoliaTestnet/solcInputs/62f7bd5da3d403db52f5aff49c2058e9.json new file mode 100644 index 000000000..bcc4bc5a7 --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/solcInputs/62f7bd5da3d403db52f5aff49c2058e9.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event setDepositor(address indexed oldDepositor, address indexed newDepositor);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable LOCK_DROP_ADDRESS;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit setDepositor(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/ethSepoliaTestnet/solcInputs/7fe2afa5429d227cb4a980a9d8e1dada.json b/deployment/deployments/ethSepoliaTestnet/solcInputs/7fe2afa5429d227cb4a980a9d8e1dada.json new file mode 100644 index 000000000..72879a853 --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/solcInputs/7fe2afa5429d227cb4a980a9d8e1dada.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private LOCK_DROP_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external onlyDepositorOrSafe {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(LOCK_DROP_ADDRESS, _newLockdrop);\n LOCK_DROP_ADDRESS = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/ethSepoliaTestnet/solcInputs/af4f85548a4a6b0588c6c13bac974dc1.json b/deployment/deployments/ethSepoliaTestnet/solcInputs/af4f85548a4a6b0588c6c13bac974dc1.json new file mode 100644 index 000000000..548e93f8c --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/solcInputs/af4f85548a4a6b0588c6c13bac974dc1.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event setDepositor(address indexed oldDepositor, address indexed newDepositor);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable LOCK_DROP_ADDRESS;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositor whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit setDepositor(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/ethSepoliaTestnet/solcInputs/b6ccc7dc4fb34511b9d8d031557b3d58.json b/deployment/deployments/ethSepoliaTestnet/solcInputs/b6ccc7dc4fb34511b9d8d031557b3d58.json new file mode 100644 index 000000000..e32fd851e --- /dev/null +++ b/deployment/deployments/ethSepoliaTestnet/solcInputs/b6ccc7dc4fb34511b9d8d031557b3d58.json @@ -0,0 +1,55 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\nimport { SafeERC20, IERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n using SafeERC20 for IERC20;\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract\n address private lockDropAddress;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the BOB FusionLock contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n SOV_TOKEN_ADDRESS = _sovToken;\n lockdropDepositorAddress = _depositor;\n lockDropAddress = _lockDrop;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == lockdropDepositorAddress, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the lockdropDepositorAddress\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n uint256 transferAmount;\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough eth balance to deposit\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not deposit ether\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n transferAmount = balance < amounts[i] ? balance : amounts[i];\n if (transferAmount > 0) {\n require(\n SAFE.execTransactionFromModule(\n address(this),\n transferAmount,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not withdraw ether after deposit\"\n );\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\n }\n } else {\n // transfer ERC20 tokens\n IERC20 token = IERC20(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough tokens to deposit\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n lockDropAddress,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not deposit token\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n transferAmount = balance < amounts[i] ? balance : amounts[i];\n if (transferAmount > 0) {\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n transferAmount\n );\n require(\n SAFE.execTransactionFromModule(\n tokens[i],\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not withdraw token after deposit\"\n );\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\n }\n }\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", lockDropAddress, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /**\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\n * @param to Destination address of module transaction.\n * @param value Ether value of module transaction.\n * @param data Data payload of module transaction.\n * @param operation Operation type of module transaction.\n * @return success Boolean flag indicating if the call succeeded.\n */\n function execTransactionFromSafe(\n address to,\n uint256 value,\n bytes memory data,\n GnosisSafe.Operation operation\n ) external onlySafe returns (bool success) {\n success = execute(to, value, data, operation, type(uint256).max);\n }\n\n /**\n * @notice Executes either a delegatecall or a call with provided parameters.\n * @dev This method doesn't perform any sanity check of the transaction, such as:\n * - if the contract at `to` address has code or not\n * It is the responsibility of the caller to perform such checks.\n * @param to Destination address.\n * @param value Ether value.\n * @param data Data payload.\n * @param operation Operation type.\n * @return success boolean flag indicating if the call succeeded.\n */\n function execute(\n address to,\n uint256 value,\n bytes memory data,\n GnosisSafe.Operation operation,\n uint256 txGas\n ) internal returns (bool success) {\n if (operation == GnosisSafe.Operation.DelegateCall) {\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n /* solhint-enable no-inline-assembly */\n } else {\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n /* solhint-enable no-inline-assembly */\n }\n }\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor);\n lockdropDepositorAddress = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\n lockDropAddress = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20 token = IERC20(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.safeTransfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"SafeDepositsSender: Could not withdraw ether\");\n continue;\n }\n IERC20 token = IERC20(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.safeTransfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return lockDropAddress;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return lockdropDepositorAddress;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/.chainId b/deployment/deployments/tenderlyForkedEthMainnet/.chainId new file mode 100644 index 000000000..56a6051ca --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/.chainId @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/SafeDepositsSender.json b/deployment/deployments/tenderlyForkedEthMainnet/SafeDepositsSender.json new file mode 100644 index 000000000..7c8d360be --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/SafeDepositsSender.json @@ -0,0 +1,643 @@ +{ + "address": "0xaAbdFEFC6Be0a9e876FB16fe5f3f05B3580B9377", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_safeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockDrop", + "type": "address" + }, + { + "internalType": "address", + "name": "_sovToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_depositor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lockDrop", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositSOVToLockdrop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "lockDrop", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "DepositToLockdrop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "depositor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "MapDepositorToReceiver", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldDepositor", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newDepositor", + "type": "address" + } + ], + "name": "SetDepositorAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oldLockDrop", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newLockDrop", + "type": "address" + } + ], + "name": "SetLockDropAddress", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Stop", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "name": "WithdrawBalanceFromSafe", + "type": "event" + }, + { + "inputs": [], + "name": "ETH_TOKEN_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum GnosisSafe.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromSafe", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getDepositorAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLockDropAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSafeAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getSovTokenAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getStopBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isStopped", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "mapDepositorToReceiver", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "sovAmount", + "type": "uint256" + } + ], + "name": "sendToLockDropContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newDepositor", + "type": "address" + } + ], + "name": "setDepositorAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newLockdrop", + "type": "address" + } + ], + "name": "setLockDropAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stop", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "withdrawAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x44f79825f77e0e010e6b26962a9c1041f636993b0c012e95c29054f162152a85", + "receipt": { + "to": null, + "from": "0x8C9143221F2b72Fcef391893c3a02Cf0fE84f50b", + "contractAddress": "0xaAbdFEFC6Be0a9e876FB16fe5f3f05B3580B9377", + "transactionIndex": 0, + "gasUsed": "2286786", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x5de917640df84b778b91613337348a7351599c6d8aacedc88418d5722e4313a4", + "transactionHash": "0x44f79825f77e0e010e6b26962a9c1041f636993b0c012e95c29054f162152a85", + "logs": [], + "blockNumber": 19522145, + "cumulativeGasUsed": "2286786", + "status": 1, + "byzantium": true + }, + "args": [ + "0x949cf9295d2950b6bd9b7334846101e9ae44bbb0", + "0x61dc14b28d4dbcd6cf887e9b72018b9da1ce6ff7", + "0xbdab72602e9ad40fc6a6852caf43258113b8f7a5", + "0x86de732721fffcdf163629c64e3925b5bf7f371a" + ], + "numDeployments": 2, + "solcInputHash": "278fa9759bca8e7b6d4d08799392c56d", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_safeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lockDrop\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sovToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositor\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockDrop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositSOVToLockdrop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"lockDrop\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"DepositToLockdrop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"depositor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"MapDepositorToReceiver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldDepositor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newDepositor\",\"type\":\"address\"}],\"name\":\"SetDepositorAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldLockDrop\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newLockDrop\",\"type\":\"address\"}],\"name\":\"SetLockDropAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Stop\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"name\":\"WithdrawBalanceFromSafe\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ETH_TOKEN_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum GnosisSafe.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromSafe\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLockDropAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSafeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSovTokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStopBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isStopped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"mapDepositorToReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sovAmount\",\"type\":\"uint256\"}],\"name\":\"sendToLockDropContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newDepositor\",\"type\":\"address\"}],\"name\":\"setDepositorAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newLockdrop\",\"type\":\"address\"}],\"name\":\"setLockDropAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stop\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_depositor\":\"Address of the depositor account\",\"_lockDrop\":\"Address of the BOB FusionLock contract\",\"_safeAddress\":\"Address of the Gnosis Safe\",\"_sovToken\":\"Address of the SOV token contract\"}},\"execTransactionFromSafe(address,uint256,bytes,uint8)\":{\"params\":{\"data\":\"Data payload of module transaction.\",\"operation\":\"Operation type of module transaction.\",\"to\":\"Destination address of module transaction.\",\"value\":\"Ether value of module transaction.\"},\"returns\":{\"success\":\"Boolean flag indicating if the call succeeded.\"}},\"mapDepositorToReceiver(address)\":{\"params\":{\"receiver\":\"Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\"}},\"sendToLockDropContract(address[],uint256[],uint256)\":{\"details\":\"This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEXThe function is allowed to be called only by the lockdropDepositorAddressToken amounts and SOV amount to send are calculated offchain\",\"params\":{\"amounts\":\"List of amounts of tokens to send\",\"sovAmount\":\"Amount of SOV tokens to send\",\"tokens\":\"List of tokens to send\"}},\"setDepositorAddress(address)\":{\"details\":\"Only Safe can call this functionNew depositor can be zero address\",\"params\":{\"_newDepositor\":\"New depositor address\"}},\"setLockDropAddress(address)\":{\"details\":\"Only Safe can call this functionNew LockDrop can't be zero address\",\"params\":{\"_newLockdrop\":\"New depositor address\"}},\"withdraw(address[],uint256[],address)\":{\"details\":\"Only Safe can call this functionRecipient should not be a zero address\",\"params\":{\"amounts\":\"List of token amounts to withdraw\",\"recipient\":\"Recipient address\",\"tokens\":\"List of token addresses to withdraw\"}},\"withdrawAll(address[],address)\":{\"details\":\"Only Safe can call this functionRecipient should not be a zero address\",\"params\":{\"recipient\":\"Recipient address\",\"tokens\":\"List of token addresses to withdraw\"}}},\"title\":\"SafeDepositsSender\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execTransactionFromSafe(address,uint256,bytes,uint8)\":{\"notice\":\"Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\"},\"mapDepositorToReceiver(address)\":{\"notice\":\"Maps depositor on ethereum to receiver on BOBReceiver from the last emitted event called by msg.sender will be used\"},\"pause()\":{\"notice\":\"pause the contract - no funds can be sent to the LockDrop contract\"},\"sendToLockDropContract(address[],uint256[],uint256)\":{\"notice\":\"Sends tokens to the LockDrop contract\"},\"setDepositorAddress(address)\":{\"notice\":\"Sets new depositor address\"},\"setLockDropAddress(address)\":{\"notice\":\"Sets new LockDrop address\"},\"stop()\":{\"notice\":\"stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\"},\"unpause()\":{\"notice\":\"unpause the contract\"},\"withdraw(address[],uint256[],address)\":{\"notice\":\"Withdraws tokens from this contract to a recipient addressWithdrawal to the Safe address will affect balances and rewardsAmount > 0 should be checked by the caller before calling this function\"},\"withdrawAll(address[],address)\":{\"notice\":\"Withdraws all tokens from this contract to a recipientAmount > 0 should be checked by the caller before calling this functionWithdrawal to the Safe address will affect balances and rewards\"}},\"notice\":\"This contract is a gateway for depositing funds into the Bob locker contracts\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/integrations/bob/SafeDepositsSender.sol\":\"SafeDepositsSender\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=contracts/\",\":ds-test/=foundry/lib/forge-std/lib/ds-test/src/\",\":forge-std/=foundry/lib/forge-std/src/\"]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n * doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n * token.safeTransferFrom(msg.sender, address(this), value);\\n * ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n /**\\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n * given ``owner``'s signed approval.\\n *\\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n * ordering also apply here.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `deadline` must be a timestamp in the future.\\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n * over the EIP712-formatted function arguments.\\n * - the signature must use ``owner``'s current nonce (see {nonces}).\\n *\\n * For more information on the signature format, see the\\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n * section].\\n *\\n * CAUTION: See Security Considerations above.\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) external;\\n\\n /**\\n * @dev Returns the current nonce for `owner`. This value must be\\n * included whenever a signature is generated for {permit}.\\n *\\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n * prevents a signature from being used multiple times.\\n */\\n function nonces(address owner) external view returns (uint256);\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n /**\\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n /**\\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n */\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n /**\\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n }\\n\\n /**\\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful.\\n */\\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n }\\n }\\n\\n /**\\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n * to be set to zero before setting it to a non-zero value, such as USDT.\\n */\\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n if (!_callOptionalReturnBool(token, approvalCall)) {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n _callOptionalReturn(token, approvalCall);\\n }\\n }\\n\\n /**\\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n * Revert on invalid signature.\\n */\\n function safePermit(\\n IERC20Permit token,\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal {\\n uint256 nonceBefore = token.nonces(owner);\\n token.permit(owner, spender, value, deadline, v, r, s);\\n uint256 nonceAfter = token.nonces(owner);\\n require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n *\\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n */\\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n // and not revert is the subcall reverts.\\n\\n (bool success, bytes memory returndata) = address(token).call(data);\\n return\\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\\n }\\n}\\n\",\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"contracts/integrations/bob/SafeDepositsSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport { ISafeDepositsSender } from \\\"./interfaces/ISafeDepositsSender.sol\\\";\\nimport { SafeERC20, IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\n\\ninterface GnosisSafe {\\n enum Operation {\\n Call,\\n DelegateCall\\n }\\n\\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\\n /// @param to Destination address of module transaction.\\n /// @param value Ether value of module transaction.\\n /// @param data Data payload of module transaction.\\n /// @param operation Operation type of module transaction.\\n function execTransactionFromModule(\\n address to,\\n uint256 value,\\n bytes calldata data,\\n Operation operation\\n ) external returns (bool success);\\n}\\n\\n/**\\n * @title SafeDepositsSender\\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\\n */\\ncontract SafeDepositsSender is ISafeDepositsSender {\\n using SafeERC20 for IERC20;\\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\\n GnosisSafe private immutable SAFE;\\n address private immutable SOV_TOKEN_ADDRESS;\\n address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract\\n address private lockDropAddress;\\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\\n bool private paused;\\n\\n /**\\n * @param _safeAddress Address of the Gnosis Safe\\n * @param _lockDrop Address of the BOB FusionLock contract\\n * @param _sovToken Address of the SOV token contract\\n * @param _depositor Address of the depositor account\\n */\\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\\n require(_safeAddress != address(0), \\\"SafeDepositsSender: Invalid safe address\\\");\\n require(_lockDrop != address(0), \\\"SafeDepositsSender: Invalid lockdrop address\\\");\\n require(_sovToken != address(0), \\\"SafeDepositsSender: Invalid sov token address\\\");\\n require(_depositor != address(0), \\\"SafeDepositsSender: Invalid depositor token address\\\");\\n SAFE = GnosisSafe(_safeAddress);\\n SOV_TOKEN_ADDRESS = _sovToken;\\n lockdropDepositorAddress = _depositor;\\n lockDropAddress = _lockDrop;\\n }\\n\\n receive() external payable {}\\n\\n // MODIFIERS //\\n\\n modifier onlySafe() {\\n require(msg.sender == address(SAFE), \\\"SafeDepositsSender: Only Safe\\\");\\n _;\\n }\\n\\n modifier onlyDepositor() {\\n require(msg.sender == lockdropDepositorAddress, \\\"SafeDepositsSender: Only Depositor\\\");\\n _;\\n }\\n\\n modifier onlyDepositorOrSafe() {\\n require(\\n msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE),\\n \\\"SafeDepositsSender: Only Depositor or Safe\\\"\\n );\\n _;\\n }\\n\\n modifier whenNotPaused() {\\n require(!paused, \\\"SafeDepositsSender: Paused\\\");\\n _;\\n }\\n\\n modifier whenPaused() {\\n require(paused, \\\"SafeDepositsSender: Not paused\\\");\\n _;\\n }\\n\\n modifier whenUnstopped() {\\n require(stopBlock == 0, \\\"SafeDepositsSender: Stopped\\\");\\n _;\\n }\\n\\n modifier notZeroAddress(address _address) {\\n require(_address != address(0), \\\"SafeDepositsSender: Invalid address\\\");\\n _;\\n }\\n\\n // CORE FUNCTIONS\\n\\n /**\\n * @notice Sends tokens to the LockDrop contract\\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\\n * @dev The function is allowed to be called only by the lockdropDepositorAddress\\n * @dev Token amounts and SOV amount to send are calculated offchain\\n * @param tokens List of tokens to send\\n * @param amounts List of amounts of tokens to send\\n * @param sovAmount Amount of SOV tokens to send\\n */\\n function sendToLockDropContract(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n uint256 sovAmount\\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\\n require(\\n tokens.length == amounts.length,\\n \\\"SafeDepositsSender: Tokens and amounts length mismatch\\\"\\n );\\n require(sovAmount > 0, \\\"SafeDepositsSender: Invalid SOV amount\\\");\\n\\n bytes memory data;\\n\\n for (uint256 i = 0; i < tokens.length; i++) {\\n require(\\n tokens[i] != SOV_TOKEN_ADDRESS,\\n \\\"SafeDepositsSender: SOV token is transferred separately\\\"\\n );\\n\\n // transfer native token\\n uint256 balance;\\n uint256 transferAmount;\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n require(\\n address(SAFE).balance >= amounts[i],\\n \\\"SafeDepositsSender: Not enough funds\\\"\\n );\\n data = abi.encodeWithSignature(\\\"depositEth()\\\");\\n require(\\n SAFE.execTransactionFromModule(\\n lockDropAddress,\\n amounts[i],\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"Could not execute ether transfer\\\"\\n );\\n\\n // withdraw balance to this contract left after deposit to the LockDrop\\n balance = address(SAFE).balance;\\n transferAmount = balance < amounts[i] ? balance : amounts[i];\\n require(\\n SAFE.execTransactionFromModule(\\n address(this),\\n transferAmount,\\n \\\"\\\",\\n GnosisSafe.Operation.Call\\n ),\\n \\\"Could not execute ether transfer\\\"\\n );\\n } else {\\n // transfer ERC20 tokens\\n IERC20 token = IERC20(tokens[i]);\\n balance = token.balanceOf(address(SAFE));\\n require(balance >= amounts[i], \\\"SafeDepositsSender: Not enough funds\\\");\\n\\n data = abi.encodeWithSignature(\\n \\\"approve(address,uint256)\\\",\\n lockDropAddress,\\n amounts[i]\\n );\\n require(\\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not approve token transfer\\\"\\n );\\n\\n data = abi.encodeWithSignature(\\n \\\"depositERC20(address,uint256)\\\",\\n tokens[i],\\n amounts[i]\\n );\\n require(\\n SAFE.execTransactionFromModule(\\n lockDropAddress,\\n 0,\\n data,\\n GnosisSafe.Operation.Call\\n ),\\n \\\"SafeDepositsSender: Could not execute token transfer\\\"\\n );\\n\\n // withdraw balance to this contract left after deposit to the LockDrop\\n balance = token.balanceOf(address(SAFE));\\n transferAmount = balance < amounts[i] ? balance : amounts[i];\\n data = abi.encodeWithSignature(\\n \\\"transfer(address,uint256)\\\",\\n address(this),\\n transferAmount\\n );\\n require(\\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not execute ether transfer\\\"\\n );\\n }\\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\\n }\\n\\n // transfer SOV\\n data = abi.encodeWithSignature(\\\"approve(address,uint256)\\\", lockDropAddress, sovAmount);\\n require(\\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\\n \\\"SafeDepositsSender: Could not execute SOV token transfer\\\"\\n );\\n data = abi.encodeWithSignature(\\n \\\"depositERC20(address,uint256)\\\",\\n SOV_TOKEN_ADDRESS,\\n sovAmount\\n );\\n require(\\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\\n \\\"Could not execute SOV transfer\\\"\\n );\\n\\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\\n }\\n\\n /// @notice Maps depositor on ethereum to receiver on BOB\\n /// @notice Receiver from the last emitted event called by msg.sender will be used\\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\\n function mapDepositorToReceiver(address receiver) external {\\n emit MapDepositorToReceiver(msg.sender, receiver);\\n }\\n\\n // ADMINISTRATIVE FUNCTIONS //\\n\\n /**\\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\\n * @param to Destination address of module transaction.\\n * @param value Ether value of module transaction.\\n * @param data Data payload of module transaction.\\n * @param operation Operation type of module transaction.\\n * @return success Boolean flag indicating if the call succeeded.\\n */\\n function execTransactionFromSafe(\\n address to,\\n uint256 value,\\n bytes memory data,\\n GnosisSafe.Operation operation\\n ) external onlySafe returns (bool success) {\\n success = execute(to, value, data, operation, type(uint256).max);\\n }\\n\\n /**\\n * @notice Executes either a delegatecall or a call with provided parameters.\\n * @dev This method doesn't perform any sanity check of the transaction, such as:\\n * - if the contract at `to` address has code or not\\n * It is the responsibility of the caller to perform such checks.\\n * @param to Destination address.\\n * @param value Ether value.\\n * @param data Data payload.\\n * @param operation Operation type.\\n * @return success boolean flag indicating if the call succeeded.\\n */\\n function execute(\\n address to,\\n uint256 value,\\n bytes memory data,\\n GnosisSafe.Operation operation,\\n uint256 txGas\\n ) internal returns (bool success) {\\n if (operation == GnosisSafe.Operation.DelegateCall) {\\n /* solhint-disable no-inline-assembly */\\n /// @solidity memory-safe-assembly\\n assembly {\\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\\n }\\n /* solhint-enable no-inline-assembly */\\n } else {\\n /* solhint-disable no-inline-assembly */\\n /// @solidity memory-safe-assembly\\n assembly {\\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\\n }\\n /* solhint-enable no-inline-assembly */\\n }\\n }\\n\\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\\n\\n /**\\n * @notice Sets new depositor address\\n * @dev Only Safe can call this function\\n * @dev New depositor can be zero address\\n * @param _newDepositor New depositor address\\n */\\n function setDepositorAddress(address _newDepositor) external onlySafe {\\n emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor);\\n lockdropDepositorAddress = _newDepositor;\\n }\\n\\n /**\\n * @notice Sets new LockDrop address\\n * @dev Only Safe can call this function\\n * @dev New LockDrop can't be zero address\\n * @param _newLockdrop New depositor address\\n */\\n function setLockDropAddress(address _newLockdrop) external onlySafe {\\n require(_newLockdrop != address(0), \\\"SafeDepositsSender: Zero address not allowed\\\");\\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\\n lockDropAddress = _newLockdrop;\\n }\\n\\n /**\\n * @notice Withdraws tokens from this contract to a recipient address\\n * @notice Withdrawal to the Safe address will affect balances and rewards\\n * @notice Amount > 0 should be checked by the caller before calling this function\\n * @dev Only Safe can call this function\\n * @dev Recipient should not be a zero address\\n * @param tokens List of token addresses to withdraw\\n * @param amounts List of token amounts to withdraw\\n * @param recipient Recipient address\\n */\\n function withdraw(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n address recipient\\n ) external onlySafe notZeroAddress(recipient) {\\n require(\\n tokens.length == amounts.length,\\n \\\"SafeDepositsSender: Tokens and amounts length mismatch\\\"\\n );\\n\\n for (uint256 i = 0; i < tokens.length; i++) {\\n require(tokens[i] != address(0x00), \\\"SafeDepositsSender: Zero address not allowed\\\");\\n require(amounts[i] != 0, \\\"SafeDepositsSender: Zero amount not allowed\\\");\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n require(\\n address(this).balance >= amounts[i],\\n \\\"SafeDepositsSender: Not enough funds\\\"\\n );\\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\\\"\\\");\\n require(success, \\\"Could not withdraw ether\\\");\\n continue;\\n }\\n\\n IERC20 token = IERC20(tokens[i]);\\n uint256 balance = token.balanceOf(address(this));\\n require(balance >= amounts[i], \\\"SafeDepositsSender: Not enough funds\\\");\\n\\n token.safeTransfer(recipient, amounts[i]);\\n\\n emit Withdraw(recipient, tokens[i], amounts[i]);\\n }\\n }\\n\\n /**\\n * @notice Withdraws all tokens from this contract to a recipient\\n * @notice Amount > 0 should be checked by the caller before calling this function\\n * @dev Only Safe can call this function\\n * @dev Recipient should not be a zero address\\n * @notice Withdrawal to the Safe address will affect balances and rewards\\n * @param tokens List of token addresses to withdraw\\n * @param recipient Recipient address\\n */\\n function withdrawAll(\\n address[] calldata tokens,\\n address recipient\\n ) external onlySafe notZeroAddress(recipient) {\\n for (uint256 i = 0; i < tokens.length; i++) {\\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\\\"\\\");\\n require(success, \\\"Could not withdraw ether\\\");\\n continue;\\n }\\n IERC20 token = IERC20(tokens[i]);\\n uint256 balance = token.balanceOf(address(this));\\n if (balance > 0) {\\n token.safeTransfer(recipient, balance);\\n }\\n\\n emit Withdraw(recipient, tokens[i], balance);\\n }\\n }\\n\\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\\n function pause() external onlySafe whenNotPaused {\\n paused = true;\\n emit Pause();\\n }\\n\\n /// @notice unpause the contract\\n function unpause() external onlySafe whenPaused {\\n paused = false;\\n emit Unpause();\\n }\\n\\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\\n function stop() external onlySafe {\\n stopBlock = block.number;\\n emit Stop();\\n }\\n\\n // GETTERS //\\n function getSafeAddress() external view returns (address) {\\n return address(SAFE);\\n }\\n\\n function getLockDropAddress() external view returns (address) {\\n return lockDropAddress;\\n }\\n\\n function getSovTokenAddress() external view returns (address) {\\n return SOV_TOKEN_ADDRESS;\\n }\\n\\n function getDepositorAddress() external view returns (address) {\\n return lockdropDepositorAddress;\\n }\\n\\n function isStopped() external view returns (bool) {\\n return stopBlock != 0;\\n }\\n\\n function getStopBlock() external view returns (uint256) {\\n return stopBlock;\\n }\\n\\n function isPaused() external view returns (bool) {\\n return paused;\\n }\\n}\\n\",\"keccak256\":\"0x9bdb8a78ed04d5ac0affbe1406e3725a0b3f60fb24ff24c28318a8f0ea1d5867\",\"license\":\"MIT\"},\"contracts/integrations/bob/interfaces/ISafeDepositsSender.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\ninterface ISafeDepositsSender {\\n event Withdraw(address indexed from, address indexed token, uint256 amount);\\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\\n event Pause();\\n event Unpause();\\n event Stop();\\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\\n\\n function getSafeAddress() external view returns (address);\\n function getLockDropAddress() external view returns (address);\\n function getSovTokenAddress() external view returns (address);\\n function getDepositorAddress() external view returns (address);\\n function isStopped() external view returns (bool);\\n function isPaused() external view returns (bool);\\n\\n // @note amount > 0 should be checked by the caller\\n function withdraw(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n address recipient\\n ) external;\\n\\n function withdrawAll(address[] calldata tokens, address recipient) external;\\n\\n function pause() external;\\n\\n function unpause() external;\\n\\n function stop() external;\\n\\n function setDepositorAddress(address _newDepositor) external;\\n\\n function sendToLockDropContract(\\n address[] calldata tokens,\\n uint256[] calldata amounts,\\n uint256 sovAmount\\n ) external;\\n}\\n\",\"keccak256\":\"0xb80080b92446a1edc1a9f4ed3576ffea3df483aaff33b33a2d2168212f7d2812\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60c06040523480156200001157600080fd5b5060405162002af138038062002af1833981016040819052620000349162000254565b6001600160a01b038416620000a15760405162461bcd60e51b815260206004820152602860248201527f536166654465706f7369747353656e6465723a20496e76616c69642073616665604482015267206164647265737360c01b60648201526084015b60405180910390fd5b6001600160a01b0383166200010e5760405162461bcd60e51b815260206004820152602c60248201527f536166654465706f7369747353656e6465723a20496e76616c6964206c6f636b60448201526b64726f70206164647265737360a01b606482015260840162000098565b6001600160a01b0382166200017c5760405162461bcd60e51b815260206004820152602d60248201527f536166654465706f7369747353656e6465723a20496e76616c696420736f762060448201526c746f6b656e206164647265737360981b606482015260840162000098565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152603360248201527f536166654465706f7369747353656e6465723a20496e76616c6964206465706f60448201527f7369746f7220746f6b656e206164647265737300000000000000000000000000606482015260840162000098565b6001600160a01b0393841660805290831660a052600080549184166001600160a01b031992831617905560018054929093169116179055620002b1565b80516001600160a01b03811681146200024f57600080fd5b919050565b600080600080608085870312156200026b57600080fd5b620002768562000237565b9350620002866020860162000237565b9250620002966040860162000237565b9150620002a66060860162000237565b905092959194509250565b60805160a051612779620003786000396000818161022701528181610f0b01528181611ace0152611bbf015260008181610305015281816103720152818161042b0152818161086a01528181610b0101528181610bd001528181610c7301528181610d5a0152818161102b015281816110ab015281816111a001528181611224015281816113320152818161145b0152818161161a0152818161171a0152818161181a01528181611aa101528181611c3401528181611d550152611e2101526127796000f3fe60806040526004361061010d5760003560e01c80635d9dac1011610095578063b187bd2611610064578063b187bd26146102be578063b6e7377d146102d6578063d17b8f98146102f6578063d7c3e7b314610329578063f5f52e2e1461034957600080fd5b80635d9dac101461024b578063813ddbf41461026b5780638456cb5914610289578063af0776521461029e57600080fd5b8063397a079b116100dc578063397a079b146101a25780633f4ba83a146101c25780633f683b6a146101d75780634768b497146101fa5780634bcfe7261461021857600080fd5b806307da68f5146101195780631878d1f1146101305780631d1372e41461016257806326f915061461018257600080fd5b3661011457005b600080fd5b34801561012557600080fd5b5061012e610367565b005b34801561013c57600080fd5b50610145600181565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012e61017d366004612193565b6103e7565b34801561018e57600080fd5b5061012e61019d366004612201565b610420565b3480156101ae57600080fd5b5061012e6101bd366004612282565b61085f565b3480156101ce57600080fd5b5061012e610af6565b3480156101e357600080fd5b5060025415155b6040519015158152602001610159565b34801561020657600080fd5b506000546001600160a01b0316610145565b34801561022457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561025757600080fd5b5061012e610266366004612193565b610bc5565b34801561027757600080fd5b506001546001600160a01b0316610145565b34801561029557600080fd5b5061012e610c68565b3480156102aa57600080fd5b5061012e6102b93660046122d6565b610d3b565b3480156102ca57600080fd5b5060035460ff166101ea565b3480156102e257600080fd5b5061012e6102f1366004612193565b611d4a565b34801561030257600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561033557600080fd5b506101ea61034436600461236f565b611e14565b34801561035557600080fd5b50600254604051908152602001610159565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b85760405162461bcd60e51b81526004016103af9061244b565b60405180910390fd5b436002556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b90600090a1565b6040516001600160a01b0382169033907f256f07b5eef8212c06c8cbb78abeb76d2b66770a68e81686fd14c3a0454551e190600090a350565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104685760405162461bcd60e51b81526004016103af9061244b565b806001600160a01b03811661048f5760405162461bcd60e51b81526004016103af90612482565b8483146104ae5760405162461bcd60e51b81526004016103af906124c5565b60005b858110156108565760008787838181106104cd576104cd61251b565b90506020020160208101906104e29190612193565b6001600160a01b0316036105085760405162461bcd60e51b81526004016103af90612531565b84848281811061051a5761051a61251b565b905060200201356000036105845760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a205a65726f20616d6f756e742060448201526a1b9bdd08185b1b1bddd95960aa1b60648201526084016103af565b60018787838181106105985761059861251b565b90506020020160208101906105ad9190612193565b6001600160a01b0316036106af578484828181106105cd576105cd61251b565b905060200201354710156105f35760405162461bcd60e51b81526004016103af9061257d565b6000836001600160a01b03168686848181106106115761061161251b565b9050602002013560405160006040518083038185875af1925050503d8060008114610658576040519150601f19603f3d011682016040523d82523d6000602084013e61065d565b606091505b50509050806106a95760405162461bcd60e51b815260206004820152601860248201527721b7bab632103737ba103bb4ba34323930bb9032ba3432b960411b60448201526064016103af565b50610844565b60008787838181106106c3576106c361251b565b90506020020160208101906106d89190612193565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074691906125c1565b905086868481811061075a5761075a61251b565b905060200201358110156107805760405162461bcd60e51b81526004016103af9061257d565b6107b6858888868181106107965761079661251b565b90506020020135846001600160a01b0316611e769092919063ffffffff16565b8888848181106107c8576107c861251b565b90506020020160208101906107dd9190612193565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8989878181106108235761082361251b565b9050602002013560405161083991815260200190565b60405180910390a350505b8061084e816125da565b9150506104b1565b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108a75760405162461bcd60e51b81526004016103af9061244b565b806001600160a01b0381166108ce5760405162461bcd60e51b81526004016103af90612482565b60005b83811015610aef5760018585838181106108ed576108ed61251b565b90506020020160208101906109029190612193565b6001600160a01b0316036109b4576000836001600160a01b03164760405160006040518083038185875af1925050503d806000811461095d576040519150601f19603f3d011682016040523d82523d6000602084013e610962565b606091505b50509050806109ae5760405162461bcd60e51b815260206004820152601860248201527721b7bab632103737ba103bb4ba34323930bb9032ba3432b960411b60448201526064016103af565b50610add565b60008585838181106109c8576109c861251b565b90506020020160208101906109dd9190612193565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4b91906125c1565b90508015610a6757610a676001600160a01b0383168683611e76565b868684818110610a7957610a7961251b565b9050602002016020810190610a8e9190612193565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83604051610ad291815260200190565b60405180910390a350505b80610ae7816125da565b9150506108d1565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e5760405162461bcd60e51b81526004016103af9061244b565b60035460ff16610b905760405162461bcd60e51b815260206004820152601e60248201527f536166654465706f7369747353656e6465723a204e6f7420706175736564000060448201526064016103af565b6003805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c0d5760405162461bcd60e51b81526004016103af9061244b565b600080546040516001600160a01b03808516939216917fad63b85612b3c457488f5a3a8fe770cdb830f4a4c74ed076937f49c50ca6a82091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb05760405162461bcd60e51b81526004016103af9061244b565b60035460ff1615610d035760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b6003805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000546001600160a01b0316331480610d7c5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610ddb5760405162461bcd60e51b815260206004820152602a60248201527f536166654465706f7369747353656e6465723a204f6e6c79204465706f7369746044820152696f72206f72205361666560b01b60648201526084016103af565b60035460ff1615610e2e5760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b60025415610e7e5760405162461bcd60e51b815260206004820152601b60248201527f536166654465706f7369747353656e6465723a2053746f70706564000000000060448201526064016103af565b838214610e9d5760405162461bcd60e51b81526004016103af906124c5565b60008111610efc5760405162461bcd60e51b815260206004820152602660248201527f536166654465706f7369747353656e6465723a20496e76616c696420534f5620604482015265185b5bdd5b9d60d21b60648201526084016103af565b606060005b85811015611a3e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878783818110610f4557610f4561251b565b9050602002016020810190610f5a9190612193565b6001600160a01b031603610fd65760405162461bcd60e51b815260206004820152603760248201527f536166654465706f7369747353656e6465723a20534f5620746f6b656e20697360448201527f207472616e736665727265642073657061726174656c7900000000000000000060648201526084016103af565b6000806001898985818110610fed57610fed61251b565b90506020020160208101906110029190612193565b6001600160a01b0316036112f2578686848181106110225761102261251b565b905060200201357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163110156110725760405162461bcd60e51b81526004016103af9061257d565b6040805160048152602481019091526020810180516001600160e01b031663439370b160e01b1790526001549094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163468721a791168989878181106110e6576110e661251b565b905060200201358760006040518563ffffffff1660e01b815260040161110f9493929190612689565b6020604051808303816000875af115801561112e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115291906126bf565b61119e5760405162461bcd60e51b815260206004820181905260248201527f436f756c64206e6f742065786563757465206574686572207472616e7366657260448201526064016103af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163191508686848181106111dd576111dd61251b565b905060200201358210611208578686848181106111fc576111fc61251b565b9050602002013561120a565b815b60405163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a79061125e90309085906000906004016126e1565b6020604051808303816000875af115801561127d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a191906126bf565b6112ed5760405162461bcd60e51b815260206004820181905260248201527f436f756c64206e6f742065786563757465206574686572207472616e7366657260448201526064016103af565b611938565b60008989858181106113065761130661251b565b905060200201602081019061131b9190612193565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919250908216906370a0823190602401602060405180830381865afa158015611385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a991906125c1565b92508787858181106113bd576113bd61251b565b905060200201358310156113e35760405162461bcd60e51b81526004016103af9061257d565b6001546001600160a01b03168888868181106114015761140161251b565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106114925761149261251b565b90506020020160208101906114a79190612193565b60008860006040518563ffffffff1660e01b81526004016114cb9493929190612689565b6020604051808303816000875af11580156114ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150e91906126bf565b6115775760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f74206170604482015273383937bb32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b8989858181106115895761158961251b565b905060200201602081019061159e9190612193565b8888868181106115b0576115b061251b565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529196506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a7926116579216906000908a908290600401612689565b6020604051808303816000875af1158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a91906126bf565b6117035760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860448201527332b1baba32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528216906370a0823190602401602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d91906125c1565b92508787858181106117a1576117a161251b565b9050602002013583106117cc578787858181106117c0576117c061251b565b905060200201356117ce565b825b6040513060248201526044810182905290925060640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106118515761185161251b565b90506020020160208101906118669190612193565b60008860006040518563ffffffff1660e01b815260040161188a9493929190612689565b6020604051808303816000875af11580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd91906126bf565b6119365760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860448201527332b1baba329032ba3432b9103a3930b739b332b960611b60648201526084016103af565b505b88888481811061194a5761194a61251b565b905060200201602081019061195f9190612193565b6001546001600160a01b0391821691167f83e351ace74af42916cc159bb2c353842d1fe21125f26f3ab645aeac206b663c8989878181106119a2576119a261251b565b905060200201356040516119b891815260200190565b60405180910390a38888848181106119d2576119d261251b565b90506020020160208101906119e79190612193565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b69282604051611a2191815260200190565b60405180910390a250508080611a36906125da565b915050610f01565b506001546040516001600160a01b0390911660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b1790525163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a790611afd907f00000000000000000000000000000000000000000000000000000000000000009060009086908290600401612689565b6020604051808303816000875af1158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4091906126bf565b611bb25760405162461bcd60e51b815260206004820152603860248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860448201527f656375746520534f5620746f6b656e207472616e73666572000000000000000060648201526084016103af565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a792611c7192169060009086908290600401612689565b6020604051808303816000875af1158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb491906126bf565b611d005760405162461bcd60e51b815260206004820152601e60248201527f436f756c64206e6f74206578656375746520534f56207472616e73666572000060448201526064016103af565b6001546040518381526001600160a01b03909116907fece2604abb1c0d8f143c1c8961c88ecda8a2c7b650545e98255665063e7321859060200160405180910390a2505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d925760405162461bcd60e51b81526004016103af9061244b565b6001600160a01b038116611db85760405162461bcd60e51b81526004016103af90612531565b6001546040516001600160a01b038084169216907f571b0cfddc37eea7ea50ec6529f701f4c53e523eb459eb1238fb38a16fee9d4490600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e5e5760405162461bcd60e51b81526004016103af9061244b565b611e6d85858585600019611ecd565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611ec8908490611f12565b505050565b60006001836001811115611ee357611ee3612651565b03611efb576000808551602087018986f49050611e6d565b600080855160208701888a87f19695505050505050565b6000611f67826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fe79092919063ffffffff16565b9050805160001480611f88575080806020019051810190611f8891906126bf565b611ec85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103af565b6060611ff68484600085611ffe565b949350505050565b60608247101561205f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103af565b600080866001600160a01b0316858760405161207b9190612714565b60006040518083038185875af1925050503d80600081146120b8576040519150601f19603f3d011682016040523d82523d6000602084013e6120bd565b606091505b50915091506120ce878383876120d9565b979650505050505050565b60608315612148578251600003612141576001600160a01b0385163b6121415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103af565b5081611ff6565b611ff6838381511561215d5781518083602001fd5b8060405162461bcd60e51b81526004016103af9190612730565b80356001600160a01b038116811461218e57600080fd5b919050565b6000602082840312156121a557600080fd5b6121ae82612177565b9392505050565b60008083601f8401126121c757600080fd5b50813567ffffffffffffffff8111156121df57600080fd5b6020830191508360208260051b85010111156121fa57600080fd5b9250929050565b60008060008060006060868803121561221957600080fd5b853567ffffffffffffffff8082111561223157600080fd5b61223d89838a016121b5565b9097509550602088013591508082111561225657600080fd5b50612263888289016121b5565b9094509250612276905060408701612177565b90509295509295909350565b60008060006040848603121561229757600080fd5b833567ffffffffffffffff8111156122ae57600080fd5b6122ba868287016121b5565b90945092506122cd905060208501612177565b90509250925092565b6000806000806000606086880312156122ee57600080fd5b853567ffffffffffffffff8082111561230657600080fd5b61231289838a016121b5565b9097509550602088013591508082111561232b57600080fd5b50612338888289016121b5565b96999598509660400135949350505050565b634e487b7160e01b600052604160045260246000fd5b80356002811061218e57600080fd5b6000806000806080858703121561238557600080fd5b61238e85612177565b935060208501359250604085013567ffffffffffffffff808211156123b257600080fd5b818701915087601f8301126123c657600080fd5b8135818111156123d8576123d861234a565b604051601f8201601f19908116603f011681019083821181831017156124005761240061234a565b816040528281528a602084870101111561241957600080fd5b82602086016020830137600060208483010152809650505050505061244060608601612360565b905092959194509250565b6020808252601d908201527f536166654465706f7369747353656e6465723a204f6e6c792053616665000000604082015260600190565b60208082526023908201527f536166654465706f7369747353656e6465723a20496e76616c6964206164647260408201526265737360e81b606082015260800190565b60208082526036908201527f536166654465706f7369747353656e6465723a20546f6b656e7320616e6420616040820152750dadeeadce8e640d8cadccee8d040dad2e6dac2e8c6d60531b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602c908201527f536166654465706f7369747353656e6465723a205a65726f206164647265737360408201526b081b9bdd08185b1b1bddd95960a21b606082015260800190565b60208082526024908201527f536166654465706f7369747353656e6465723a204e6f7420656e6f7567682066604082015263756e647360e01b606082015260800190565b6000602082840312156125d357600080fd5b5051919050565b6000600182016125fa57634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101561261c578181015183820152602001612604565b50506000910152565b6000815180845261263d816020860160208601612601565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6002811061268557634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b03851681528360208201526080604082015260006126b06080830185612625565b9050611e6d6060830184612667565b6000602082840312156126d157600080fd5b815180151581146121ae57600080fd5b6001600160a01b03841681526020810183905260806040820181905260009082015260a08101611ff66060830184612667565b60008251612726818460208701612601565b9190910192915050565b6020815260006121ae602083018461262556fea26469706673582212205bd108632d08017188fc8a3d5d9535771e368df489c9effd42cd2a6ab1ceeb8e64736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061010d5760003560e01c80635d9dac1011610095578063b187bd2611610064578063b187bd26146102be578063b6e7377d146102d6578063d17b8f98146102f6578063d7c3e7b314610329578063f5f52e2e1461034957600080fd5b80635d9dac101461024b578063813ddbf41461026b5780638456cb5914610289578063af0776521461029e57600080fd5b8063397a079b116100dc578063397a079b146101a25780633f4ba83a146101c25780633f683b6a146101d75780634768b497146101fa5780634bcfe7261461021857600080fd5b806307da68f5146101195780631878d1f1146101305780631d1372e41461016257806326f915061461018257600080fd5b3661011457005b600080fd5b34801561012557600080fd5b5061012e610367565b005b34801561013c57600080fd5b50610145600181565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016e57600080fd5b5061012e61017d366004612193565b6103e7565b34801561018e57600080fd5b5061012e61019d366004612201565b610420565b3480156101ae57600080fd5b5061012e6101bd366004612282565b61085f565b3480156101ce57600080fd5b5061012e610af6565b3480156101e357600080fd5b5060025415155b6040519015158152602001610159565b34801561020657600080fd5b506000546001600160a01b0316610145565b34801561022457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561025757600080fd5b5061012e610266366004612193565b610bc5565b34801561027757600080fd5b506001546001600160a01b0316610145565b34801561029557600080fd5b5061012e610c68565b3480156102aa57600080fd5b5061012e6102b93660046122d6565b610d3b565b3480156102ca57600080fd5b5060035460ff166101ea565b3480156102e257600080fd5b5061012e6102f1366004612193565b611d4a565b34801561030257600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610145565b34801561033557600080fd5b506101ea61034436600461236f565b611e14565b34801561035557600080fd5b50600254604051908152602001610159565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b85760405162461bcd60e51b81526004016103af9061244b565b60405180910390fd5b436002556040517fbedf0f4abfe86d4ffad593d9607fe70e83ea706033d44d24b3b6283cf3fc4f6b90600090a1565b6040516001600160a01b0382169033907f256f07b5eef8212c06c8cbb78abeb76d2b66770a68e81686fd14c3a0454551e190600090a350565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104685760405162461bcd60e51b81526004016103af9061244b565b806001600160a01b03811661048f5760405162461bcd60e51b81526004016103af90612482565b8483146104ae5760405162461bcd60e51b81526004016103af906124c5565b60005b858110156108565760008787838181106104cd576104cd61251b565b90506020020160208101906104e29190612193565b6001600160a01b0316036105085760405162461bcd60e51b81526004016103af90612531565b84848281811061051a5761051a61251b565b905060200201356000036105845760405162461bcd60e51b815260206004820152602b60248201527f536166654465706f7369747353656e6465723a205a65726f20616d6f756e742060448201526a1b9bdd08185b1b1bddd95960aa1b60648201526084016103af565b60018787838181106105985761059861251b565b90506020020160208101906105ad9190612193565b6001600160a01b0316036106af578484828181106105cd576105cd61251b565b905060200201354710156105f35760405162461bcd60e51b81526004016103af9061257d565b6000836001600160a01b03168686848181106106115761061161251b565b9050602002013560405160006040518083038185875af1925050503d8060008114610658576040519150601f19603f3d011682016040523d82523d6000602084013e61065d565b606091505b50509050806106a95760405162461bcd60e51b815260206004820152601860248201527721b7bab632103737ba103bb4ba34323930bb9032ba3432b960411b60448201526064016103af565b50610844565b60008787838181106106c3576106c361251b565b90506020020160208101906106d89190612193565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610722573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074691906125c1565b905086868481811061075a5761075a61251b565b905060200201358110156107805760405162461bcd60e51b81526004016103af9061257d565b6107b6858888868181106107965761079661251b565b90506020020135846001600160a01b0316611e769092919063ffffffff16565b8888848181106107c8576107c861251b565b90506020020160208101906107dd9190612193565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8989878181106108235761082361251b565b9050602002013560405161083991815260200190565b60405180910390a350505b8061084e816125da565b9150506104b1565b50505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108a75760405162461bcd60e51b81526004016103af9061244b565b806001600160a01b0381166108ce5760405162461bcd60e51b81526004016103af90612482565b60005b83811015610aef5760018585838181106108ed576108ed61251b565b90506020020160208101906109029190612193565b6001600160a01b0316036109b4576000836001600160a01b03164760405160006040518083038185875af1925050503d806000811461095d576040519150601f19603f3d011682016040523d82523d6000602084013e610962565b606091505b50509050806109ae5760405162461bcd60e51b815260206004820152601860248201527721b7bab632103737ba103bb4ba34323930bb9032ba3432b960411b60448201526064016103af565b50610add565b60008585838181106109c8576109c861251b565b90506020020160208101906109dd9190612193565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4b91906125c1565b90508015610a6757610a676001600160a01b0383168683611e76565b868684818110610a7957610a7961251b565b9050602002016020810190610a8e9190612193565b6001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb83604051610ad291815260200190565b60405180910390a350505b80610ae7816125da565b9150506108d1565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3e5760405162461bcd60e51b81526004016103af9061244b565b60035460ff16610b905760405162461bcd60e51b815260206004820152601e60248201527f536166654465706f7369747353656e6465723a204e6f7420706175736564000060448201526064016103af565b6003805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c0d5760405162461bcd60e51b81526004016103af9061244b565b600080546040516001600160a01b03808516939216917fad63b85612b3c457488f5a3a8fe770cdb830f4a4c74ed076937f49c50ca6a82091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb05760405162461bcd60e51b81526004016103af9061244b565b60035460ff1615610d035760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b6003805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000546001600160a01b0316331480610d7c5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610ddb5760405162461bcd60e51b815260206004820152602a60248201527f536166654465706f7369747353656e6465723a204f6e6c79204465706f7369746044820152696f72206f72205361666560b01b60648201526084016103af565b60035460ff1615610e2e5760405162461bcd60e51b815260206004820152601a60248201527f536166654465706f7369747353656e6465723a2050617573656400000000000060448201526064016103af565b60025415610e7e5760405162461bcd60e51b815260206004820152601b60248201527f536166654465706f7369747353656e6465723a2053746f70706564000000000060448201526064016103af565b838214610e9d5760405162461bcd60e51b81526004016103af906124c5565b60008111610efc5760405162461bcd60e51b815260206004820152602660248201527f536166654465706f7369747353656e6465723a20496e76616c696420534f5620604482015265185b5bdd5b9d60d21b60648201526084016103af565b606060005b85811015611a3e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316878783818110610f4557610f4561251b565b9050602002016020810190610f5a9190612193565b6001600160a01b031603610fd65760405162461bcd60e51b815260206004820152603760248201527f536166654465706f7369747353656e6465723a20534f5620746f6b656e20697360448201527f207472616e736665727265642073657061726174656c7900000000000000000060648201526084016103af565b6000806001898985818110610fed57610fed61251b565b90506020020160208101906110029190612193565b6001600160a01b0316036112f2578686848181106110225761102261251b565b905060200201357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163110156110725760405162461bcd60e51b81526004016103af9061257d565b6040805160048152602481019091526020810180516001600160e01b031663439370b160e01b1790526001549094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163468721a791168989878181106110e6576110e661251b565b905060200201358760006040518563ffffffff1660e01b815260040161110f9493929190612689565b6020604051808303816000875af115801561112e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115291906126bf565b61119e5760405162461bcd60e51b815260206004820181905260248201527f436f756c64206e6f742065786563757465206574686572207472616e7366657260448201526064016103af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163191508686848181106111dd576111dd61251b565b905060200201358210611208578686848181106111fc576111fc61251b565b9050602002013561120a565b815b60405163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a79061125e90309085906000906004016126e1565b6020604051808303816000875af115801561127d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a191906126bf565b6112ed5760405162461bcd60e51b815260206004820181905260248201527f436f756c64206e6f742065786563757465206574686572207472616e7366657260448201526064016103af565b611938565b60008989858181106113065761130661251b565b905060200201602081019061131b9190612193565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919250908216906370a0823190602401602060405180830381865afa158015611385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a991906125c1565b92508787858181106113bd576113bd61251b565b905060200201358310156113e35760405162461bcd60e51b81526004016103af9061257d565b6001546001600160a01b03168888868181106114015761140161251b565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106114925761149261251b565b90506020020160208101906114a79190612193565b60008860006040518563ffffffff1660e01b81526004016114cb9493929190612689565b6020604051808303816000875af11580156114ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150e91906126bf565b6115775760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f74206170604482015273383937bb32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b8989858181106115895761158961251b565b905060200201602081019061159e9190612193565b8888868181106115b0576115b061251b565b6040516001600160a01b039094166024850152602002919091013560448301525060640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529196506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a7926116579216906000908a908290600401612689565b6020604051808303816000875af1158015611676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169a91906126bf565b6117035760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860448201527332b1baba32903a37b5b2b7103a3930b739b332b960611b60648201526084016103af565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528216906370a0823190602401602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d91906125c1565b92508787858181106117a1576117a161251b565b9050602002013583106117cc578787858181106117c0576117c061251b565b905060200201356117ce565b825b6040513060248201526044810182905290925060640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b17905294506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663468721a78b8b878181106118515761185161251b565b90506020020160208101906118669190612193565b60008860006040518563ffffffff1660e01b815260040161188a9493929190612689565b6020604051808303816000875af11580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd91906126bf565b6119365760405162461bcd60e51b815260206004820152603460248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860448201527332b1baba329032ba3432b9103a3930b739b332b960611b60648201526084016103af565b505b88888481811061194a5761194a61251b565b905060200201602081019061195f9190612193565b6001546001600160a01b0391821691167f83e351ace74af42916cc159bb2c353842d1fe21125f26f3ab645aeac206b663c8989878181106119a2576119a261251b565b905060200201356040516119b891815260200190565b60405180910390a38888848181106119d2576119d261251b565b90506020020160208101906119e79190612193565b6001600160a01b03167f2217f1638c9922c1b7608f3e57b1f418e86204e8dd975c4ca5bd4fbcb270b69282604051611a2191815260200190565b60405180910390a250508080611a36906125da565b915050610f01565b506001546040516001600160a01b0390911660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b1790525163468721a760e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063468721a790611afd907f00000000000000000000000000000000000000000000000000000000000000009060009086908290600401612689565b6020604051808303816000875af1158015611b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4091906126bf565b611bb25760405162461bcd60e51b815260206004820152603860248201527f536166654465706f7369747353656e6465723a20436f756c64206e6f7420657860448201527f656375746520534f5620746f6b656e207472616e73666572000000000000000060648201526084016103af565b6040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905260640160408051601f198184030181529181526020820180516001600160e01b0316634bff5c9360e11b179052600154905163468721a760e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263468721a792611c7192169060009086908290600401612689565b6020604051808303816000875af1158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb491906126bf565b611d005760405162461bcd60e51b815260206004820152601e60248201527f436f756c64206e6f74206578656375746520534f56207472616e73666572000060448201526064016103af565b6001546040518381526001600160a01b03909116907fece2604abb1c0d8f143c1c8961c88ecda8a2c7b650545e98255665063e7321859060200160405180910390a2505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d925760405162461bcd60e51b81526004016103af9061244b565b6001600160a01b038116611db85760405162461bcd60e51b81526004016103af90612531565b6001546040516001600160a01b038084169216907f571b0cfddc37eea7ea50ec6529f701f4c53e523eb459eb1238fb38a16fee9d4490600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e5e5760405162461bcd60e51b81526004016103af9061244b565b611e6d85858585600019611ecd565b95945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611ec8908490611f12565b505050565b60006001836001811115611ee357611ee3612651565b03611efb576000808551602087018986f49050611e6d565b600080855160208701888a87f19695505050505050565b6000611f67826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611fe79092919063ffffffff16565b9050805160001480611f88575080806020019051810190611f8891906126bf565b611ec85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103af565b6060611ff68484600085611ffe565b949350505050565b60608247101561205f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103af565b600080866001600160a01b0316858760405161207b9190612714565b60006040518083038185875af1925050503d80600081146120b8576040519150601f19603f3d011682016040523d82523d6000602084013e6120bd565b606091505b50915091506120ce878383876120d9565b979650505050505050565b60608315612148578251600003612141576001600160a01b0385163b6121415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103af565b5081611ff6565b611ff6838381511561215d5781518083602001fd5b8060405162461bcd60e51b81526004016103af9190612730565b80356001600160a01b038116811461218e57600080fd5b919050565b6000602082840312156121a557600080fd5b6121ae82612177565b9392505050565b60008083601f8401126121c757600080fd5b50813567ffffffffffffffff8111156121df57600080fd5b6020830191508360208260051b85010111156121fa57600080fd5b9250929050565b60008060008060006060868803121561221957600080fd5b853567ffffffffffffffff8082111561223157600080fd5b61223d89838a016121b5565b9097509550602088013591508082111561225657600080fd5b50612263888289016121b5565b9094509250612276905060408701612177565b90509295509295909350565b60008060006040848603121561229757600080fd5b833567ffffffffffffffff8111156122ae57600080fd5b6122ba868287016121b5565b90945092506122cd905060208501612177565b90509250925092565b6000806000806000606086880312156122ee57600080fd5b853567ffffffffffffffff8082111561230657600080fd5b61231289838a016121b5565b9097509550602088013591508082111561232b57600080fd5b50612338888289016121b5565b96999598509660400135949350505050565b634e487b7160e01b600052604160045260246000fd5b80356002811061218e57600080fd5b6000806000806080858703121561238557600080fd5b61238e85612177565b935060208501359250604085013567ffffffffffffffff808211156123b257600080fd5b818701915087601f8301126123c657600080fd5b8135818111156123d8576123d861234a565b604051601f8201601f19908116603f011681019083821181831017156124005761240061234a565b816040528281528a602084870101111561241957600080fd5b82602086016020830137600060208483010152809650505050505061244060608601612360565b905092959194509250565b6020808252601d908201527f536166654465706f7369747353656e6465723a204f6e6c792053616665000000604082015260600190565b60208082526023908201527f536166654465706f7369747353656e6465723a20496e76616c6964206164647260408201526265737360e81b606082015260800190565b60208082526036908201527f536166654465706f7369747353656e6465723a20546f6b656e7320616e6420616040820152750dadeeadce8e640d8cadccee8d040dad2e6dac2e8c6d60531b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602c908201527f536166654465706f7369747353656e6465723a205a65726f206164647265737360408201526b081b9bdd08185b1b1bddd95960a21b606082015260800190565b60208082526024908201527f536166654465706f7369747353656e6465723a204e6f7420656e6f7567682066604082015263756e647360e01b606082015260800190565b6000602082840312156125d357600080fd5b5051919050565b6000600182016125fa57634e487b7160e01b600052601160045260246000fd5b5060010190565b60005b8381101561261c578181015183820152602001612604565b50506000910152565b6000815180845261263d816020860160208601612601565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6002811061268557634e487b7160e01b600052602160045260246000fd5b9052565b60018060a01b03851681528360208201526080604082015260006126b06080830185612625565b9050611e6d6060830184612667565b6000602082840312156126d157600080fd5b815180151581146121ae57600080fd5b6001600160a01b03841681526020810183905260806040820181905260009082015260a08101611ff66060830184612667565b60008251612726818460208701612601565b9190910192915050565b6020815260006121ae602083018461262556fea26469706673582212205bd108632d08017188fc8a3d5d9535771e368df489c9effd42cd2a6ab1ceeb8e64736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_depositor": "Address of the depositor account", + "_lockDrop": "Address of the BOB FusionLock contract", + "_safeAddress": "Address of the Gnosis Safe", + "_sovToken": "Address of the SOV token contract" + } + }, + "execTransactionFromSafe(address,uint256,bytes,uint8)": { + "params": { + "data": "Data payload of module transaction.", + "operation": "Operation type of module transaction.", + "to": "Destination address of module transaction.", + "value": "Ether value of module transaction." + }, + "returns": { + "success": "Boolean flag indicating if the call succeeded." + } + }, + "mapDepositorToReceiver(address)": { + "params": { + "receiver": "Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB" + } + }, + "sendToLockDropContract(address[],uint256[],uint256)": { + "details": "This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEXThe function is allowed to be called only by the lockdropDepositorAddressToken amounts and SOV amount to send are calculated offchain", + "params": { + "amounts": "List of amounts of tokens to send", + "sovAmount": "Amount of SOV tokens to send", + "tokens": "List of tokens to send" + } + }, + "setDepositorAddress(address)": { + "details": "Only Safe can call this functionNew depositor can be zero address", + "params": { + "_newDepositor": "New depositor address" + } + }, + "setLockDropAddress(address)": { + "details": "Only Safe can call this functionNew LockDrop can't be zero address", + "params": { + "_newLockdrop": "New depositor address" + } + }, + "withdraw(address[],uint256[],address)": { + "details": "Only Safe can call this functionRecipient should not be a zero address", + "params": { + "amounts": "List of token amounts to withdraw", + "recipient": "Recipient address", + "tokens": "List of token addresses to withdraw" + } + }, + "withdrawAll(address[],address)": { + "details": "Only Safe can call this functionRecipient should not be a zero address", + "params": { + "recipient": "Recipient address", + "tokens": "List of token addresses to withdraw" + } + } + }, + "title": "SafeDepositsSender", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "execTransactionFromSafe(address,uint256,bytes,uint8)": { + "notice": "Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe" + }, + "mapDepositorToReceiver(address)": { + "notice": "Maps depositor on ethereum to receiver on BOBReceiver from the last emitted event called by msg.sender will be used" + }, + "pause()": { + "notice": "pause the contract - no funds can be sent to the LockDrop contract" + }, + "sendToLockDropContract(address[],uint256[],uint256)": { + "notice": "Sends tokens to the LockDrop contract" + }, + "setDepositorAddress(address)": { + "notice": "Sets new depositor address" + }, + "setLockDropAddress(address)": { + "notice": "Sets new LockDrop address" + }, + "stop()": { + "notice": "stops the contract - no funds can be sent to the LockDrop contract, this is irreversible" + }, + "unpause()": { + "notice": "unpause the contract" + }, + "withdraw(address[],uint256[],address)": { + "notice": "Withdraws tokens from this contract to a recipient addressWithdrawal to the Safe address will affect balances and rewardsAmount > 0 should be checked by the caller before calling this function" + }, + "withdrawAll(address[],address)": { + "notice": "Withdraws all tokens from this contract to a recipientAmount > 0 should be checked by the caller before calling this functionWithdrawal to the Safe address will affect balances and rewards" + } + }, + "notice": "This contract is a gateway for depositing funds into the Bob locker contracts", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 865, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "lockdropDepositorAddress", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 867, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "lockDropAddress", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 869, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "stopBlock", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 871, + "contract": "contracts/integrations/bob/SafeDepositsSender.sol:SafeDepositsSender", + "label": "paused", + "offset": 0, + "slot": "3", + "type": "t_bool" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/278fa9759bca8e7b6d4d08799392c56d.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/278fa9759bca8e7b6d4d08799392c56d.json new file mode 100644 index 000000000..4fda4c5b5 --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/278fa9759bca8e7b6d4d08799392c56d.json @@ -0,0 +1,55 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n * doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n * token.safeTransferFrom(msg.sender, address(this), value);\n * ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n *\n * CAUTION: See Security Considerations above.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n using Address for address;\n\n /**\n * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeTransfer(IERC20 token, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n /**\n * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n */\n function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(IERC20 token, address spender, uint256 value) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n /**\n * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n uint256 oldAllowance = token.allowance(address(this), spender);\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n }\n\n /**\n * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful.\n */\n function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n }\n }\n\n /**\n * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n * to be set to zero before setting it to a non-zero value, such as USDT.\n */\n function forceApprove(IERC20 token, address spender, uint256 value) internal {\n bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n if (!_callOptionalReturnBool(token, approvalCall)) {\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n _callOptionalReturn(token, approvalCall);\n }\n }\n\n /**\n * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n * Revert on invalid signature.\n */\n function safePermit(\n IERC20Permit token,\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal {\n uint256 nonceBefore = token.nonces(owner);\n token.permit(owner, spender, value, deadline, v, r, s);\n uint256 nonceAfter = token.nonces(owner);\n require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n *\n * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n */\n function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n // and not revert is the subcall reverts.\n\n (bool success, bytes memory returndata) = address(token).call(data);\n return\n success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\nimport { SafeERC20, IERC20 } from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\n\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n using SafeERC20 for IERC20;\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private lockdropDepositorAddress; // address used by automation script to deposit to the LockDrop contract\n address private lockDropAddress;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the BOB FusionLock contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n SOV_TOKEN_ADDRESS = _sovToken;\n lockdropDepositorAddress = _depositor;\n lockDropAddress = _lockDrop;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == lockdropDepositorAddress, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == lockdropDepositorAddress || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the lockdropDepositorAddress\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n uint256 transferAmount;\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n transferAmount = balance < amounts[i] ? balance : amounts[i];\n require(\n SAFE.execTransactionFromModule(\n address(this),\n transferAmount,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20 token = IERC20(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n lockDropAddress,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n transferAmount = balance < amounts[i] ? balance : amounts[i];\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n transferAmount\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], transferAmount);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", lockDropAddress, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /**\n * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) from Safe\n * @param to Destination address of module transaction.\n * @param value Ether value of module transaction.\n * @param data Data payload of module transaction.\n * @param operation Operation type of module transaction.\n * @return success Boolean flag indicating if the call succeeded.\n */\n function execTransactionFromSafe(\n address to,\n uint256 value,\n bytes memory data,\n GnosisSafe.Operation operation\n ) external onlySafe returns (bool success) {\n success = execute(to, value, data, operation, type(uint256).max);\n }\n\n /**\n * @notice Executes either a delegatecall or a call with provided parameters.\n * @dev This method doesn't perform any sanity check of the transaction, such as:\n * - if the contract at `to` address has code or not\n * It is the responsibility of the caller to perform such checks.\n * @param to Destination address.\n * @param value Ether value.\n * @param data Data payload.\n * @param operation Operation type.\n * @return success boolean flag indicating if the call succeeded.\n */\n function execute(\n address to,\n uint256 value,\n bytes memory data,\n GnosisSafe.Operation operation,\n uint256 txGas\n ) internal returns (bool success) {\n if (operation == GnosisSafe.Operation.DelegateCall) {\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0)\n }\n /* solhint-enable no-inline-assembly */\n } else {\n /* solhint-disable no-inline-assembly */\n /// @solidity memory-safe-assembly\n assembly {\n success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0)\n }\n /* solhint-enable no-inline-assembly */\n }\n }\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(lockdropDepositorAddress, _newDepositor);\n lockdropDepositorAddress = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\n lockDropAddress = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20 token = IERC20(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.safeTransfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == ETH_TOKEN_ADDRESS) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20 token = IERC20(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.safeTransfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return lockDropAddress;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return lockdropDepositorAddress;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/62f7bd5da3d403db52f5aff49c2058e9.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/62f7bd5da3d403db52f5aff49c2058e9.json new file mode 100644 index 000000000..bcc4bc5a7 --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/62f7bd5da3d403db52f5aff49c2058e9.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event setDepositor(address indexed oldDepositor, address indexed newDepositor);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable LOCK_DROP_ADDRESS;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit setDepositor(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/7fe2afa5429d227cb4a980a9d8e1dada.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/7fe2afa5429d227cb4a980a9d8e1dada.json new file mode 100644 index 000000000..72879a853 --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/7fe2afa5429d227cb4a980a9d8e1dada.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private LOCK_DROP_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external onlyDepositorOrSafe {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(LOCK_DROP_ADDRESS, _newLockdrop);\n LOCK_DROP_ADDRESS = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/aec0f60040756534b0a1649fac401198.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/aec0f60040756534b0a1649fac401198.json new file mode 100644 index 000000000..bbcae0d56 --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/aec0f60040756534b0a1649fac401198.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event setDepositor(address oldDepositor, address newDepositor);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable LOCK_DROP_ADDRESS;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositor whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit setDepositor(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/af4f85548a4a6b0588c6c13bac974dc1.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/af4f85548a4a6b0588c6c13bac974dc1.json new file mode 100644 index 000000000..548e93f8c --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/af4f85548a4a6b0588c6c13bac974dc1.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event setDepositor(address indexed oldDepositor, address indexed newDepositor);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable LOCK_DROP_ADDRESS;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositor whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit setDepositor(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/b56b8eb6690792f979c902816cf00985.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/b56b8eb6690792f979c902816cf00985.json new file mode 100644 index 000000000..62abacd94 --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/b56b8eb6690792f979c902816cf00985.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed lockDrop, address indexed token, uint256 amount);\n event DepositSOVToLockdrop(address indexed lockDrop, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event Pause();\n event Unpause();\n event Stop();\n event SetDepositorAddress(address indexed oldDepositor, address indexed newDepositor);\n event SetLockDropAddress(address indexed oldLockDrop, address indexed newLockDrop);\n event MapDepositorToReceiver(address indexed depositor, address indexed receiver);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n address private lockDropAddress;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n lockDropAddress = _lockDrop;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier whenNotPaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier whenPaused() {\n require(paused, \"SafeDepositsSender: Not paused\");\n _;\n }\n\n modifier whenUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: Stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositorOrSafe whenNotPaused whenUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n lockDropAddress,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not approve token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n lockDropAddress,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"SafeDepositsSender: Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = token.balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(lockDropAddress, tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", lockDropAddress, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"SafeDepositsSender: Could not execute SOV token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(lockDropAddress, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(lockDropAddress, sovAmount);\n }\n\n /// @notice Maps depositor on ethereum to receiver on BOB\n /// @notice Receiver from the last emitted event called by msg.sender will be used\n /// @param receiver Receiver address on BOB. The depositor address will be replaced with the receiver address for distribution of LP tokens and rewards on BOB\n function mapDepositorToReceiver(address receiver) external onlyDepositorOrSafe {\n emit MapDepositorToReceiver(msg.sender, receiver);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit SetDepositorAddress(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Sets new LockDrop address\n * @dev Only Safe can call this function\n * @dev New LockDrop can't be zero address\n * @param _newLockdrop New depositor address\n */\n function setLockDropAddress(address _newLockdrop) external onlySafe {\n require(_newLockdrop != address(0), \"SafeDepositsSender: Zero address not allowed\");\n emit SetLockDropAddress(lockDropAddress, _newLockdrop);\n lockDropAddress = _newLockdrop;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(tokens[i] != address(0x00), \"SafeDepositsSender: Zero address not allowed\");\n require(amounts[i] != 0, \"SafeDepositsSender: Zero amount not allowed\");\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe whenNotPaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe whenPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return lockDropAddress;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/d45a8663d52a61bec0dc17898e4e8c2c.json b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/d45a8663d52a61bec0dc17898e4e8c2c.json new file mode 100644 index 000000000..61fdcb562 --- /dev/null +++ b/deployment/deployments/tenderlyForkedEthMainnet/solcInputs/d45a8663d52a61bec0dc17898e4e8c2c.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "contracts/integrations/bob/interfaces/ISafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\ninterface ISafeDepositsSender {\n event Withdraw(address indexed from, address indexed token, uint256 amount);\n event DepositToLockdrop(address indexed token, uint256 amount);\n event WithdrawBalanceFromSafe(address indexed token, uint256 balance);\n event DepositSOVToLockdrop(uint256 amount);\n event Pause();\n event Unpause();\n event Stop();\n event setDepositor(address oldDepositor, address newDepositor);\n\n function getSafeAddress() external view returns (address);\n function getLockDropAddress() external view returns (address);\n function getSovTokenAddress() external view returns (address);\n function getDepositorAddress() external view returns (address);\n function isStopped() external view returns (bool);\n function isPaused() external view returns (bool);\n\n // @note amount > 0 should be checked by the caller\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external;\n\n function withdrawAll(address[] calldata tokens, address recipient) external;\n\n function pause() external;\n\n function unpause() external;\n\n function stop() external;\n\n function setDepositorAddress(address _newDepositor) external;\n\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external;\n}\n" + }, + "contracts/integrations/bob/SafeDepositsSender.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.17;\n\nimport { ISafeDepositsSender } from \"./interfaces/ISafeDepositsSender.sol\";\n\ninterface IERC20Spec {\n function balanceOf(address _who) external view returns (uint256);\n function transfer(address _to, uint256 _value) external returns (bool);\n}\ninterface GnosisSafe {\n enum Operation {\n Call,\n DelegateCall\n }\n\n /// @dev Allows a Module to execute a Safe transaction without any further confirmations.\n /// @param to Destination address of module transaction.\n /// @param value Ether value of module transaction.\n /// @param data Data payload of module transaction.\n /// @param operation Operation type of module transaction.\n function execTransactionFromModule(\n address to,\n uint256 value,\n bytes calldata data,\n Operation operation\n ) external returns (bool success);\n}\n\n/**\n * @title SafeDepositsSender\n * @notice This contract is a gateway for depositing funds into the Bob locker contracts\n */\ncontract SafeDepositsSender is ISafeDepositsSender {\n address public constant ETH_TOKEN_ADDRESS = address(0x01);\n\n GnosisSafe private immutable SAFE;\n address private immutable LOCK_DROP_ADDRESS;\n address private immutable SOV_TOKEN_ADDRESS;\n address private DEPOSITOR_ADDRESS;\n uint256 private stopBlock; // if set the contract is stopped forever - irreversible\n bool private paused;\n\n /**\n * @param _safeAddress Address of the Gnosis Safe\n * @param _lockDrop Address of the lock drop contract\n * @param _sovToken Address of the SOV token contract\n * @param _depositor Address of the depositor account\n */\n constructor(address _safeAddress, address _lockDrop, address _sovToken, address _depositor) {\n require(_safeAddress != address(0), \"SafeDepositsSender: Invalid safe address\");\n require(_lockDrop != address(0), \"SafeDepositsSender: Invalid lockdrop address\");\n require(_sovToken != address(0), \"SafeDepositsSender: Invalid sov token address\");\n require(_depositor != address(0), \"SafeDepositsSender: Invalid depositor token address\");\n SAFE = GnosisSafe(_safeAddress);\n LOCK_DROP_ADDRESS = _lockDrop;\n SOV_TOKEN_ADDRESS = _sovToken;\n DEPOSITOR_ADDRESS = _depositor;\n }\n\n receive() external payable {}\n\n // MODIFIERS //\n\n modifier onlySafe() {\n require(msg.sender == address(SAFE), \"SafeDepositsSender: Only Safe\");\n _;\n }\n\n modifier onlyDepositor() {\n require(msg.sender == DEPOSITOR_ADDRESS, \"SafeDepositsSender: Only Depositor\");\n _;\n }\n\n modifier onlyDepositorOrSafe() {\n require(\n msg.sender == DEPOSITOR_ADDRESS || msg.sender == address(SAFE),\n \"SafeDepositsSender: Only Depositor or Safe\"\n );\n _;\n }\n\n modifier expectUnpaused() {\n require(!paused, \"SafeDepositsSender: Paused\");\n _;\n }\n\n modifier expectPaused() {\n require(paused, \"SafeDepositsSender: unpaused\");\n _;\n }\n\n modifier expectUnstopped() {\n require(stopBlock == 0, \"SafeDepositsSender: stopped\");\n _;\n }\n\n modifier notZeroAddress(address _address) {\n require(_address != address(0), \"SafeDepositsSender: Invalid address\");\n _;\n }\n\n // CORE FUNCTIONS\n\n /**\n * @notice Sends tokens to the LockDrop contract\n * @dev This function is for sending tokens to the LockDrop contract for users to receive rewards and to be bridged to the BOB mainnet for Sovryn DEX\n * @dev The function is allowed to be called only by the DEPOSITOR_ADDRESS\n * @dev Token amounts and SOV amount to send are calculated offchain\n * @param tokens List of tokens to send\n * @param amounts List of amounts of tokens to send\n * @param sovAmount Amount of SOV tokens to send\n */\n function sendToLockDropContract(\n address[] calldata tokens,\n uint256[] calldata amounts,\n uint256 sovAmount\n ) external onlyDepositor expectUnpaused expectUnstopped {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n require(sovAmount > 0, \"SafeDepositsSender: Invalid SOV amount\");\n\n bytes memory data;\n\n for (uint256 i = 0; i < tokens.length; i++) {\n require(\n tokens[i] != SOV_TOKEN_ADDRESS,\n \"SafeDepositsSender: SOV token is transferred separately\"\n );\n\n // transfer native token\n uint256 balance;\n if (tokens[i] == address(0x01)) {\n require(\n address(SAFE).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n data = abi.encodeWithSignature(\"depositEth()\");\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n amounts[i],\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n amounts[i]\n );\n balance = address(SAFE).balance;\n require(\n SAFE.execTransactionFromModule(\n address(this),\n balance,\n \"\",\n GnosisSafe.Operation.Call\n ),\n \"Could not execute ether transfer\"\n );\n } else {\n // transfer ERC20 tokens\n IERC20Spec token = IERC20Spec(tokens[i]);\n balance = token.balanceOf(address(SAFE));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n data = abi.encodeWithSignature(\n \"approve(address,uint256)\",\n LOCK_DROP_ADDRESS,\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n tokens[i],\n amounts[i]\n );\n require(\n SAFE.execTransactionFromModule(\n LOCK_DROP_ADDRESS,\n 0,\n data,\n GnosisSafe.Operation.Call\n ),\n \"Could not execute token transfer\"\n );\n\n // withdraw balance to this contract left after deposit to the LockDrop\n balance = IERC20Spec(tokens[i]).balanceOf(address(SAFE));\n data = abi.encodeWithSignature(\n \"transfer(address,uint256)\",\n address(this),\n balance\n );\n require(\n SAFE.execTransactionFromModule(tokens[i], 0, data, GnosisSafe.Operation.Call),\n \"Could not execute ether transfer\"\n );\n }\n emit DepositToLockdrop(tokens[i], amounts[i]);\n emit WithdrawBalanceFromSafe(tokens[i], balance);\n }\n\n // transfer SOV\n data = abi.encodeWithSignature(\"approve(address,uint256)\", LOCK_DROP_ADDRESS, sovAmount);\n require(\n SAFE.execTransactionFromModule(SOV_TOKEN_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute token transfer\"\n );\n data = abi.encodeWithSignature(\n \"depositERC20(address,uint256)\",\n SOV_TOKEN_ADDRESS,\n sovAmount\n );\n require(\n SAFE.execTransactionFromModule(LOCK_DROP_ADDRESS, 0, data, GnosisSafe.Operation.Call),\n \"Could not execute SOV transfer\"\n );\n\n emit DepositSOVToLockdrop(sovAmount);\n }\n\n // ADMINISTRATIVE FUNCTIONS //\n\n /// @notice There is no check if _newDepositor is not zero on purpose - that could be required\n\n /**\n * @notice Sets new depositor address\n * @dev Only Safe can call this function\n * @dev New depositor can be zero address\n * @param _newDepositor New depositor address\n */\n function setDepositorAddress(address _newDepositor) external onlySafe {\n emit setDepositor(DEPOSITOR_ADDRESS, _newDepositor);\n DEPOSITOR_ADDRESS = _newDepositor;\n }\n\n /**\n * @notice Withdraws tokens from this contract to a recipient address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @param tokens List of token addresses to withdraw\n * @param amounts List of token amounts to withdraw\n * @param recipient Recipient address\n */\n function withdraw(\n address[] calldata tokens,\n uint256[] calldata amounts,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n require(\n tokens.length == amounts.length,\n \"SafeDepositsSender: Tokens and amounts length mismatch\"\n );\n\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n require(\n address(this).balance >= amounts[i],\n \"SafeDepositsSender: Not enough funds\"\n );\n (bool success, ) = payable(recipient).call{ value: amounts[i] }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n require(balance >= amounts[i], \"SafeDepositsSender: Not enough funds\");\n\n token.transfer(recipient, amounts[i]);\n\n emit Withdraw(recipient, tokens[i], amounts[i]);\n }\n }\n\n /**\n * @notice Withdraws all tokens from this contract to a recipient\n * @notice Amount > 0 should be checked by the caller before calling this function\n * @dev Only Safe can call this function\n * @dev Recipient should not be a zero address\n * @notice Withdrawal to the Safe address will affect balances and rewards\n * @param tokens List of token addresses to withdraw\n * @param recipient Recipient address\n */\n function withdrawAll(\n address[] calldata tokens,\n address recipient\n ) external onlySafe notZeroAddress(recipient) {\n for (uint256 i = 0; i < tokens.length; i++) {\n if (tokens[i] == address(0x01)) {\n (bool success, ) = payable(recipient).call{ value: address(this).balance }(\"\");\n require(success, \"Could not withdraw ether\");\n continue;\n }\n IERC20Spec token = IERC20Spec(tokens[i]);\n uint256 balance = token.balanceOf(address(this));\n if (balance > 0) {\n token.transfer(recipient, balance);\n }\n\n emit Withdraw(recipient, tokens[i], balance);\n }\n }\n\n /// @notice pause the contract - no funds can be sent to the LockDrop contract\n function pause() external onlySafe expectUnpaused {\n paused = true;\n emit Pause();\n }\n\n /// @notice unpause the contract\n function unpause() external onlySafe expectPaused {\n paused = false;\n emit Unpause();\n }\n\n /// @notice stops the contract - no funds can be sent to the LockDrop contract, this is irreversible\n function stop() external onlySafe {\n stopBlock = block.number;\n emit Stop();\n }\n\n // GETTERS //\n function getSafeAddress() external view returns (address) {\n return address(SAFE);\n }\n\n function getLockDropAddress() external view returns (address) {\n return LOCK_DROP_ADDRESS;\n }\n\n function getSovTokenAddress() external view returns (address) {\n return SOV_TOKEN_ADDRESS;\n }\n\n function getDepositorAddress() external view returns (address) {\n return DEPOSITOR_ADDRESS;\n }\n\n function isStopped() external view returns (bool) {\n return stopBlock != 0;\n }\n\n function getStopBlock() external view returns (uint256) {\n return stopBlock;\n }\n\n function isPaused() external view returns (bool) {\n return paused;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "remappings": [ + "@contracts/=contracts/", + "ds-test/=foundry/lib/forge-std/lib/ds-test/src/", + "forge-std/=foundry/lib/forge-std/src/" + ] + } +} \ No newline at end of file diff --git a/external/artifacts/LockDrop.sol/LockDrop.json b/external/artifacts/LockDrop.sol/LockDrop.json new file mode 100644 index 000000000..fa25d6c93 --- /dev/null +++ b/external/artifacts/LockDrop.sol/LockDrop.json @@ -0,0 +1,780 @@ +{ + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "setWithdrawalStartTime", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "allowTokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "initialOwner", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "ETH_TOKEN_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "allow", + "inputs": [ + { + "name": "l1TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowedTokens", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridgeProxyAddress", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "changeMultipleL2TokenData", + "inputs": [ + { + "name": "tokenData", + "type": "tuple[]", + "internalType": "struct FusionLock.TokenBridgingData[]", + "components": [ + { + "name": "l1TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "changeWithdrawalTime", + "inputs": [ + { + "name": "newWithdrawalStartTime", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositERC20", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositEth", + "inputs": [], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "deposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getDepositAmount", + "inputs": [ + { + "name": "depositOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEthBalance", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenInfo", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct FusionLock.TokenInfo", + "components": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isWithdrawalTimeStarted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "saveTokens", + "inputs": [ + { + "name": "tokenData", + "type": "tuple[]", + "internalType": "struct FusionLock.SaveTokenData[]", + "components": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBridgeProxyAddress", + "inputs": [ + { + "name": "l2BridgeProxyAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "totalDeposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawDepositsToL1", + "inputs": [ + { + "name": "tokens", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawDepositsToL2", + "inputs": [ + { + "name": "tokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "minGasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawalStartTime", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "BridgeAddress", + "inputs": [ + { + "name": "bridgeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Deposit", + "inputs": [ + { + "name": "depositOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "depositTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SavedToken", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokenAllowed", + "inputs": [ + { + "name": "token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "info", + "type": "tuple", + "indexed": false, + "internalType": "struct FusionLock.TokenInfo", + "components": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokenDataChange", + "inputs": [ + { + "name": "l1Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "l2Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "l1Bridge", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawToL1", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawToL2", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "receiver", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "l1Token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "l2Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawalTimeUpdated", + "inputs": [ + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "EnforcedPause", + "inputs": [] + }, + { + "type": "error", + "name": "ExpectedPause", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + } +] +} \ No newline at end of file diff --git a/external/artifacts/Safe.sol/Safe.json b/external/artifacts/Safe.sol/Safe.json new file mode 100644 index 000000000..ae4a06701 --- /dev/null +++ b/external/artifacts/Safe.sol/Safe.json @@ -0,0 +1,936 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Safe", + "sourceName": "contracts/Safe.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "AddedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "approvedHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ApproveHash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "ChangedFallbackHandler", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "ChangedGuard", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "ChangedThreshold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "DisabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "EnabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "RemovedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "initializer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + } + ], + "name": "SafeSetup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "SignMsg", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "addOwnerWithThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hashToApprove", + "type": "bytes32" + } + ], + "name": "approveHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "approvedHashes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "changeThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "executor", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "requiredSignatures", + "type": "uint256" + } + ], + "name": "checkNSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "checkSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevModule", + "type": "address" + }, + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "disableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "enableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address payable", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "execTransaction", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModule", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModuleReturnData", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "start", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pageSize", + "type": "uint256" + } + ], + "name": "getModulesPaginated", + "outputs": [ + { + "internalType": "address[]", + "name": "array", + "type": "address[]" + }, + { + "internalType": "address", + "name": "next", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "getStorageAt", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "name": "getTransactionHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "isModuleEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "removeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "setFallbackHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "setGuard", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "payment", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "paymentReceiver", + "type": "address" + } + ], + "name": "setup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "signedMessages", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "targetContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "calldataPayload", + "type": "bytes" + } + ], + "name": "simulateAndRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "swapOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506001600481905550615c1180620000296000396000f3fe6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/external/artifacts/UniswapV3Pool.sol/UniswapV3Pool.json b/external/artifacts/UniswapV3Pool.sol/UniswapV3Pool.json new file mode 100644 index 000000000..87969854f --- /dev/null +++ b/external/artifacts/UniswapV3Pool.sol/UniswapV3Pool.json @@ -0,0 +1,990 @@ +{ + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "name": "Collect", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "name": "CollectProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "paid0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "paid1", + "type": "uint256" + } + ], + "name": "Flash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "observationCardinalityNextOld", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "observationCardinalityNextNew", + "type": "uint16" + } + ], + "name": "IncreaseObservationCardinalityNext", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "Initialize", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "indexed": true, + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol0Old", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol1Old", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol0New", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "feeProtocol1New", + "type": "uint8" + } + ], + "name": "SetFeeProtocol", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "int256", + "name": "amount0", + "type": "int256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "amount1", + "type": "int256" + }, + { + "indexed": false, + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "int24", + "name": "tick", + "type": "int24" + } + ], + "name": "Swap", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + } + ], + "name": "burn", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount0Requested", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Requested", + "type": "uint128" + } + ], + "name": "collect", + "outputs": [ + { + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint128", + "name": "amount0Requested", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1Requested", + "type": "uint128" + } + ], + "name": "collectProtocol", + "outputs": [ + { + "internalType": "uint128", + "name": "amount0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "amount1", + "type": "uint128" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint24", + "name": "", + "type": "uint24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeGrowthGlobal0X128", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeGrowthGlobal1X128", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "flash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "observationCardinalityNext", + "type": "uint16" + } + ], + "name": "increaseObservationCardinalityNext", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "liquidity", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxLiquidityPerTick", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + }, + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "uint256", + "name": "amount0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount1", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "observations", + "outputs": [ + { + "internalType": "uint32", + "name": "blockTimestamp", + "type": "uint32" + }, + { + "internalType": "int56", + "name": "tickCumulative", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityCumulativeX128", + "type": "uint160" + }, + { + "internalType": "bool", + "name": "initialized", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint32[]", + "name": "secondsAgos", + "type": "uint32[]" + } + ], + "name": "observe", + "outputs": [ + { + "internalType": "int56[]", + "name": "tickCumulatives", + "type": "int56[]" + }, + { + "internalType": "uint160[]", + "name": "secondsPerLiquidityCumulativeX128s", + "type": "uint160[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "positions", + "outputs": [ + { + "internalType": "uint128", + "name": "liquidity", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside0LastX128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthInside1LastX128", + "type": "uint256" + }, + { + "internalType": "uint128", + "name": "tokensOwed0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "tokensOwed1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFees", + "outputs": [ + { + "internalType": "uint128", + "name": "token0", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "token1", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "feeProtocol0", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "feeProtocol1", + "type": "uint8" + } + ], + "name": "setFeeProtocol", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "slot0", + "outputs": [ + { + "internalType": "uint160", + "name": "sqrtPriceX96", + "type": "uint160" + }, + { + "internalType": "int24", + "name": "tick", + "type": "int24" + }, + { + "internalType": "uint16", + "name": "observationIndex", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "observationCardinality", + "type": "uint16" + }, + { + "internalType": "uint16", + "name": "observationCardinalityNext", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "feeProtocol", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "unlocked", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "tickLower", + "type": "int24" + }, + { + "internalType": "int24", + "name": "tickUpper", + "type": "int24" + } + ], + "name": "snapshotCumulativesInside", + "outputs": [ + { + "internalType": "int56", + "name": "tickCumulativeInside", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityInsideX128", + "type": "uint160" + }, + { + "internalType": "uint32", + "name": "secondsInside", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "bool", + "name": "zeroForOne", + "type": "bool" + }, + { + "internalType": "int256", + "name": "amountSpecified", + "type": "int256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "swap", + "outputs": [ + { + "internalType": "int256", + "name": "amount0", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int16", + "name": "", + "type": "int16" + } + ], + "name": "tickBitmap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tickSpacing", + "outputs": [ + { + "internalType": "int24", + "name": "", + "type": "int24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int24", + "name": "", + "type": "int24" + } + ], + "name": "ticks", + "outputs": [ + { + "internalType": "uint128", + "name": "liquidityGross", + "type": "uint128" + }, + { + "internalType": "int128", + "name": "liquidityNet", + "type": "int128" + }, + { + "internalType": "uint256", + "name": "feeGrowthOutside0X128", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "feeGrowthOutside1X128", + "type": "uint256" + }, + { + "internalType": "int56", + "name": "tickCumulativeOutside", + "type": "int56" + }, + { + "internalType": "uint160", + "name": "secondsPerLiquidityOutsideX128", + "type": "uint160" + }, + { + "internalType": "uint32", + "name": "secondsOutside", + "type": "uint32" + }, + { + "internalType": "bool", + "name": "initialized", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token0", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "token1", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +} diff --git a/external/deployments/ethMainnet/BobLockDrop.json b/external/deployments/ethMainnet/BobLockDrop.json new file mode 100644 index 000000000..f7722da97 --- /dev/null +++ b/external/deployments/ethMainnet/BobLockDrop.json @@ -0,0 +1,781 @@ +{ + "address": "0x61dc14b28d4dbcd6cf887e9b72018b9da1ce6ff7", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "setWithdrawalStartTime", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "allowTokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "initialOwner", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "ETH_TOKEN_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "allow", + "inputs": [ + { + "name": "l1TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowedTokens", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridgeProxyAddress", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "changeMultipleL2TokenData", + "inputs": [ + { + "name": "tokenData", + "type": "tuple[]", + "internalType": "struct FusionLock.TokenBridgingData[]", + "components": [ + { + "name": "l1TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "changeWithdrawalTime", + "inputs": [ + { + "name": "newWithdrawalStartTime", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositERC20", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositEth", + "inputs": [], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "deposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getDepositAmount", + "inputs": [ + { + "name": "depositOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEthBalance", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenInfo", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct FusionLock.TokenInfo", + "components": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isWithdrawalTimeStarted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "saveTokens", + "inputs": [ + { + "name": "tokenData", + "type": "tuple[]", + "internalType": "struct FusionLock.SaveTokenData[]", + "components": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBridgeProxyAddress", + "inputs": [ + { + "name": "l2BridgeProxyAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "totalDeposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawDepositsToL1", + "inputs": [ + { + "name": "tokens", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawDepositsToL2", + "inputs": [ + { + "name": "tokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "minGasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawalStartTime", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "BridgeAddress", + "inputs": [ + { + "name": "bridgeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Deposit", + "inputs": [ + { + "name": "depositOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "depositTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SavedToken", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokenAllowed", + "inputs": [ + { + "name": "token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "info", + "type": "tuple", + "indexed": false, + "internalType": "struct FusionLock.TokenInfo", + "components": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokenDataChange", + "inputs": [ + { + "name": "l1Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "l2Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "l1Bridge", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawToL1", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawToL2", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "receiver", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "l1Token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "l2Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawalTimeUpdated", + "inputs": [ + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "EnforcedPause", + "inputs": [] + }, + { + "type": "error", + "name": "ExpectedPause", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + } + ] +} diff --git a/external/deployments/ethMainnet/SafeBobDeposits.json b/external/deployments/ethMainnet/SafeBobDeposits.json new file mode 100644 index 000000000..5b1148342 --- /dev/null +++ b/external/deployments/ethMainnet/SafeBobDeposits.json @@ -0,0 +1,937 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Safe", + "sourceName": "contracts/Safe.sol", + "address": "0x949cf9295d2950b6bd9b7334846101e9ae44bbb0", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "AddedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "approvedHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ApproveHash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "ChangedFallbackHandler", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "ChangedGuard", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "ChangedThreshold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "DisabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "EnabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "RemovedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "initializer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + } + ], + "name": "SafeSetup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "SignMsg", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "addOwnerWithThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hashToApprove", + "type": "bytes32" + } + ], + "name": "approveHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "approvedHashes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "changeThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "executor", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "requiredSignatures", + "type": "uint256" + } + ], + "name": "checkNSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "checkSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevModule", + "type": "address" + }, + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "disableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "enableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address payable", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "execTransaction", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModule", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModuleReturnData", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "start", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pageSize", + "type": "uint256" + } + ], + "name": "getModulesPaginated", + "outputs": [ + { + "internalType": "address[]", + "name": "array", + "type": "address[]" + }, + { + "internalType": "address", + "name": "next", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "getStorageAt", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "name": "getTransactionHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "isModuleEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "removeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "setFallbackHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "setGuard", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "payment", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "paymentReceiver", + "type": "address" + } + ], + "name": "setup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "signedMessages", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "targetContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "calldataPayload", + "type": "bytes" + } + ], + "name": "simulateAndRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "swapOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506001600481905550615c1180620000296000396000f3fe6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/external/deployments/ethMainnet/SafeBobPreDeposit.json b/external/deployments/ethMainnet/SafeBobPreDeposit.json new file mode 100644 index 000000000..7676e2530 --- /dev/null +++ b/external/deployments/ethMainnet/SafeBobPreDeposit.json @@ -0,0 +1,937 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Safe", + "sourceName": "contracts/Safe.sol", + "address": "0xb82c2b7fb8678a7353a853e81108a52e2fcaa9b0", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "AddedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "approvedHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ApproveHash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "ChangedFallbackHandler", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "ChangedGuard", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "ChangedThreshold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "DisabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "EnabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "RemovedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "initializer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + } + ], + "name": "SafeSetup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "SignMsg", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "addOwnerWithThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hashToApprove", + "type": "bytes32" + } + ], + "name": "approveHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "approvedHashes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "changeThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "executor", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "requiredSignatures", + "type": "uint256" + } + ], + "name": "checkNSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "checkSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevModule", + "type": "address" + }, + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "disableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "enableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address payable", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "execTransaction", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModule", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModuleReturnData", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "start", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pageSize", + "type": "uint256" + } + ], + "name": "getModulesPaginated", + "outputs": [ + { + "internalType": "address[]", + "name": "array", + "type": "address[]" + }, + { + "internalType": "address", + "name": "next", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "getStorageAt", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "name": "getTransactionHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "isModuleEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "removeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "setFallbackHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "setGuard", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "payment", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "paymentReceiver", + "type": "address" + } + ], + "name": "setup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "signedMessages", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "targetContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "calldataPayload", + "type": "bytes" + } + ], + "name": "simulateAndRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "swapOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506001600481905550615c1180620000296000396000f3fe6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/external/deployments/ethMainnet/UniswapQuoter.json b/external/deployments/ethMainnet/UniswapQuoter.json new file mode 100644 index 000000000..3ae9b1ac6 --- /dev/null +++ b/external/deployments/ethMainnet/UniswapQuoter.json @@ -0,0 +1,196 @@ +{ + "address": "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_factory", + "type": "address" + }, + { + "internalType": "address", + "name": "_WETH9", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "WETH9", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "name": "quoteExactInput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "name": "quoteExactInputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + } + ], + "name": "quoteExactOutput", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "tokenIn", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOut", + "type": "address" + }, + { + "internalType": "uint24", + "name": "fee", + "type": "uint24" + }, + { + "internalType": "uint256", + "name": "amountOut", + "type": "uint256" + }, + { + "internalType": "uint160", + "name": "sqrtPriceLimitX96", + "type": "uint160" + } + ], + "name": "quoteExactOutputSingle", + "outputs": [ + { + "internalType": "uint256", + "name": "amountIn", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "int256", + "name": "amount0Delta", + "type": "int256" + }, + { + "internalType": "int256", + "name": "amount1Delta", + "type": "int256" + }, + { + "internalType": "bytes", + "name": "path", + "type": "bytes" + } + ], + "name": "uniswapV3SwapCallback", + "outputs": [], + "stateMutability": "view", + "type": "function" + } + ] +} diff --git a/external/deployments/ethSepoliaTestnet/BobLockDrop.json b/external/deployments/ethSepoliaTestnet/BobLockDrop.json new file mode 100644 index 000000000..67403e75b --- /dev/null +++ b/external/deployments/ethSepoliaTestnet/BobLockDrop.json @@ -0,0 +1,770 @@ +{ + "address": "0x007b3aa69a846cb1f76b60b3088230a52d2a83ac", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "setWithdrawalStartTime", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "allowTokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "initialOwner", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "ETH_TOKEN_ADDRESS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "allow", + "inputs": [ + { + "name": "l1TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowedTokens", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridgeProxyAddress", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "changeMultipleL2TokenAddresses", + "inputs": [ + { + "name": "tokenPairs", + "type": "tuple[]", + "internalType": "struct LockDrop.TokenAddressPair[]", + "components": [ + { + "name": "l1TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "changeWithdrawalTime", + "inputs": [ + { + "name": "newWithdrawalStartTime", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositERC20", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "depositEth", + "inputs": [], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "deposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getDepositAmount", + "inputs": [ + { + "name": "depositOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getEthBalance", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getTokenInfo", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct LockDrop.TokenInfo", + "components": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isWithdrawalTimeStarted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "saveTokens", + "inputs": [ + { + "name": "tokenData", + "type": "tuple[]", + "internalType": "struct LockDrop.SaveTokenData[]", + "components": [ + { + "name": "user", + "type": "address", + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBridgeProxyAddress", + "inputs": [ + { + "name": "l2BridgeProxyAddress", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "totalDeposits", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawDepositsToL1", + "inputs": [ + { + "name": "tokens", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawDepositsToL2", + "inputs": [ + { + "name": "tokens", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "minGasLimit", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "receiver", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawalStartTime", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "BridgeAddress", + "inputs": [ + { + "name": "bridgeAddress", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Deposit", + "inputs": [ + { + "name": "depositOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "depositTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "SavedToken", + "inputs": [ + { + "name": "user", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokenAllowed", + "inputs": [ + { + "name": "token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "info", + "type": "tuple", + "indexed": false, + "internalType": "struct LockDrop.TokenInfo", + "components": [ + { + "name": "isAllowed", + "type": "bool", + "internalType": "bool" + }, + { + "name": "l2TokenAddress", + "type": "address", + "internalType": "address" + }, + { + "name": "l1BridgeAddressOverride", + "type": "address", + "internalType": "address" + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokenL2DepositAddressChange", + "inputs": [ + { + "name": "l1Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "l2Token", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawToL1", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawToL2", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "receiver", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "l1Token", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "l2Token", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "WithdrawalTimeUpdated", + "inputs": [ + { + "name": "endTime", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AddressInsufficientBalance", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "EnforcedPause", + "inputs": [] + }, + { + "type": "error", + "name": "ExpectedPause", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [ + { + "name": "token", + "type": "address", + "internalType": "address" + } + ] + } + ] +} diff --git a/external/deployments/ethSepoliaTestnet/SafeBobDeposits.json b/external/deployments/ethSepoliaTestnet/SafeBobDeposits.json new file mode 100644 index 000000000..370cecd99 --- /dev/null +++ b/external/deployments/ethSepoliaTestnet/SafeBobDeposits.json @@ -0,0 +1,937 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Safe", + "sourceName": "contracts/Safe.sol", + "address": "0x064A379c959dB1Ed1318114E2363a6c8d103ADd3", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "AddedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "approvedHash", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ApproveHash", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "ChangedFallbackHandler", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "ChangedGuard", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + } + ], + "name": "ChangedThreshold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "DisabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "EnabledModule", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "ExecutionFromModuleSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "txHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "payment", + "type": "uint256" + } + ], + "name": "ExecutionSuccess", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "RemovedOwner", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "SafeReceived", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "initiator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "initializer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + } + ], + "name": "SafeSetup", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "SignMsg", + "type": "event" + }, + { + "stateMutability": "nonpayable", + "type": "fallback" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "addOwnerWithThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "hashToApprove", + "type": "bytes32" + } + ], + "name": "approveHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "approvedHashes", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "changeThreshold", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "executor", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "requiredSignatures", + "type": "uint256" + } + ], + "name": "checkNSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "checkSignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevModule", + "type": "address" + }, + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "disableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "domainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "enableModule", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address payable", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signatures", + "type": "bytes" + } + ], + "name": "execTransaction", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModule", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + } + ], + "name": "execTransactionFromModuleReturnData", + "outputs": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "start", + "type": "address" + }, + { + "internalType": "uint256", + "name": "pageSize", + "type": "uint256" + } + ], + "name": "getModulesPaginated", + "outputs": [ + { + "internalType": "address[]", + "name": "array", + "type": "address[]" + }, + { + "internalType": "address", + "name": "next", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "length", + "type": "uint256" + } + ], + "name": "getStorageAt", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseGas", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256" + }, + { + "internalType": "address", + "name": "gasToken", + "type": "address" + }, + { + "internalType": "address", + "name": "refundReceiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + } + ], + "name": "getTransactionHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "module", + "type": "address" + } + ], + "name": "isModuleEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + } + ], + "name": "removeOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "handler", + "type": "address" + } + ], + "name": "setFallbackHandler", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guard", + "type": "address" + } + ], + "name": "setGuard", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_owners", + "type": "address[]" + }, + { + "internalType": "uint256", + "name": "_threshold", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "address", + "name": "fallbackHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "paymentToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "payment", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "paymentReceiver", + "type": "address" + } + ], + "name": "setup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "signedMessages", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "targetContract", + "type": "address" + }, + { + "internalType": "bytes", + "name": "calldataPayload", + "type": "bytes" + } + ], + "name": "simulateAndRevert", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "prevOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "swapOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506001600481905550615c1180620000296000396000f3fe6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "deployedBytecode": "0x6080604052600436106101bb5760003560e01c8063b4faba09116100ec578063e19a9dd91161008a578063f08a032311610064578063f08a0323146113dc578063f698da251461142d578063f8dc5dd914611458578063ffa1ad74146114d357610210565b8063e19a9dd9146112cf578063e318b52b14611320578063e75235b8146113b157610210565b8063cd5d1f77116100c6578063cd5d1f7714610f56578063d4d9bdcd146110e9578063d8d11f7814611124578063e009cfde1461125e57610210565b8063b4faba0914610c31578063b63e800d14610d19578063cc2f845214610e8957610210565b8063610b5925116101595780637d832974116101335780637d832974146109c2578063934f3a1114610a31578063a0e67e2b14610b9a578063affed0e014610c0657610210565b8063610b59251461077a578063694e80c3146107cb5780636a7612021461080657610210565b8063468721a711610195578063468721a7146103d75780635229073f146104ec5780635624b25b1461066d5780635ae6bd371461072b57610210565b80630d582f13146102ae5780632d9ad53d146103095780632f54bf6e1461037057610210565b36610210573373ffffffffffffffffffffffffffffffffffffffff167f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d346040518082815260200191505060405180910390a2005b34801561021c57600080fd5b5060007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b905061025c565b60006040519050818101604052919050565b80548061026857600080f35b6102713661024a565b3660008237610280601461024a565b3360601b815260008060143601846000875af161029c3d61024a565b3d6000823e816102aa573d81fd5b3d81f35b3480156102ba57600080fd5b50610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611563565b005b34801561031557600080fd5b506103586004803603602081101561032c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611949565b60405180821515815260200191505060405180910390f35b34801561037c57600080fd5b506103bf6004803603602081101561039357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1b565b60405180821515815260200191505060405180910390f35b3480156103e357600080fd5b506104d4600480360360808110156103fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561044157600080fd5b82018360208201111561045357600080fd5b8035906020019184600183028401116401000000008311171561047557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611aed565b60405180821515815260200191505060405180910390f35b3480156104f857600080fd5b506105e96004803603608081101561050f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561055657600080fd5b82018360208201111561056857600080fd5b8035906020019184600183028401116401000000008311171561058a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611f2d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610631578082015181840152602081019050610616565b50505050905090810190601f16801561065e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561067957600080fd5b506106b06004803603604081101561069057600080fd5b810190808035906020019092919080359060200190929190505050611f63565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106f05780820151818401526020810190506106d5565b50505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561073757600080fd5b506107646004803603602081101561074e57600080fd5b8101908080359060200190929190505050611fea565b6040518082815260200191505060405180910390f35b34801561078657600080fd5b506107c96004803603602081101561079d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612002565b005b3480156107d757600080fd5b50610804600480360360208110156107ee57600080fd5b810190808035906020019092919050505061238a565b005b6109aa600480360361014081101561081d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086457600080fd5b82018360208201111561087657600080fd5b8035906020019184600183028401116401000000008311171561089857600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561092457600080fd5b82018360208201111561093657600080fd5b8035906020019184600183028401116401000000008311171561095857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506124c4565b60405180821515815260200191505060405180910390f35b3480156109ce57600080fd5b50610a1b600480360360408110156109e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129f1565b6040518082815260200191505060405180910390f35b348015610a3d57600080fd5b50610b9860048036036060811015610a5457600080fd5b810190808035906020019092919080359060200190640100000000811115610a7b57600080fd5b820183602082011115610a8d57600080fd5b80359060200191846001830284011164010000000083111715610aaf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610b1257600080fd5b820183602082011115610b2457600080fd5b80359060200191846001830284011164010000000083111715610b4657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612a16565b005b348015610ba657600080fd5b50610baf612aa6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610bf2578082015181840152602081019050610bd7565b505050509050019250505060405180910390f35b348015610c1257600080fd5b50610c1b612c4f565b6040518082815260200191505060405180910390f35b348015610c3d57600080fd5b50610d1760048036036040811015610c5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612c55565b005b348015610d2557600080fd5b50610e876004803603610100811015610d3d57600080fd5b8101908080359060200190640100000000811115610d5a57600080fd5b820183602082011115610d6c57600080fd5b80359060200191846020830284011164010000000083111715610d8e57600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610dd957600080fd5b820183602082011115610deb57600080fd5b80359060200191846001830284011164010000000083111715610e0d57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c7c565b005b348015610e9557600080fd5b50610ee260048036036040811015610eac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e3a565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610f41578082015181840152602081019050610f26565b50505050905001935050505060405180910390f35b348015610f6257600080fd5b506110e7600480360360a0811015610f7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fc057600080fd5b820183602082011115610fd257600080fd5b80359060200191846001830284011164010000000083111715610ff457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105757600080fd5b82018360208201111561106957600080fd5b8035906020019184600183028401116401000000008311171561108b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919050505061319d565b005b3480156110f557600080fd5b506111226004803603602081101561110c57600080fd5b81019080803590602001909291905050506139bb565b005b34801561113057600080fd5b50611248600480360361014081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561118f57600080fd5b8201836020820111156111a157600080fd5b803590602001918460018302840111640100000000831117156111c357600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b5a565b6040518082815260200191505060405180910390f35b34801561126a57600080fd5b506112cd6004803603604081101561128157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b87565b005b3480156112db57600080fd5b5061131e600480360360208110156112f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f0e565b005b34801561132c57600080fd5b506113af6004803603606081101561134357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140fa565b005b3480156113bd57600080fd5b506113c6614758565b6040518082815260200191505060405180910390f35b3480156113e857600080fd5b5061142b600480360360208110156113ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614762565b005b34801561143957600080fd5b506114426147b9565b6040518082815260200191505060405180910390f35b34801561146457600080fd5b506114d16004803603606081101561147b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614835565b005b3480156114df57600080fd5b506114e8614c5e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561152857808201518184015260208101905061150d565b50505050905090810190601f1680156115555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61156b614c97565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156115d55750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561160d57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61167f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055508173ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a28060045414611945576119448161238a565b5b5050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611a145750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611ae65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611bb85750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000611c34614d3a565b905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611db8578173ffffffffffffffffffffffffffffffffffffffff1663728c297288888888336040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200180602001846001811115611cd157fe5b81526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b83811015611d2a578082015181840152602081019050611d0f565b50505050905090810190601f168015611d575780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b810190808051906020019092919050505090505b611de5878787877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b9250600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e91578173ffffffffffffffffffffffffffffffffffffffff16639327136882856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b158015611e7857600080fd5b505af1158015611e8c573d6000803e3d6000fd5b505050505b8215611edf573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a2611f23565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b5050949350505050565b60006060611f3d86868686611aed565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060006020830267ffffffffffffffff81118015611f8157600080fd5b506040519080825280601f01601f191660200182016040528015611fb45781602001600182028036833780820191505090505b50905060005b83811015611fdf57808501548060208302602085010152508080600101915050611fba565b508091505092915050565b60076020528060005260406000206000915090505481565b61200a614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156120745750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b6120e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844060405160405180910390a250565b612392614c97565b60035481111561240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015612481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b6000806124ea8d8d8d8d8d8d8d8d8d8d6005600081548092919060010191905055613b5a565b9050612506816040518060200160405280600081525085612a16565b6000612510614d3a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146126f6578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b8152600401808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c8152602001806020018a60018111156125b357fe5b81526020018981526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018473ffffffffffffffffffffffffffffffffffffffff16815260200183810383528d8d82818152602001925080828437600081840152601f19601f820116905080830192505050838103825285818151815260200191508051906020019080838360005b8381101561268557808201518184015260208101905061266a565b50505050905090810190601f1680156126b25780820380516001836020036101000a031916815260200191505b509e505050505050505050505050505050600060405180830381600087803b1580156126dd57600080fd5b505af11580156126f1573d6000803e3d6000fd5b505050505b6101f461271d6109c48b01603f60408d028161270e57fe5b04614db790919063ffffffff16565b015a1015612793576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60005a90506127fc8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d146127f1578e6127f7565b6109c45a035b614d6b565b93506128115a82614dd190919063ffffffff16565b90508380612820575060008a14155b8061282c575060008814155b61289e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808911156128b8576128b5828b8b8b8b614df1565b90505b84156128fb57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e826040518082815260200191505060405180910390a2612934565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040518082815260200191505060405180910390a25b5050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e0578073ffffffffffffffffffffffffffffffffffffffff16639327136883856040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b6000600454905060008111612a93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b612aa0338585858561319d565b50505050565b6060600060035467ffffffffffffffff81118015612ac357600080fd5b50604051908082528060200260200182016040528015612af25781602001602082028036833780820191505090505b50905060008060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612c465780838381518110612b9d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612b5c565b82935050505090565b60055481565b600080825160208401855af46040518181523d60208201523d6000604083013e60403d0181fd5b612cc78a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508961502d565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0557612d048461552d565b5b612d538787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506155fe565b6000821115612d6d57612d6b82600060018685614df1565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b8960405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281038252878782818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a250505050505050505050565b60606000600173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e7e5750612e7d84611949565b5b612ef0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60008311612f66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8267ffffffffffffffff81118015612f7d57600080fd5b50604051908082528060200260200182016040528015612fac5781602001602082028036833780820191505090505b5091506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561307e5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561308957508381105b15613144578183828151811061309b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508080600101915050613014565b600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131925782600182038151811061318757fe5b602002602001015191505b808352509250929050565b6131b16041826158d490919063ffffffff16565b82511015613227576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000808060008060005b868110156139ae57613243888261590e565b80945081955082965050505060008460ff1614156135e7578260001c94506132756041886158d490919063ffffffff16565b8260001c10156132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b875161330660208460001c61593d90919063ffffffff16565b111561337a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006020838a010151905088516133b0826133a260208760001c61593d90919063ffffffff16565b61593d90919063ffffffff16565b1115613424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60606020848b01019050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff16631626ba7e8e846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156134c85780820151818401526020810190506134ad565b50505050905090810190601f1680156134f55780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561351357600080fd5b505afa158015613527573d6000803e3d6000fd5b505050506040513d602081101561353d57600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b505061382c565b60018460ff1614156136fb578260001c94508473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16148061368457506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c81526020019081526020016000205414155b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61382b565b601e8460ff1611156137c35760018a60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156137b2573d6000803e3d6000fd5b50505060206040510351945061382a565b60018a85858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561381d573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156138f35750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b801561392c5750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b61399e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330323600000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8495508080600101915050613231565b5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613abd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b6000613b6f8c8c8c8c8c8c8c8c8c8c8c61595c565b8051906020012090509b9a5050505050505050505050565b613b8f614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613bf95750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613c6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427660405160405180910390a25050565b613f16614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614614088578073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f945b8148000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060206040518083038186803b158015613fda57600080fd5b505afa158015613fee573d6000803e3d6000fd5b505050506040513d602081101561400457600080fd5b8101908080519060200190929190505050614087576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475333303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b60007f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b90508181558173ffffffffffffffffffffffffffffffffffffffff167f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa260405160405180910390a25050565b614102614c97565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561416c5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156141a457503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b614216576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156143815750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6143f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146144f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28073ffffffffffffffffffffffffffffffffffffffff167f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2660405160405180910390a2505050565b6000600454905090565b61476a614c97565b6147738161552d565b8073ffffffffffffffffffffffffffffffffffffffff167f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b060405160405180910390a250565b6000804690507f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8130604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012091505090565b61483d614c97565b8060016003540310156148b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156149225750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b614994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614a94576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303500000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055508173ffffffffffffffffffffffffffffffffffffffff167ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf60405160405180910390a28060045414614c5957614c588161238a565b5b505050565b6040518060400160405280600581526020017f312e342e3100000000000000000000000000000000000000000000000000000081525081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614d38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330333100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b6000807f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c860001b9050805491505090565b6000600180811115614d7957fe5b836001811115614d8557fe5b1415614d9e576000808551602087018986f49050614dae565b600080855160208701888a87f190505b95945050505050565b600081831015614dc75781614dc9565b825b905092915050565b600082821115614de057600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614614e2e5782614e30565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614f7e57614e9a3a8610614e77573a614e79565b855b614e8c888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b915060008173ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114614efc576040519150601f19603f3d011682016040523d82523d6000602084013e614f01565b606091505b5050905080614f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50615023565b614fa385614f95888a61593d90919063ffffffff16565b6158d490919063ffffffff16565b9150614fb0848284615b04565b615022576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330313200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5095945050505050565b6000600454146150a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b815181111561511c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303100000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001811015615193576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006001905060005b83518110156154995760008482815181106151b357fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156152275750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561525f57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561529757508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b615309576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303300000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461540a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475332303400000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080925050808060010191505061519c565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156155cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475334303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475331303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146158d0576157bc82615bc8565b61582e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303200000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b61585d8260008360017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614d6b565b6158cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260058152602001807f475330303000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b5b5050565b6000808314156158e75760009050615908565b60008284029050828482816158f857fe5b041461590357600080fd5b809150505b92915050565b6000806000836041026020810186015192506040810186015191506060810186015160001a9350509250925092565b60008082840190508381101561595257600080fd5b8091505092915050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d60405180838380828437808301925050509250505060405180910390208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860018111156159ed57fe5b81526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b615a796147b9565b8360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509b9a5050505050505050505050565b60008063a9059cbb8484604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050602060008251602084016000896127105a03f13d60008114615bab5760208114615bb35760009350615bbe565b819350615bbe565b600051158215171593505b5050509392505050565b600080823b90506000811191505091905056fea264697066735822122019558c11c8002edc5f2f2355d9683dfdb6875df364b4948c9f6d5547253b93aa64736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/external/deployments/tenderlyForkedEthMainnet/.chainId b/external/deployments/tenderlyForkedEthMainnet/.chainId new file mode 100644 index 000000000..56a6051ca --- /dev/null +++ b/external/deployments/tenderlyForkedEthMainnet/.chainId @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/hardhat.config.js b/hardhat.config.js index e248775db..86625a372 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -19,11 +19,15 @@ require("./hardhat/tasks"); require("dotenv").config(); require("@secrez/cryptoenv").parse(); +// const tdly = require("@tenderly/hardhat-tenderly"); +// tdly.setup({ automaticVerifications: true }); + const mnemonic = { mnemonic: "test test test test test test test test test test test junk" }; const testnetPKs = [ process.env.TESTNET_DEPLOYER_PRIVATE_KEY ?? "", process.env.TESTNET_SIGNER_PRIVATE_KEY ?? "", process.env.TESTNET_SIGNER_PRIVATE_KEY_2 ?? "", + process.env.SAFE_DEPOSITS_SENDER ?? "", // safe deposit sender ].filter((item, i, arr) => item !== "" && arr.indexOf(item) === i); const testnetAccounts = testnetPKs.length > 0 ? testnetPKs : mnemonic; @@ -31,6 +35,7 @@ const mainnetPKs = [ process.env.MAINNET_DEPLOYER_PRIVATE_KEY ?? "", process.env.PROPOSAL_CREATOR_PRIVATE_KEY ?? "", process.env.TESTNET_DEPLOYER_PRIVATE_KEY ?? "", //mainnet signer2 + process.env.SAFE_DEPOSITS_SENDER ?? "", // safe deposit sender ].filter((item, i, arr) => item !== "" && arr.indexOf(item) === i); const mainnetAccounts = mainnetPKs.length > 0 ? mainnetPKs : mnemonic; @@ -132,7 +137,7 @@ module.exports = { abiExporter: { clear: true, runOnCompile: true, - flat: true, + flat: false, spacing: 4, }, contractSizer: { @@ -159,6 +164,9 @@ module.exports = { proposer2: { default: 1, }, + safeDepositSender: { + default: 3, + }, }, networks: { hardhat: { @@ -261,15 +269,30 @@ module.exports = { chainId: 1, url: `https://mainnet.infura.io/v3/${process.env.INFURA_KEY}`, accounts: mainnetAccounts, + tags: ["mainnet"], + }, + ethForkedMainnet: { + chainId: 31337, + accounts: mainnetAccounts, + url: "http://127.0.0.1:8545", + gasPrice: 50000000, + live: true, + tags: ["mainnet", "forked"], + timeout: 100000, + }, + ethSepoliaTestnet: { + chainId: 11155111, + url: `https://sepolia.infura.io/v3/${process.env.INFURA_KEY}`, + accounts: testnetAccounts, + tags: ["testnet"], }, bobTestnet: { url: "https://testnet.rpc.gobob.xyz/", chainId: 111, accounts: testnetAccounts, - gasPrice: 50000000, + gasPrice: 980000000, tags: ["testnet"], }, - bobForkedTestnet: { chainId: 31337, accounts: testnetAccounts, @@ -279,6 +302,13 @@ module.exports = { tags: ["testnet", "forked"], timeout: 100000, }, + tenderlyForkedEthMainnet: { + chainId: 1, + accounts: mainnetAccounts, + url: "https://rpc.tenderly.co/fork/7ddd4a8d-fa32-4664-ae92-546828264c6f", + live: true, + tags: ["mainnet", "forked"], + }, }, paths: { sources: "./contracts", @@ -324,7 +354,17 @@ module.exports = { "external/deployments/bobTestnet", "deployment/deployments/bobTestnet", ], - ethMainnet: ["external/deployments/ethMainnet", "deployment/deployments/ethMainnet"], + ethMainnet: ["external/deployments/ethMainnet"], + ethForkedMainnet: [ + "external/deployments/ethMainnet", + "deployment/deployments/ethMainnet", + ], + ethSepoliaTestnet: ["external/deployments/ethSepoliaTestnet"], + tenderlyForkedEthMainnet: [ + "external/deployments/ethMainnet", + "deployment/deployments/ethMainnet", + "external/deployments/tenderlyForkedEthMainnet", + ], }, }, typechain: { @@ -337,4 +377,8 @@ module.exports = { mocha: { timeout: 800000, }, + tenderly: { + username: process.env.TENDERLY_USERNAME, + project: process.env.TENDERLY_PROJECT, + }, }; diff --git a/hardhat/tasks/bobDepositor.js b/hardhat/tasks/bobDepositor.js new file mode 100644 index 000000000..344c6d17a --- /dev/null +++ b/hardhat/tasks/bobDepositor.js @@ -0,0 +1,32 @@ +/* eslint-disable no-console */ +const { task } = require("hardhat/config"); +const Logs = require("node-logs"); +const { generateReportTimelockDepositor } = require("../../scripts/reportTimelockDepositor"); +const { executeTimeLockDepositor } = require("../../scripts/timelockDepositor"); + +const logger = new Logs().showInConsole(true); + +task("bob:generate-report-depositor", "Generate report depositor").setAction(async ({}, hre) => { + await generateReportTimelockDepositor(hre); +}); + +task("bob:execute-timelock-depositor", "Generate report depositor") + .addFlag("dryRun", "Dry run flag") + .addOptionalParam( + "signer", + "Signer name: 'signer' or 'deployer' or 'safeDepositSender'", + "safeDepositSender" + ) + .setAction(async ({ dryRun, signer }, hre) => { + const { + deployments: { get }, + } = hre; + const signerAcc = ethers.utils.isAddress(signer) + ? signer + : (await hre.getNamedAccounts())[signer]; + + if (dryRun) { + logger.warn(`Dry run - it will not execute the transfer`); + } + await executeTimeLockDepositor(hre, signerAcc, dryRun); + }); diff --git a/hardhat/tasks/index.js b/hardhat/tasks/index.js index 990971f9e..39167b64b 100644 --- a/hardhat/tasks/index.js +++ b/hardhat/tasks/index.js @@ -8,3 +8,4 @@ require("./governance"); require("./feeSharingCollector"); require("./uniswap"); require("./bridge"); +require("./bobDepositor"); diff --git a/hardhat/tasks/misc.js b/hardhat/tasks/misc.js index 1c57a97a3..aa1f23266 100644 --- a/hardhat/tasks/misc.js +++ b/hardhat/tasks/misc.js @@ -243,7 +243,7 @@ task("getBalanceOfAccounts", "Get ERC20 or native token balance of account or ad throw Error("Invalid account to get balance of!"); } - if (token === "RBTC") { + if (["RBTC", "ETH"].includes(token)) { const balance = await ethers.provider.getBalance(accountAddress); logger.success( `RBTC balance of the account ${account} (${accountAddress}): @@ -251,7 +251,10 @@ task("getBalanceOfAccounts", "Get ERC20 or native token balance of account or ad ); } else { const tokenContract = ethers.utils.isAddress(token) - ? await ethers.getContractAt("IERC20", token) + ? await ethers.getContractAt( + "contracts/interfaces/IERC20.sol:IERC20", + token + ) : await ethers.getContract(token); const tokenSymbol = await tokenContract.symbol(); const decimalsDivider = ethers.BigNumber.from(decimals ? 10 : 1).pow( diff --git a/package-lock.json b/package-lock.json index 4d37dd0a6..c9ba0c2f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "sovrynsmartcontracts", "version": "1.0.0", "license": "Apache-2.0", + "dependencies": { + "@tenderly/hardhat-tenderly": "^1.8.0" + }, "devDependencies": { "@defi-wonderland/smock": "^2.3.4", "@nomicfoundation/hardhat-foundry": "^1.0.2", @@ -22,6 +25,7 @@ "@secrez/cryptoenv": "^0.2.4", "@uniswap/sdk-core": "^4.1.3", "@uniswap/v3-sdk": "^3.10.2", + "axios": "^1.6.8", "bignumber.js": "^9.0.0", "cli-color": "^2.0.3", "coveralls": "^3.1.0", @@ -44,6 +48,7 @@ "keccak": "^3.0.3", "keccak256": "^1.0.6", "mocha": "^8.2.1", + "moment": "^2.30.1", "node-logs": "^1.1.0", "patch-package": "^7.0.0", "phantomjs-prebuilt": "^2.1.16", @@ -240,13 +245,6 @@ "node": ">= 0.6" } }, - "node_modules/@apollographql/graphql-upload-8-fork/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "optional": true - }, "node_modules/@ardatan/aggregate-error": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", @@ -1413,6 +1411,15 @@ "to-fast-properties": "^2.0.0" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@consento/sync-randombytes": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz", @@ -1428,7 +1435,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -2284,7 +2291,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "funding": [ { "type": "individual", @@ -2311,7 +2317,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "dev": true, "funding": [ { "type": "individual", @@ -2336,7 +2341,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "dev": true, "funding": [ { "type": "individual", @@ -2359,7 +2363,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, "funding": [ { "type": "individual", @@ -2382,7 +2385,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "dev": true, "funding": [ { "type": "individual", @@ -2401,7 +2403,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, "funding": [ { "type": "individual", @@ -2421,7 +2422,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "dev": true, "funding": [ { "type": "individual", @@ -2441,14 +2441,12 @@ "node_modules/@ethersproject/bignumber/node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/@ethersproject/bytes": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "dev": true, "funding": [ { "type": "individual", @@ -2467,7 +2465,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "dev": true, "funding": [ { "type": "individual", @@ -2486,7 +2483,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, "funding": [ { "type": "individual", @@ -2514,7 +2510,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, "funding": [ { "type": "individual", @@ -2541,7 +2536,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, "funding": [ { "type": "individual", @@ -2571,7 +2565,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, "funding": [ { "type": "individual", @@ -2601,14 +2594,12 @@ "node_modules/@ethersproject/json-wallets/node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "dev": true, "funding": [ { "type": "individual", @@ -2628,7 +2619,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "dev": true, "funding": [ { "type": "individual", @@ -2644,7 +2634,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "dev": true, "funding": [ { "type": "individual", @@ -2663,7 +2652,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, "funding": [ { "type": "individual", @@ -2683,7 +2671,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "dev": true, "funding": [ { "type": "individual", @@ -2702,7 +2689,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, "funding": [ { "type": "individual", @@ -2740,7 +2726,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, "engines": { "node": ">=8.3.0" }, @@ -2761,7 +2746,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, "funding": [ { "type": "individual", @@ -2781,7 +2765,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "dev": true, "funding": [ { "type": "individual", @@ -2801,7 +2784,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, "funding": [ { "type": "individual", @@ -2822,7 +2804,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "dev": true, "funding": [ { "type": "individual", @@ -2845,14 +2826,12 @@ "node_modules/@ethersproject/signing-key/node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, "funding": [ { "type": "individual", @@ -2876,7 +2855,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "dev": true, "funding": [ { "type": "individual", @@ -2897,7 +2875,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "dev": true, "funding": [ { "type": "individual", @@ -2924,7 +2901,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, "funding": [ { "type": "individual", @@ -2945,7 +2921,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, "funding": [ { "type": "individual", @@ -2978,7 +2953,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "dev": true, "funding": [ { "type": "individual", @@ -3001,7 +2975,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, "funding": [ { "type": "individual", @@ -5245,7 +5218,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=6.0.0" @@ -5255,14 +5228,14 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -5341,7 +5314,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz", "integrity": "sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA==", - "dev": true, "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -5356,8 +5328,7 @@ "node_modules/@metamask/eth-sig-util/node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/@microsoft/fetch-event-source": { "version": "2.0.1", @@ -5390,7 +5361,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true, "funding": [ { "type": "individual", @@ -5402,7 +5372,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", - "dev": true, "funding": [ { "type": "individual", @@ -5473,7 +5442,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -5490,7 +5458,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "^4.0.0", "@nomicfoundation/ethereumjs-common": "^3.0.0", @@ -5513,7 +5480,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5530,7 +5496,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, "dependencies": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -5547,7 +5512,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -5555,14 +5519,12 @@ "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@nomicfoundation/ethereumjs-common": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-util": "^8.0.0", "crc-32": "^1.2.0" @@ -5572,7 +5534,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "^4.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -5589,7 +5550,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-util": "^8.0.0", @@ -5608,7 +5568,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5624,14 +5583,12 @@ "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@nomicfoundation/ethereumjs-rlp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", - "dev": true, "bin": { "rlp": "bin/rlp" }, @@ -5643,7 +5600,6 @@ "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==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -5658,7 +5614,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5674,14 +5629,12 @@ "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@nomicfoundation/ethereumjs-trie": { "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==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "^4.0.0", "@nomicfoundation/ethereumjs-util": "^8.0.0", @@ -5696,7 +5649,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5710,7 +5662,6 @@ "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==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -5725,7 +5676,6 @@ "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==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", "ethereum-cryptography": "0.1.3" @@ -5738,7 +5688,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", - "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "^4.0.0", "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", @@ -5765,7 +5714,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5781,8 +5729,7 @@ "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "1.0.5", @@ -5904,7 +5851,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", - "dev": true, "engines": { "node": ">= 12" }, @@ -5928,7 +5874,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -5944,7 +5889,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -5960,7 +5904,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -5976,7 +5919,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -5992,7 +5934,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6008,7 +5949,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6024,7 +5964,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6040,7 +5979,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -6056,7 +5994,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -6072,7 +6009,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -6085,7 +6021,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", - "dev": true, "peerDependencies": { "ethers": "^5.0.0", "hardhat": "^2.0.0" @@ -6683,7 +6618,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true, "funding": [ { "type": "individual", @@ -6695,7 +6629,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", - "dev": true, "funding": [ { "type": "individual", @@ -6712,7 +6645,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "dev": true, "funding": [ { "type": "individual", @@ -7109,7 +7041,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -7125,7 +7056,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -7139,7 +7069,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -7153,7 +7082,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -7173,7 +7101,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -7182,7 +7109,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -7198,7 +7124,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true, "engines": { "node": ">=6" } @@ -7207,7 +7132,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -7243,6 +7167,95 @@ "node": ">=6" } }, + "node_modules/@tenderly/hardhat-tenderly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.8.0.tgz", + "integrity": "sha512-HzyYsFZEXVALz+vDn1XesvaqrSDr3vYqlMd/A+r6pi6er1dFRlbUPW5mdalPQsbPOsBIO+PXjOlrM7mGgBdYEQ==", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@nomiclabs/hardhat-ethers": "^2.1.1", + "axios": "^0.27.2", + "ethers": "^5.7.0", + "fs-extra": "^10.1.0", + "hardhat-deploy": "^0.11.14", + "js-yaml": "^4.1.0", + "tenderly": "^0.6.0", + "tslog": "^4.3.1" + }, + "peerDependencies": { + "hardhat": "^2.10.2" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@textile/buckets": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/@textile/buckets/-/buckets-6.0.5.tgz", @@ -9112,28 +9125,28 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@typechain/ethers-v5": { @@ -9239,8 +9252,7 @@ "node_modules/@types/async-eventemitter": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==" }, "node_modules/@types/bignumber.js": { "version": "5.0.0", @@ -9256,7 +9268,6 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -9497,8 +9508,7 @@ "node_modules/@types/lru-cache": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz", - "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==", - "dev": true + "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==" }, "node_modules/@types/mime": { "version": "1.3.2", @@ -9533,8 +9543,7 @@ "node_modules/@types/node": { "version": "12.20.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.11.tgz", - "integrity": "sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ==", - "dev": true + "integrity": "sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -9570,7 +9579,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -9584,8 +9592,7 @@ "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "node_modules/@types/range-parser": { "version": "1.2.3", @@ -9598,7 +9605,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.2.tgz", "integrity": "sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -9654,8 +9660,7 @@ "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "node_modules/@uniswap/lib": { "version": "4.0.1-alpha", @@ -9957,7 +9962,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -9969,7 +9973,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -9987,7 +9990,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "funding": [ { "type": "github", @@ -10011,7 +10013,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, "funding": [ { "type": "github", @@ -10034,7 +10035,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, "engines": { "node": ">=12" } @@ -10056,13 +10056,12 @@ } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" @@ -10116,7 +10115,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=0.4.0" @@ -10136,7 +10135,6 @@ "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, "engines": { "node": ">=0.3.0" } @@ -10144,14 +10142,12 @@ "node_modules/aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "dependencies": { "debug": "4" }, @@ -10163,7 +10159,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -10179,14 +10174,12 @@ "node_modules/agent-base/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -10234,7 +10227,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -10249,7 +10241,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -10283,7 +10274,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -10331,7 +10321,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -10766,7 +10755,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/argparse": { @@ -10830,8 +10819,7 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "node_modules/array-union": { "version": "1.0.2", @@ -10979,7 +10967,6 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, "dependencies": { "lodash": "^4.17.14" } @@ -10988,7 +10975,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, "dependencies": { "async": "^2.4.0" } @@ -11012,8 +10998,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -11067,12 +11052,28 @@ "dev": true }, "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/babel-code-frame": { @@ -11339,8 +11340,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", @@ -11364,7 +11364,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" } @@ -11449,7 +11448,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -11483,8 +11481,7 @@ "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big.js": { "version": "5.2.2", @@ -11499,7 +11496,6 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dev": true, "dependencies": { "bigint-mod-arith": "^3.1.0" }, @@ -11511,7 +11507,6 @@ "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==", - "dev": true, "engines": { "node": ">=10.4.0" } @@ -11529,7 +11524,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -11667,8 +11661,7 @@ "node_modules/blakejs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", - "dev": true + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" }, "node_modules/blob-to-it": { "version": "1.0.2", @@ -11689,37 +11682,51 @@ "node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true, + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/boolbase": { @@ -11770,7 +11777,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11812,8 +11818,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "node_modules/browser-headers": { "version": "0.4.1", @@ -11826,7 +11831,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -11844,14 +11848,12 @@ "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -11985,7 +11987,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, "dependencies": { "base-x": "^3.0.2" } @@ -11994,7 +11995,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -12061,8 +12061,7 @@ "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "node_modules/buffer-pipe": { "version": "0.0.3", @@ -12083,14 +12082,13 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "node_modules/bufferutil": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.2.0" @@ -12116,10 +12114,9 @@ "dev": true }, "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -12190,7 +12187,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -12259,7 +12255,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, "engines": { "node": ">=6" } @@ -12321,7 +12316,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -12502,8 +12496,7 @@ "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/cids": { "version": "0.7.5", @@ -12538,7 +12531,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -12589,7 +12581,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, "hasInstallScript": true, "dependencies": { "abstract-level": "^1.0.2", @@ -12605,14 +12596,12 @@ "node_modules/classic-level/node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, "engines": { "node": ">=6" } @@ -12659,19 +12648,17 @@ } }, "node_modules/cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", - "dev": true, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dependencies": { - "object-assign": "^4.1.0", "string-width": "^4.2.0" }, "engines": { "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "^1.1.2" + "@colors/colors": "1.5.0" } }, "node_modules/cliui": { @@ -12796,7 +12783,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -12810,8 +12796,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/colorette": { "version": "1.2.2", @@ -12833,7 +12818,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12844,8 +12828,7 @@ "node_modules/command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "node_modules/command-line-args": { "version": "5.2.1", @@ -12898,8 +12881,7 @@ "node_modules/commander": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "node_modules/compare-versions": { "version": "3.6.0", @@ -12923,8 +12905,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -12977,17 +12958,35 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/content-hash": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", @@ -13000,10 +12999,9 @@ } }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } @@ -13019,10 +13017,9 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true, + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -13030,8 +13027,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/cookiejar": { "version": "2.1.2", @@ -13138,7 +13134,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -13160,7 +13155,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -13173,7 +13167,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -13187,7 +13180,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/cross-env": { @@ -13443,7 +13436,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -13583,6 +13575,14 @@ "node": ">=6" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -13663,7 +13663,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -13725,6 +13724,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true, + "optional": true, "engines": { "node": ">= 0.6" } @@ -13747,10 +13747,13 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-indent": { "version": "5.0.0", @@ -13841,7 +13844,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, "engines": { "node": ">=0.3.1" } @@ -14080,8 +14082,7 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-fetch": { "version": "1.7.3", @@ -14107,7 +14108,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -14131,20 +14131,17 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encode-utf8": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -14210,7 +14207,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, "dependencies": { "ansi-colors": "^4.1.1" }, @@ -14222,7 +14218,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, "engines": { "node": ">=6" } @@ -14240,7 +14235,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } @@ -14416,7 +14410,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -14424,14 +14417,12 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -15105,8 +15096,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true, + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -15635,7 +15625,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -15657,14 +15646,12 @@ "node_modules/ethereum-cryptography/node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/ethereum-cryptography/node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "node_modules/ethereum-ens": { "version": "0.8.0", @@ -15752,7 +15739,6 @@ "version": "0.6.8", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -15780,7 +15766,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -15795,7 +15780,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, "funding": [ { "type": "individual", @@ -15890,7 +15874,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -15921,7 +15904,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, "engines": { "node": ">=6" } @@ -15946,7 +15928,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -16139,38 +16120,38 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -16179,13 +16160,53 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true, + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" } }, "node_modules/ext": { @@ -16647,23 +16668,30 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-exec": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/find-exec/-/find-exec-1.0.2.tgz", @@ -16845,16 +16873,14 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", - "dev": true, "dependencies": { "imul": "^1.0.0" } }, "node_modules/follow-redirects": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", - "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==", - "dev": true, + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -16932,10 +16958,9 @@ } }, "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true, + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } @@ -16943,8 +16968,7 @@ "node_modules/fp-ts": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" }, "node_modules/fragment-cache": { "version": "0.2.1", @@ -16961,8 +16985,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true, + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } @@ -17007,14 +17030,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -17027,14 +17048,12 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "node_modules/ganache": { "version": "7.4.3", @@ -26830,7 +26849,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -26848,7 +26866,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -26936,7 +26953,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -27380,8 +27396,7 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/graphql": { "version": "15.5.0", @@ -27618,7 +27633,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -27723,7 +27737,6 @@ "version": "0.11.26", "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.26.tgz", "integrity": "sha512-GvnkD8v6q0coCQbwZNeUcO3ab1zz36FKsqzNdm6EcnVoAfXVkFpdA0pgJ7/Rk3+Lv5709xOtbneFOyoukUOhWQ==", - "dev": true, "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -27765,7 +27778,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -27776,11 +27788,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/hardhat-deploy/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/hardhat-deploy/node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -27792,7 +27811,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27808,7 +27826,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -27835,7 +27852,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -27846,14 +27862,12 @@ "node_modules/hardhat-deploy/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/hardhat-deploy/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -27870,7 +27884,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -27882,7 +27895,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -27896,7 +27908,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -27910,7 +27921,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -27922,7 +27932,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -27931,7 +27940,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -27940,7 +27948,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -27951,14 +27958,12 @@ "node_modules/hardhat-deploy/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/hardhat-deploy/node_modules/qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -27973,7 +27978,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -27985,7 +27989,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -27997,7 +28000,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -28009,7 +28011,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -28147,7 +28148,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -28156,7 +28156,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, "engines": { "node": ">=6" } @@ -28165,7 +28164,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -28174,7 +28172,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -28188,14 +28185,12 @@ "node_modules/hardhat/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/hardhat/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -28204,7 +28199,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -28216,7 +28210,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -28243,7 +28236,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -28254,7 +28246,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -28265,14 +28256,12 @@ "node_modules/hardhat/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/hardhat/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -28289,7 +28278,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -28301,7 +28289,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "dev": true, "dependencies": { "@noble/hashes": "1.1.2", "@noble/secp256k1": "1.6.3", @@ -28313,7 +28300,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -28325,7 +28311,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "dependencies": { "locate-path": "^2.0.0" }, @@ -28337,7 +28322,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -28351,7 +28335,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -28371,7 +28354,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -28383,32 +28365,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/hardhat/node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/hardhat/node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -28417,7 +28381,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -28429,7 +28392,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -28438,7 +28400,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -28451,7 +28412,6 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", - "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", @@ -28492,7 +28452,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -28508,7 +28467,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -28523,7 +28481,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -28534,14 +28491,12 @@ "node_modules/hardhat/node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/hardhat/node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -28556,7 +28511,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -28571,7 +28525,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -28579,14 +28532,12 @@ "node_modules/hardhat/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/hardhat/node_modules/nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -28598,7 +28549,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "dependencies": { "p-try": "^1.0.0" }, @@ -28610,7 +28560,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "dependencies": { "p-limit": "^1.1.0" }, @@ -28622,7 +28571,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, "engines": { "node": ">=4" } @@ -28631,7 +28579,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, "engines": { "node": ">=4" } @@ -28640,7 +28587,6 @@ "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -28651,26 +28597,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/hardhat/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -28682,7 +28612,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -28691,7 +28620,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -28703,7 +28631,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -28718,7 +28645,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -28730,7 +28656,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -28738,14 +28663,12 @@ "node_modules/hardhat/node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/hardhat/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -28762,7 +28685,6 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, "engines": { "node": ">=8.3.0" }, @@ -28783,7 +28705,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -28792,7 +28713,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -28810,7 +28730,6 @@ "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, "engines": { "node": ">=10" } @@ -28819,7 +28738,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -28861,7 +28779,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, "engines": { "node": ">=4" } @@ -28879,7 +28796,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -28949,7 +28865,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -28963,7 +28878,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -28977,7 +28891,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -28997,7 +28910,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -29020,7 +28932,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, "bin": { "he": "bin/he" } @@ -29063,7 +28974,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -29134,26 +29044,43 @@ "dev": true }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } }, "node_modules/http-https": { "version": "1.0.0", @@ -29197,7 +29124,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -29210,7 +29136,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -29226,8 +29151,7 @@ "node_modules/https-proxy-agent/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/husky": { "version": "4.3.8", @@ -29338,6 +29262,14 @@ "node": ">=8" } }, + "node_modules/hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/ice-cap": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", @@ -29491,7 +29423,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -29524,7 +29455,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -29582,8 +29512,7 @@ "node_modules/immutable": { "version": "4.0.0-rc.12", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", - "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==", - "dev": true + "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -29628,7 +29557,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -29646,7 +29574,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, "engines": { "node": ">=8" } @@ -29655,7 +29582,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -29664,8 +29590,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -29705,7 +29630,6 @@ "version": "1.10.4", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, "dependencies": { "fp-ts": "^1.0.0" } @@ -29724,7 +29648,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, "engines": { "node": ">= 0.10" } @@ -30785,7 +30708,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -30910,7 +30832,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "bin": { "is-docker": "cli.js" }, @@ -30964,7 +30885,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -30985,7 +30905,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -31012,7 +30931,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -31024,7 +30942,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", - "dev": true, "engines": { "node": ">=6.5.0", "npm": ">=3" @@ -31284,7 +31201,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { "node": ">=10" }, @@ -31336,7 +31252,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -31653,8 +31568,7 @@ "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -31902,7 +31816,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -31945,7 +31858,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "dev": true, "hasInstallScript": true, "dependencies": { "node-addon-api": "^2.0.0", @@ -31960,7 +31872,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -32056,7 +31967,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.9" } @@ -32070,6 +31980,14 @@ "graceful-fs": "^4.1.11" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, "node_modules/lazy-debug-legacy": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", @@ -32287,7 +32205,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, "dependencies": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -32300,7 +32217,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "funding": [ { "type": "github", @@ -32580,8 +32496,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", @@ -32769,7 +32684,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -32785,7 +32699,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -32800,7 +32713,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32816,7 +32728,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -32827,14 +32738,12 @@ "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -32843,7 +32752,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -32911,8 +32819,7 @@ "node_modules/lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=", - "dev": true + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" }, "node_modules/lru-cache": { "version": "6.0.0", @@ -32972,7 +32879,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/map-cache": { @@ -33025,8 +32932,7 @@ "node_modules/match-all": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", - "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", - "dev": true + "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==" }, "node_modules/math-random": { "version": "1.0.4", @@ -33039,7 +32945,6 @@ "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true, "engines": { "node": ">=8.9.0" } @@ -33048,7 +32953,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -33059,7 +32963,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true, "engines": { "node": ">= 0.6" } @@ -33161,7 +33064,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, "dependencies": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -33175,7 +33077,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true, "engines": { "node": ">= 0.10.0" } @@ -33183,8 +33084,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "node_modules/merge-options": { "version": "2.0.0", @@ -33309,7 +33209,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true, "engines": { "node": ">= 0.6" } @@ -33361,7 +33260,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, "bin": { "mime": "cli.js" }, @@ -33370,21 +33268,19 @@ } }, "node_modules/mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "dev": true, + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "dev": true, + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.47.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -33429,20 +33325,17 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -33532,7 +33425,6 @@ "version": "0.38.3", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", - "dev": true, "dependencies": { "obliterator": "^1.6.1" } @@ -33963,7 +33855,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, "engines": { "node": ">=10" } @@ -34205,11 +34096,19 @@ "node": ">=0.10.0" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/multiaddr": { "version": "8.1.2", @@ -34490,7 +34389,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", - "dev": true, "dependencies": { "encode-utf8": "^1.0.2", "fmix": "^0.1.0", @@ -34620,10 +34518,9 @@ "optional": true }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } @@ -34653,8 +34550,7 @@ "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node_modules/node-emoji": { "version": "1.11.0", @@ -34711,7 +34607,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -34870,7 +34765,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -35062,7 +34956,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -35162,8 +35055,7 @@ "node_modules/obliterator": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", - "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", - "dev": true + "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" }, "node_modules/oboe": { "version": "2.1.5", @@ -35175,10 +35067,9 @@ } }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -35190,7 +35081,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -35367,7 +35257,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -35453,7 +35342,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -35640,7 +35528,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -35887,7 +35774,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -35904,8 +35790,7 @@ "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "node_modules/path-starts-with": { "version": "2.0.0", @@ -35919,8 +35804,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "node_modules/path-type": { "version": "3.0.0", @@ -35956,7 +35840,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -36127,7 +36010,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -37228,6 +37110,18 @@ "node": ">=6" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -37321,18 +37215,23 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -37431,7 +37330,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -37476,7 +37374,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -37495,19 +37392,17 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -38228,7 +38123,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -38237,7 +38131,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -38296,7 +38189,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, "dependencies": { "path-parse": "^1.0.6" }, @@ -38398,7 +38290,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -38408,7 +38299,6 @@ "version": "2.2.6", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "dev": true, "dependencies": { "bn.js": "^4.11.1" }, @@ -38511,7 +38401,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, "funding": [ { "type": "github", @@ -38533,8 +38422,7 @@ "node_modules/rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "node_modules/rxjs": { "version": "6.6.7", @@ -38552,8 +38440,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex": { "version": "1.1.0", @@ -38567,8 +38454,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { "version": "1.2.4", @@ -38715,7 +38601,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, "hasInstallScript": true, "dependencies": { "elliptic": "^6.5.2", @@ -38745,7 +38630,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -38769,34 +38653,48 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/sentence-case": { "version": "2.1.1", @@ -38818,15 +38716,14 @@ } }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -38888,16 +38785,14 @@ "dev": true }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -39008,7 +38903,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -39072,6 +38966,11 @@ "simple-concat": "^1.0.0" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -39353,6 +39252,15 @@ "sol2uml": "lib/sol2uml.js" } }, + "node_modules/sol2uml/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/sol2uml/node_modules/debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -39389,7 +39297,6 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, "dependencies": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -39412,7 +39319,6 @@ "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -39425,7 +39331,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -39437,7 +39342,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -40722,7 +40626,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -40732,7 +40635,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -40937,7 +40839,6 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -40949,7 +40850,6 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, "engines": { "node": ">=8" } @@ -40984,6 +40884,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true, + "optional": true, "engines": { "node": ">= 0.6" } @@ -41049,7 +40950,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -41064,7 +40964,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -41078,7 +40977,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } @@ -41087,7 +40985,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -41172,7 +41069,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dev": true, "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -41194,7 +41090,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -41287,7 +41182,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -41633,6 +41527,96 @@ "node": ">=4.5" } }, + "node_modules/tenderly": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tenderly/-/tenderly-0.6.0.tgz", + "integrity": "sha512-uPnR5ujR1j0Aay4nuqymTY2nu3e0yDjl6dHBqkTTIYEDzyzaDLx2+PkVxjT5RWseAbWORsa6GYetletATf1zmQ==", + "dependencies": { + "axios": "^0.27.2", + "cli-table3": "^0.6.2", + "commander": "^9.4.0", + "express": "^4.18.1", + "hyperlinker": "^1.0.0", + "js-yaml": "^4.1.0", + "open": "^8.4.0", + "prompts": "^2.4.2", + "tslog": "^4.4.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tenderly/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/tenderly/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/tenderly/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/tenderly/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tenderly/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tenderly/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/testrpc": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", @@ -41815,7 +41799,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -41953,6 +41936,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true, + "optional": true, "engines": { "node": ">=0.6" } @@ -42668,7 +42652,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -42712,7 +42696,7 @@ "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, + "devOptional": true, "peer": true, "bin": { "acorn": "bin/acorn" @@ -42725,7 +42709,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=0.3.1" @@ -42734,14 +42718,23 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tslog": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.9.2.tgz", + "integrity": "sha512-wBM+LRJoNl34Bdu8mYEFxpvmOUedpNUwMNQB/NcuPIZKwdDde6xLHUev3bBjXQU7gdurX++X/YE7gLH8eXYsiQ==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/fullstack-build/tslog?sponsor=1" + } }, "node_modules/tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=", - "dev": true + "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -42764,8 +42757,7 @@ "node_modules/tweetnacl-util": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "node_modules/type": { "version": "1.2.0", @@ -42798,7 +42790,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -42959,7 +42950,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, + "devOptional": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -43094,7 +43085,6 @@ "version": "5.21.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, "dependencies": { "busboy": "^1.6.0" }, @@ -43106,7 +43096,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, "dependencies": { "streamsearch": "^1.1.0" }, @@ -43118,7 +43107,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, "engines": { "node": ">=10.0.0" } @@ -43177,7 +43165,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, "engines": { "node": ">= 4.0.0" } @@ -43222,7 +43209,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, "engines": { "node": ">= 0.8" } @@ -43387,7 +43373,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.2.0" @@ -43416,8 +43402,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/util.promisify": { "version": "1.1.1", @@ -43440,7 +43425,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true, "engines": { "node": ">= 0.4.0" } @@ -43465,7 +43449,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/vali-date": { @@ -43515,7 +43499,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true, "engines": { "node": ">= 0.8" } @@ -44660,8 +44643,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "2.4.3", @@ -44825,8 +44807,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", @@ -44878,7 +44859,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -44893,7 +44873,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -44905,7 +44884,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -44917,7 +44895,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, "bin": { "flat": "cli.js" } @@ -44926,7 +44903,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, "engines": { "node": ">=8" } @@ -45055,7 +45031,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=6" @@ -45065,7 +45041,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -45095,7 +45070,6 @@ "version": "0.14.3", "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.3.tgz", "integrity": "sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==", - "dev": true, "peerDependencies": { "ethers": "^5.7.0" } @@ -45282,13 +45256,6 @@ "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "optional": true } } }, @@ -46302,6 +46269,12 @@ "to-fast-properties": "^2.0.0" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, "@consento/sync-randombytes": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@consento/sync-randombytes/-/sync-randombytes-1.0.5.tgz", @@ -46317,7 +46290,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" @@ -47046,7 +47019,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -47063,7 +47035,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -47078,7 +47049,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -47091,7 +47061,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -47104,7 +47073,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0" } @@ -47113,7 +47081,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -47123,7 +47090,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -47133,8 +47099,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -47142,7 +47107,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -47151,7 +47115,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0" } @@ -47160,7 +47123,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "dev": true, "requires": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -47178,7 +47140,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -47195,7 +47156,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -47215,7 +47175,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "dev": true, "requires": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -47235,8 +47194,7 @@ "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" } } }, @@ -47244,7 +47202,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -47253,14 +47210,12 @@ "@ethersproject/logger": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "dev": true + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" }, "@ethersproject/networks": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -47269,7 +47224,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -47279,7 +47233,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "dev": true, "requires": { "@ethersproject/logger": "^5.7.0" } @@ -47288,7 +47241,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -47316,7 +47268,6 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, "requires": {} } } @@ -47325,7 +47276,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -47335,7 +47285,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -47345,7 +47294,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -47356,7 +47304,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -47369,8 +47316,7 @@ "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" } } }, @@ -47378,7 +47324,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -47392,7 +47337,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -47403,7 +47347,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "dev": true, "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -47420,7 +47363,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "dev": true, "requires": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -47431,7 +47373,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "dev": true, "requires": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -47454,7 +47395,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "dev": true, "requires": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -47467,7 +47407,6 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "dev": true, "requires": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -49490,21 +49429,21 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "peer": true }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, + "devOptional": true, "peer": true }, "@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -49579,7 +49518,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz", "integrity": "sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA==", - "dev": true, "requires": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -49591,8 +49529,7 @@ "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" } } }, @@ -49623,14 +49560,12 @@ "@noble/hashes": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" }, "@noble/secp256k1": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", - "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", - "dev": true + "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==" }, "@nodefactory/filsnap-adapter": { "version": "0.2.2", @@ -49684,7 +49619,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -49698,7 +49632,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "^4.0.0", "@nomicfoundation/ethereumjs-common": "^3.0.0", @@ -49718,7 +49651,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -49727,7 +49659,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, "requires": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -49737,7 +49668,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } @@ -49745,8 +49675,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -49754,7 +49683,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-util": "^8.0.0", "crc-32": "^1.2.0" @@ -49764,7 +49692,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "^4.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -49778,7 +49705,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-util": "^8.0.0", @@ -49794,7 +49720,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -49802,22 +49727,19 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@nomicfoundation/ethereumjs-rlp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", - "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", - "dev": true + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==" }, "@nomicfoundation/ethereumjs-statemanager": { "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==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -49832,7 +49754,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -49840,8 +49761,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -49849,7 +49769,6 @@ "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==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-rlp": "^4.0.0", "@nomicfoundation/ethereumjs-util": "^8.0.0", @@ -49861,7 +49780,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -49874,7 +49792,6 @@ "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==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-common": "^3.0.0", "@nomicfoundation/ethereumjs-rlp": "^4.0.0", @@ -49886,7 +49803,6 @@ "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==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", "ethereum-cryptography": "0.1.3" @@ -49896,7 +49812,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", - "dev": true, "requires": { "@nomicfoundation/ethereumjs-block": "^4.0.0", "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", @@ -49920,7 +49835,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -49928,8 +49842,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -50019,7 +49932,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", - "dev": true, "requires": { "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", @@ -50037,77 +49949,66 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-darwin-x64": { "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==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-freebsd-x64": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-linux-x64-musl": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", - "dev": true, "optional": true }, "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", - "dev": true, "optional": true }, "@nomiclabs/hardhat-ethers": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", - "dev": true, "requires": {} }, "@nomiclabs/hardhat-etherscan": { @@ -50663,14 +50564,12 @@ "@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" }, "@scure/bip32": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", - "dev": true, "requires": { "@noble/hashes": "~1.1.1", "@noble/secp256k1": "~1.6.0", @@ -50681,7 +50580,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "dev": true, "requires": { "@noble/hashes": "~1.1.1", "@scure/base": "~1.1.0" @@ -50990,7 +50888,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dev": true, "requires": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -51003,7 +50900,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, "requires": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -51014,7 +50910,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dev": true, "requires": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -51025,7 +50920,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dev": true, "requires": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -51041,8 +50935,7 @@ "cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" } } }, @@ -51050,7 +50943,6 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dev": true, "requires": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -51062,14 +50954,12 @@ "@sentry/types": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "dev": true + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==" }, "@sentry/utils": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dev": true, "requires": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -51096,6 +50986,80 @@ "defer-to-connect": "^1.0.1" } }, + "@tenderly/hardhat-tenderly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@tenderly/hardhat-tenderly/-/hardhat-tenderly-1.8.0.tgz", + "integrity": "sha512-HzyYsFZEXVALz+vDn1XesvaqrSDr3vYqlMd/A+r6pi6er1dFRlbUPW5mdalPQsbPOsBIO+PXjOlrM7mGgBdYEQ==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@nomiclabs/hardhat-ethers": "^2.1.1", + "axios": "^0.27.2", + "ethers": "^5.7.0", + "fs-extra": "^10.1.0", + "hardhat-deploy": "^0.11.14", + "js-yaml": "^4.1.0", + "tenderly": "^0.6.0", + "tslog": "^4.3.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + } + } + }, "@textile/buckets": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/@textile/buckets/-/buckets-6.0.5.tgz", @@ -52777,28 +52741,28 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, + "devOptional": true, "peer": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, + "devOptional": true, "peer": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, + "devOptional": true, "peer": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, + "devOptional": true, "peer": true }, "@typechain/ethers-v5": { @@ -52882,8 +52846,7 @@ "@types/async-eventemitter": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==" }, "@types/bignumber.js": { "version": "5.0.0", @@ -52898,7 +52861,6 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, "requires": { "@types/node": "*" } @@ -53141,8 +53103,7 @@ "@types/lru-cache": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz", - "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==", - "dev": true + "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==" }, "@types/mime": { "version": "1.3.2", @@ -53177,8 +53138,7 @@ "@types/node": { "version": "12.20.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.11.tgz", - "integrity": "sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ==", - "dev": true + "integrity": "sha512-gema+apZ6qLQK7k7F0dGkGCWQYsL0qqKORWOQO6tq46q+x+1C0vbOiOqOwRVlh4RAdbQwV/j/ryr3u5NOG1fPQ==" }, "@types/node-fetch": { "version": "2.6.2", @@ -53213,7 +53173,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -53227,8 +53186,7 @@ "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "@types/range-parser": { "version": "1.2.3", @@ -53241,7 +53199,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.2.tgz", "integrity": "sha512-QMg+9v0bbNJ2peLuHRWxzmy0HRJIG6gFZNhaRSp7S3ggSbCCxiqQB2/ybvhXyhHOCequpNkrx7OavNhrWOsW0A==", - "dev": true, "requires": { "@types/node": "*" } @@ -53297,8 +53254,7 @@ "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "@uniswap/lib": { "version": "4.0.1-alpha", @@ -53538,7 +53494,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, "requires": { "event-target-shim": "^5.0.0" } @@ -53547,7 +53502,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, "requires": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -53562,7 +53516,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -53571,14 +53524,12 @@ "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "level-supports": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==" } } }, @@ -53596,13 +53547,12 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -53641,7 +53591,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "peer": true }, "address": { @@ -53654,20 +53604,17 @@ "adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" }, "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "requires": { "debug": "4" }, @@ -53676,7 +53623,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -53684,8 +53630,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -53693,7 +53638,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -53728,7 +53672,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "requires": { "type-fest": "^0.21.3" }, @@ -53736,8 +53679,7 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, @@ -53764,7 +53706,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -53806,7 +53747,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -54147,7 +54087,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, + "devOptional": true, "peer": true }, "argparse": { @@ -54199,8 +54139,7 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-union": { "version": "1.0.2", @@ -54318,7 +54257,6 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, "requires": { "lodash": "^4.17.14" } @@ -54327,7 +54265,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, "requires": { "async": "^2.4.0" } @@ -54351,8 +54288,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "at-least-node": { "version": "1.0.0", @@ -54388,12 +54324,27 @@ "dev": true }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "babel-code-frame": { @@ -54635,8 +54586,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -54697,7 +54647,6 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -54728,8 +54677,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "base64-sol": { "version": "1.0.1", @@ -54749,8 +54697,7 @@ "bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "dev": true + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "big.js": { "version": "5.2.2", @@ -54762,7 +54709,6 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dev": true, "requires": { "bigint-mod-arith": "^3.1.0" } @@ -54770,8 +54716,7 @@ "bigint-mod-arith": { "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==", - "dev": true + "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==" }, "bignumber.js": { "version": "9.0.1", @@ -54782,8 +54727,7 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bindings": { "version": "1.5.0", @@ -54917,8 +54861,7 @@ "blakejs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", - "dev": true + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" }, "blob-to-it": { "version": "1.0.2", @@ -54939,32 +54882,39 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } } } }, @@ -55012,7 +54962,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -55050,8 +54999,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-headers": { "version": "0.4.1", @@ -55064,7 +55012,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dev": true, "requires": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -55082,14 +55029,12 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -55200,7 +55145,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, "requires": { "base-x": "^3.0.2" } @@ -55209,7 +55153,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, "requires": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -55259,8 +55202,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-pipe": { "version": "0.0.3", @@ -55281,14 +55223,13 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "bufferutil": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "dev": true, + "devOptional": true, "requires": { "node-gyp-build": "^4.2.0" } @@ -55310,10 +55251,9 @@ "dev": true }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cache-base": { "version": "1.0.1", @@ -55368,7 +55308,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -55424,8 +55363,7 @@ "catering": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==" }, "cbor": { "version": "5.2.0", @@ -55472,7 +55410,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -55620,8 +55557,7 @@ "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cids": { "version": "0.7.5", @@ -55652,7 +55588,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -55698,7 +55633,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, "requires": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -55710,16 +55644,14 @@ "napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" } } }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-color": { "version": "2.0.3", @@ -55751,13 +55683,11 @@ "dev": true }, "cli-table3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", - "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", - "dev": true, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, @@ -55861,7 +55791,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -55875,8 +55804,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "colorette": { "version": "1.2.2", @@ -55895,7 +55823,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -55903,8 +55830,7 @@ "command-exists": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "command-line-args": { "version": "5.2.1", @@ -55947,8 +55873,7 @@ "commander": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "compare-versions": { "version": "3.6.0", @@ -55972,8 +55897,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -56020,12 +55944,18 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-hash": { @@ -56040,10 +55970,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "convert-source-map": { "version": "1.7.0", @@ -56056,16 +55985,14 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { "version": "2.1.2", @@ -56145,8 +56072,7 @@ "crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "create-ecdh": { "version": "4.0.4", @@ -56162,7 +56088,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -56175,7 +56100,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -56189,7 +56113,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, + "devOptional": true, "peer": true }, "cross-env": { @@ -56397,7 +56321,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -56517,6 +56440,11 @@ } } }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -56577,8 +56505,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", @@ -56626,7 +56553,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "dev": true, + "optional": true }, "deprecated-decorator": { "version": "0.1.6", @@ -56646,10 +56574,9 @@ } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-indent": { "version": "5.0.0", @@ -56714,8 +56641,7 @@ "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, "diffie-hellman": { "version": "5.0.3", @@ -56914,8 +56840,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-fetch": { "version": "1.7.3", @@ -56938,7 +56863,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -56959,20 +56883,17 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encode-utf8": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "encoding": { "version": "0.1.13", @@ -57031,7 +56952,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, "requires": { "ansi-colors": "^4.1.1" }, @@ -57039,8 +56959,7 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" } } }, @@ -57053,8 +56972,7 @@ "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, "err-code": { "version": "2.0.3", @@ -57206,20 +57124,17 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.8.1", @@ -57739,8 +57654,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "eth-ens-namehash": { "version": "2.0.8", @@ -58168,7 +58082,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, "requires": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -58190,14 +58103,12 @@ "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" } } }, @@ -58270,7 +58181,6 @@ "version": "0.6.8", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, "requires": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -58296,7 +58206,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, "requires": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -58311,7 +58220,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, "requires": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -58392,7 +58300,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -58418,8 +58325,7 @@ "event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, "eventemitter3": { "version": "4.0.4", @@ -58438,7 +58344,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -58601,48 +58506,65 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, @@ -59039,18 +58961,24 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } } }, "find-exec": { @@ -59185,16 +59113,14 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", - "dev": true, "requires": { "imul": "^1.0.0" } }, "follow-redirects": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", - "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==", - "dev": true + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "for-each": { "version": "0.3.3", @@ -59246,16 +59172,14 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fp-ts": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" }, "fragment-cache": { "version": "0.2.1", @@ -59269,8 +59193,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-capacitor": { "version": "2.0.4", @@ -59309,27 +59232,23 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "ganache": { "version": "7.4.3", @@ -66806,8 +66725,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -66819,7 +66737,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -66892,7 +66809,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -67259,8 +67175,7 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "graphql": { "version": "15.5.0", @@ -67444,7 +67359,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, "requires": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -67502,7 +67416,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dev": true, "requires": { "@types/node": "*" } @@ -67510,20 +67423,17 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -67531,14 +67441,12 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -67547,7 +67455,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -67556,7 +67463,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -67572,7 +67478,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -67583,7 +67488,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -67591,14 +67495,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -67606,14 +67508,12 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "ethereum-cryptography": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "dev": true, "requires": { "@noble/hashes": "1.1.2", "@noble/secp256k1": "1.6.3", @@ -67625,7 +67525,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -67634,7 +67533,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "^2.0.0" } @@ -67643,7 +67541,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -67654,7 +67551,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -67668,7 +67564,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -67676,33 +67571,17 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -67711,7 +67590,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -67720,7 +67598,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -67730,7 +67607,6 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", - "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", @@ -67760,7 +67636,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -67770,7 +67645,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -67779,7 +67653,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -67787,14 +67660,12 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -67803,7 +67674,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "requires": { "p-limit": "^3.0.2" } @@ -67811,28 +67681,24 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" } } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -67841,7 +67707,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -67849,41 +67714,25 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, "requires": { "side-channel": "^1.0.4" } }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -67892,7 +67741,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -67901,7 +67749,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -67910,7 +67757,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -67919,7 +67765,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -67927,20 +67772,17 @@ "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -67951,20 +67793,17 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, "requires": {} }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -67978,8 +67817,7 @@ "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" } } }, @@ -68007,7 +67845,6 @@ "version": "0.11.26", "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.26.tgz", "integrity": "sha512-GvnkD8v6q0coCQbwZNeUcO3ab1zz36FKsqzNdm6EcnVoAfXVkFpdA0pgJ7/Rk3+Lv5709xOtbneFOyoukUOhWQ==", - "dev": true, "requires": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -68039,16 +67876,22 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -68057,7 +67900,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -68067,7 +67909,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -68083,7 +67924,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -68091,14 +67931,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -68107,7 +67945,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -68116,7 +67953,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -68127,7 +67963,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -68138,7 +67973,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -68146,20 +67980,17 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -68168,14 +67999,12 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "qs": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, "requires": { "side-channel": "^1.0.4" } @@ -68184,7 +68013,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -68193,7 +68021,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -68202,7 +68029,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -68210,8 +68036,7 @@ "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" } } }, @@ -68323,7 +68148,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -68354,8 +68178,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbol-support-x": { "version": "1.4.2", @@ -68366,8 +68189,7 @@ "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-to-string-tag-x": { "version": "1.4.1", @@ -68421,7 +68243,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -68432,7 +68253,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -68442,8 +68262,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -68451,7 +68270,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -68470,8 +68288,7 @@ "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "header-case": { "version": "1.0.1", @@ -68506,7 +68323,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -68567,23 +68383,31 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" } } }, @@ -68627,7 +68451,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -68637,7 +68460,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -68645,8 +68467,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -68725,6 +68546,11 @@ } } }, + "hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==" + }, "ice-cap": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ice-cap/-/ice-cap-0.0.4.tgz", @@ -68874,7 +68700,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -68899,8 +68724,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "3.3.10", @@ -68941,8 +68765,7 @@ "immutable": { "version": "4.0.0-rc.12", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz", - "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==", - "dev": true + "integrity": "sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==" }, "import-fresh": { "version": "3.3.0", @@ -68976,8 +68799,7 @@ "imul": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=", - "dev": true + "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=" }, "imurmurhash": { "version": "0.1.4", @@ -68988,14 +68810,12 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -69004,8 +68824,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -69039,7 +68858,6 @@ "version": "1.10.4", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dev": true, "requires": { "fp-ts": "^1.0.0" } @@ -69054,8 +68872,7 @@ "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "ipfs-core-types": { "version": "0.2.1", @@ -69943,7 +69760,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -70038,8 +69854,7 @@ "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-dotfile": { "version": "1.0.3", @@ -70074,8 +69889,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -70086,8 +69900,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-function": { "version": "1.0.2", @@ -70105,7 +69918,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -70113,8 +69925,7 @@ "is-hex-prefixed": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", - "dev": true + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" }, "is-interactive": { "version": "1.0.0", @@ -70293,8 +70104,7 @@ "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" }, "is-upper-case": { "version": "1.1.2", @@ -70334,7 +70144,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "requires": { "is-docker": "^2.0.0" } @@ -70610,8 +70419,7 @@ "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "js-tokens": { "version": "4.0.0", @@ -70835,7 +70643,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -70869,7 +70676,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "dev": true, "requires": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -70880,7 +70686,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -70960,7 +70765,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, "requires": { "graceful-fs": "^4.1.9" } @@ -70974,6 +70778,11 @@ "graceful-fs": "^4.1.11" } }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, "lazy-debug-legacy": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", @@ -71155,7 +70964,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, "requires": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -71165,7 +70973,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -71392,8 +71199,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash-es": { "version": "4.17.21", @@ -71578,7 +71384,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -71588,7 +71393,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -71597,7 +71401,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -71607,7 +71410,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -71615,20 +71417,17 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -71682,8 +71481,7 @@ "lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=", - "dev": true + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" }, "lru-cache": { "version": "6.0.0", @@ -71738,7 +71536,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, + "devOptional": true, "peer": true }, "map-cache": { @@ -71779,8 +71577,7 @@ "match-all": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", - "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", - "dev": true + "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==" }, "math-random": { "version": "1.0.4", @@ -71792,14 +71589,12 @@ "mcl-wasm": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "dev": true + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==" }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -71809,8 +71604,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { "version": "1.1.0", @@ -71890,7 +71684,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dev": true, "requires": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -71900,14 +71693,12 @@ "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-options": { "version": "2.0.0", @@ -72010,8 +71801,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "3.1.10", @@ -72053,22 +71843,19 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "dev": true + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "dev": true, + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.47.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -72101,20 +71888,17 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -72187,7 +71971,6 @@ "version": "0.38.3", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", - "dev": true, "requires": { "obliterator": "^1.6.1" } @@ -72707,14 +72490,18 @@ "module-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==" + }, + "moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multiaddr": { "version": "8.1.2", @@ -72960,7 +72747,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", - "dev": true, "requires": { "encode-utf8": "^1.0.2", "fmix": "^0.1.0", @@ -73075,10 +72861,9 @@ } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", @@ -73105,8 +72890,7 @@ "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node-emoji": { "version": "1.11.0", @@ -73155,8 +72939,7 @@ "node-gyp-build": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" }, "node-int64": { "version": "0.4.0", @@ -73285,8 +73068,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { "version": "4.5.0", @@ -73446,8 +73228,7 @@ "object-inspect": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", - "dev": true + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" }, "object-keys": { "version": "1.1.1", @@ -73517,8 +73298,7 @@ "obliterator": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", - "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", - "dev": true + "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" }, "oboe": { "version": "2.1.5", @@ -73530,10 +73310,9 @@ } }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -73542,7 +73321,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -73687,8 +73465,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -73753,7 +73530,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "requires": { "aggregate-error": "^3.0.0" } @@ -73908,8 +73684,7 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { "version": "2.0.1", @@ -74091,8 +73866,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -74103,8 +73877,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-starts-with": { "version": "2.0.0", @@ -74115,8 +73888,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "3.0.0", @@ -74145,7 +73917,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -74276,8 +74047,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "4.0.1", @@ -75245,6 +75015,15 @@ } } }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "prop-types": { "version": "15.7.2", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", @@ -75331,15 +75110,20 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -75420,8 +75204,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "randomatic": { "version": "3.1.1", @@ -75448,7 +75231,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -75466,17 +75248,15 @@ "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -76064,14 +75844,12 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -76126,7 +75904,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -76202,7 +75979,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -76212,7 +75988,6 @@ "version": "2.2.6", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "dev": true, "requires": { "bn.js": "^4.11.1" } @@ -76287,7 +76062,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -76295,8 +76069,7 @@ "rustbn.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "rxjs": { "version": "6.6.7", @@ -76311,8 +76084,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -76326,8 +76098,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.4", @@ -76459,7 +76230,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", - "dev": true, "requires": { "elliptic": "^6.5.2", "node-addon-api": "^2.0.0", @@ -76481,8 +76251,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "semver-compare": { "version": "1.0.0", @@ -76497,31 +76266,39 @@ "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" } } }, @@ -76545,15 +76322,14 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "servify": { @@ -76605,16 +76381,14 @@ "dev": true }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -76695,7 +76469,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -76742,6 +76515,11 @@ "simple-concat": "^1.0.0" } }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -76971,6 +76749,15 @@ "viz.js": "^1.8.2" }, "dependencies": { + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -77001,7 +76788,6 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, "requires": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -77018,7 +76804,6 @@ "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -77031,7 +76816,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -77039,8 +76823,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -78038,7 +77821,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -78047,8 +77829,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -78220,7 +78001,6 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, "requires": { "type-fest": "^0.7.1" }, @@ -78228,8 +78008,7 @@ "type-fest": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" } } }, @@ -78258,7 +78037,8 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "dev": true, + "optional": true }, "stealthy-require": { "version": "1.1.1", @@ -78308,7 +78088,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -78323,7 +78102,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -78333,14 +78111,12 @@ "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -78406,7 +78182,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0" } @@ -78420,8 +78195,7 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "sublevel-pouchdb": { "version": "7.2.2", @@ -78508,7 +78282,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -78802,6 +78575,71 @@ "yallist": "^3.0.3" } }, + "tenderly": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tenderly/-/tenderly-0.6.0.tgz", + "integrity": "sha512-uPnR5ujR1j0Aay4nuqymTY2nu3e0yDjl6dHBqkTTIYEDzyzaDLx2+PkVxjT5RWseAbWORsa6GYetletATf1zmQ==", + "requires": { + "axios": "^0.27.2", + "cli-table3": "^0.6.2", + "commander": "^9.4.0", + "express": "^4.18.1", + "hyperlinker": "^1.0.0", + "js-yaml": "^4.1.0", + "open": "^8.4.0", + "prompts": "^2.4.2", + "tslog": "^4.4.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + } + } + }, "testrpc": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", @@ -78972,7 +78810,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -79086,7 +78923,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "dev": true, + "optional": true }, "tough-cookie": { "version": "2.5.0", @@ -79615,7 +79453,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", @@ -79637,14 +79475,14 @@ "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, + "devOptional": true, "peer": true }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "peer": true } } @@ -79652,14 +79490,17 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslog": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.9.2.tgz", + "integrity": "sha512-wBM+LRJoNl34Bdu8mYEFxpvmOUedpNUwMNQB/NcuPIZKwdDde6xLHUev3bBjXQU7gdurX++X/YE7gLH8eXYsiQ==" }, "tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=", - "dev": true + "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=" }, "tunnel-agent": { "version": "0.6.0", @@ -79679,8 +79520,7 @@ "tweetnacl-util": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "type": { "version": "1.2.0", @@ -79707,7 +79547,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -79827,7 +79666,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, + "devOptional": true, "peer": true }, "typescript-compare": { @@ -79927,7 +79766,6 @@ "version": "5.21.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", - "dev": true, "requires": { "busboy": "^1.6.0" }, @@ -79936,7 +79774,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, "requires": { "streamsearch": "^1.1.0" } @@ -79944,8 +79781,7 @@ "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" } } }, @@ -79998,8 +79834,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unixify": { "version": "1.0.0", @@ -80033,8 +79868,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "version": "1.0.0", @@ -80172,7 +80006,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz", "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==", - "dev": true, + "devOptional": true, "requires": { "node-gyp-build": "^4.2.0" } @@ -80200,8 +80034,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.1.1", @@ -80220,8 +80053,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.4.0", @@ -80239,7 +80071,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, + "devOptional": true, "peer": true }, "vali-date": { @@ -80282,8 +80114,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "verror": { "version": "1.10.0", @@ -81289,8 +81120,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.4.3", @@ -81440,8 +81270,7 @@ "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { "version": "1.10.2", @@ -81563,7 +81392,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "requires": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -81574,26 +81402,22 @@ "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" } } }, @@ -81617,14 +81441,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "peer": true }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" }, "zen-observable": { "version": "0.8.15", @@ -81648,7 +81471,6 @@ "version": "0.14.3", "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.3.tgz", "integrity": "sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ==", - "dev": true, "requires": {} } } diff --git a/package.json b/package.json index 2f9323108..fe4890663 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,7 @@ "external/", "hardhat/", "interfaces/", - "scripts/contractInteraction/mainnet_contracts.json", - "scripts/contractInteraction/testnet_contracts.json", + "scripts/", "abi/" ], "devDependencies": { @@ -41,6 +40,7 @@ "@secrez/cryptoenv": "^0.2.4", "@uniswap/sdk-core": "^4.1.3", "@uniswap/v3-sdk": "^3.10.2", + "axios": "^1.6.8", "bignumber.js": "^9.0.0", "cli-color": "^2.0.3", "coveralls": "^3.1.0", @@ -63,6 +63,7 @@ "keccak": "^3.0.3", "keccak256": "^1.0.6", "mocha": "^8.2.1", + "moment": "^2.30.1", "node-logs": "^1.1.0", "patch-package": "^7.0.0", "phantomjs-prebuilt": "^2.1.16", @@ -108,5 +109,8 @@ "pre-commit": "yarn prettier", "pre-push": "yarn lint && yarn prettier-check" } + }, + "dependencies": { + "@tenderly/hardhat-tenderly": "^1.8.0" } } diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 000000000..dea9b9dbe --- /dev/null +++ b/remappings.txt @@ -0,0 +1,10 @@ +@ensdomains/=node_modules/@ensdomains/ +@ethereum-waffle/=node_modules/@ethereum-waffle/ +ds-test/=foundry/lib/forge-std/lib/ds-test/src/ +eth-gas-reporter/=node_modules/eth-gas-reporter/ +forge-std/=foundry/lib/forge-std/src/ +hardhat-deploy/=node_modules/hardhat-deploy/ +hardhat/=node_modules/hardhat/ +truffle/=node_modules/truffle/ +@openzeppelin/=node_modules/@openzeppelin/ +@contracts/=contracts/ diff --git a/scripts/bobTimelockExecutor.js b/scripts/bobTimelockExecutor.js new file mode 100644 index 000000000..c9de3ce08 --- /dev/null +++ b/scripts/bobTimelockExecutor.js @@ -0,0 +1,4 @@ +const hardhat = require("hardhat"); +const { executeTimeLockDepositor } = require("./timelockDepositor"); + +executeTimeLockDepositor(hardhat); diff --git a/scripts/contractInteraction/amm.py b/scripts/contractInteraction/amm.py index 0d2fba51d..0790b6908 100644 --- a/scripts/contractInteraction/amm.py +++ b/scripts/contractInteraction/amm.py @@ -370,6 +370,12 @@ def transferOwnershipAMMContractsToGovernance(contractAddress, newOwnerAddress, sendWithMultisig(conf.contracts['multisig'], ammContract.address, data, conf.acct) def getExchequerBalances(): + + dllrPool = getBalance(conf.contracts['(WR)BTC/DLLR'], conf.contracts['multisig']) + dllrPoolTotal = getTotalSupply(conf.contracts['DLLR']) + dllrBalanceInPool = getBalance(conf.contracts['DLLR'], conf.contracts['ConverterDLLR']) + dllrRbtcBalanceInPool = getBalance(conf.contracts['WRBTC'], conf.contracts['ConverterDLLR']) + usdtPool = getBalance(conf.contracts['(WR)BTC/USDT2'], conf.contracts['multisig']) balanceAndFee = getReturnForV2PoolToken(conf.contracts['ConverterUSDT'], conf.contracts['(WR)BTC/USDT2'], usdtPool) usdtBalance = balanceAndFee[0] @@ -380,9 +386,14 @@ def getExchequerBalances(): rbtcBalanceInPool = getBalance(conf.contracts['WRBTC'], conf.contracts['ConverterBNBs']) print('----------------') + dllrBalance = dllrPool / dllrPoolTotal * dllrBalanceInPool + wrbtcDllrBalance = dllrPool / dllrPoolTotal * dllrRbtcBalanceInPool + bnbBalance = bnbPool / bnbPoolTotal * bnbBalanceInPool wrbtcBalance = bnbPool / bnbPoolTotal * rbtcBalanceInPool + print("DLLR balance: ", dllrBalance/1e18) + print("WRBTC balance in DLLR pool: ", wrbtcDllrBalance/1e18) print("USDT balance: ", usdtBalance/1e18) print("BNB balance: ", bnbBalance/1e18) print("WRBTC balance: ", wrbtcBalance/1e18) diff --git a/scripts/contractInteraction/bridge-multisig/bridge_multisig_transfers.py b/scripts/contractInteraction/bridge-multisig/bridge_multisig_transfers.py index 3d75ade6e..7521ce803 100644 --- a/scripts/contractInteraction/bridge-multisig/bridge_multisig_transfers.py +++ b/scripts/contractInteraction/bridge-multisig/bridge_multisig_transfers.py @@ -27,7 +27,8 @@ def main(): #sendAggregatedTokensFromWallet(contracts['ETHes'], contracts['Aggregator-ETH-RSK'], '0xf5972e2bcc10404367cbdca2a3319470fbea3ff7', 2e17) #send eSOV send eSOV over the bridge to our gate.io address - #sendTokensToETHFromMultisig(contracts['SOV'], '0x5092019A3E0334586273A21a701F1BD859ECAbD6', 260000e18) + # + #sendTokensToETHFromMultisig(contracts['SOV'], '0xB82c2b7Fb8678a7353A853e81108a52e2fCaa9b0', 13_800_000 * 10 ** 18) #DLLR #setFeeAndMinPerToken(contracts['DLLR'], 60e18, 70e18) #allowToken('0xc1411567d2670e24d9C4DaAa7CdA95686e1250AA') #DLLR - one time whitelisting @@ -35,6 +36,10 @@ def main(): #sendTokensFromWalletFromSepolia(contracts['SEPUSD'], acct, 1000e18) + #setEthBridgeMaxTokensAllowed(10_000_000 * 10**18) + #setEthBridgeDailyLimit(6_500_000 * 10**18) + #printEthBridgeLimits() + def loadConfig(): global contracts, acct thisNetwork = network.show_active() @@ -58,6 +63,66 @@ def loadConfig(): contracts = json.load(configFile) # function setFeeAndMinPerToken(address token, uint256 _feeConst, uint256 _minAmount) +def printEthBridgeLimits(): + abiFileBridge = open('./scripts/contractInteraction/bridge-multisig/Bridge.json') + abiFileAllowTokens = open('./scripts/contractInteraction/bridge-multisig/AllowTokens.json') + abiBridge = json.load(abiFileBridge) + abiAllowTokens = json.load(abiFileAllowTokens) + bridgeRSK = Contract.from_abi("BridgeRSK", address=contracts['BridgeRSK'], abi=abiBridge, owner=acct) + + allowTokensAddress = bridgeRSK.allowTokens() + allowTokens = Contract.from_abi("AllowTokens", address=allowTokensAddress, abi=abiAllowTokens, owner=acct) + + #print('decimals', decimals) + print("daily limit ", allowTokens.dailyLimit()/1e18) + print("max allowed ", allowTokens.getMaxTokensAllowed()/1e18) + print("min allowed DLLR ", allowTokens.minAllowedToken(contracts["DLLR"])/1e18) + print("min allowed SOV ", allowTokens.minAllowedToken(contracts["SOV"])/1e18) + +def setEthBridgeMaxTokensAllowed(newLimit): + abiFileBridge = open('./scripts/contractInteraction/bridge-multisig/Bridge.json') + abiFileAllowTokens = open('./scripts/contractInteraction/bridge-multisig/AllowTokens.json') + abiBridge = json.load(abiFileBridge) + abiAllowTokens = json.load(abiFileAllowTokens) + bridgeRSK = Contract.from_abi("BridgeRSK", address=contracts['BridgeRSK'], abi=abiBridge, owner=acct) + + allowTokensAddress = bridgeRSK.allowTokens() + allowTokens = Contract.from_abi("AllowTokens", address=allowTokensAddress, abi=abiAllowTokens, owner=acct) + print(f"Setting max tokens allowed on AllowTokens {allowTokens.address} to {newLimit/1e18}") + + multiSigAddress = allowTokens.owner() + print('Allow tokens owner address (multisig): ' + multiSigAddress) + multiSig = Contract.from_abi("MultiSig", multiSigAddress, MultiSigWallet.abi, owner=acct) + + setMaxTokensAllowed = allowTokens.setMaxTokensAllowed.encode_input(newLimit) + print(setMaxTokensAllowed) + + tx = multiSig.submitTransaction(allowTokens.address, 0, setMaxTokensAllowed) + txId = tx.events["Submission"]["transactionId"] + print(txId) + +def setEthBridgeDailyLimit(newLimit): + abiFileBridge = open('./scripts/contractInteraction/bridge-multisig/Bridge.json') + abiFileAllowTokens = open('./scripts/contractInteraction/bridge-multisig/AllowTokens.json') + abiBridge = json.load(abiFileBridge) + abiAllowTokens = json.load(abiFileAllowTokens) + bridgeRSK = Contract.from_abi("BridgeRSK", address=contracts['BridgeRSK'], abi=abiBridge, owner=acct) + + allowTokensAddress = bridgeRSK.allowTokens() + allowTokens = Contract.from_abi("AllowTokens", address=allowTokensAddress, abi=abiAllowTokens, owner=acct) + print(f"Setting daily limits on AllowTokens {allowTokens.address} to {newLimit/1e18}") + + multiSigAddress = allowTokens.owner() + print('Allow tokens owner address (multisig): ' + multiSigAddress) + multiSig = Contract.from_abi("MultiSig", multiSigAddress, MultiSigWallet.abi, owner=acct) + + changeDailyLimit = allowTokens.changeDailyLimit.encode_input(newLimit) + print(changeDailyLimit) + + tx = multiSig.submitTransaction(allowTokens.address, 0, changeDailyLimit) + txId = tx.events["Submission"]["transactionId"] + print(txId) + def setFeeAndMinPerToken(token, feeConst, minAmount): abiFileBridge = open('./scripts/contractInteraction/bridge-multisig/Bridge.json') abiFileAllowTokens = open('./scripts/contractInteraction/bridge-multisig/AllowTokens.json') @@ -107,6 +172,7 @@ def allowToken(token): tx = multiSig.submitTransaction(allowTokens.address, 0, addAllowTokenData) txId = tx.events["Submission"]["transactionId"] print(txId) + def sendTokensToETHFromMultisig(token, receiver, amount): abiFile = open('./scripts/contractInteraction/bridge-multisig/Bridge.json') abi = json.load(abiFile) diff --git a/scripts/data/bobWhitelistedTokenListDepositor.json b/scripts/data/bobWhitelistedTokenListDepositor.json new file mode 100644 index 000000000..4d39a1494 --- /dev/null +++ b/scripts/data/bobWhitelistedTokenListDepositor.json @@ -0,0 +1,65 @@ +{ + "mainnet": [ + { + "tokenName": "WBTC", + "tokenAddress": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "pricingRoutePath": [ + "0xCBCdF9626bC03E24f779434178A73a0B4bad62eD", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + }, + { + "tokenName": "ETH", + "tokenAddress": "0x0000000000000000000000000000000000000001", + "pricingRoutePath": ["0x3C4323f83D91b500b0f52cB19f7086813595F4C9"] + }, + { + "tokenName": "USDT", + "tokenAddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "pricingRoutePath": [ + "0xC5aF84701f98Fa483eCe78aF83F11b6C38ACA71D", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + }, + { + "tokenName": "USDC", + "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "pricingRoutePath": [ + "0xC2e9F25Be6257c210d7Adf0D4Cd6E3E881ba25f8", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + }, + { + "tokenName": "DAI", + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "pricingRoutePath": [ + "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + }, + { + "tokenName": "TBTC", + "tokenAddress": "0x18084fba666a33d37592fa2633fd49a74dd93a88", + "pricingRoutePath": [ + "0x97944213D2caeeA773DA1c9B11B0525F25b749CC", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + }, + { + "tokenName": "rETH", + "tokenAddress": "0xae78736cd615f374d3085123a210448e74fc6393", + "pricingRoutePath": [ + "0xf0E02Cf61b31260fd5AE527d58Be16312BDA59b1", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + }, + { + "tokenName": "wstETH", + "tokenAddress": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + "pricingRoutePath": [ + "0xC12aF0C4AA39D3061c56cD3CB19f5e62dEeaeBdE", + "0x3C4323f83D91b500b0f52cB19f7086813595F4C9" + ] + } + ] +} diff --git a/scripts/deploySafeDepositsSenderToTenderly.js b/scripts/deploySafeDepositsSenderToTenderly.js new file mode 100644 index 000000000..3e13f9286 --- /dev/null +++ b/scripts/deploySafeDepositsSenderToTenderly.js @@ -0,0 +1,27 @@ +const { ethers, network } = require("hardhat"); + +async function main() { + console.log("🖖🏽[ethers] Deploying and Verifying SafeDepositsSender in Tenderly"); + + const SafeDepositsSender = await ethers.getContractFactory("SafeDepositsSender"); + + const signer = (await ethers.getSigners())[0]; + + let safeDepositsSender = await SafeDepositsSender.connect(signer).deploy( + "0x949Cf9295d2950B6bD9B7334846101E9aE44BBB0", // safe deposits + "0xb5e3dbaf69a46b71fe9c055e6fa36992ae6b2c1a", // LockDrop contract address + "0xbdab72602e9ad40fc6a6852caf43258113b8f7a5", // SOV on eth + "0xCF311E7375083b9513566a47B9f3e93F1FcdCfBF" // Depositor --> watcher script executor + ); + + await safeDepositsSender.deployed(); + safeDepositsSender = await safeDepositsSender.deployed(); + + const safeDepositsSenderAddress = await safeDepositsSender.address; + console.log("{SafeDepositsSender} deployed to", safeDepositsSenderAddress); +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/prepareTokenBalanceForSafeInTederly.js b/scripts/prepareTokenBalanceForSafeInTederly.js new file mode 100644 index 000000000..d4410c564 --- /dev/null +++ b/scripts/prepareTokenBalanceForSafeInTederly.js @@ -0,0 +1,103 @@ +const { ethers, network, deploy } = require("hardhat"); + +const { TENDERLY_USERNAME, TENDERLY_PROJECT, TENDERLY_ACCESS_KEY } = process.env; +const SIMULATE_API = `https://api.tenderly.co/api/v1/account/${TENDERLY_USERNAME}/project/${TENDERLY_PROJECT}/simulate`; + +const ETH_NATIVE_TOKEN_ADDRS = "0x0000000000000000000000000000000000000001"; + +const axios = require("axios"); + +const TOKENS = [ + { + tokenName: "WBTC", + tokenAddress: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + from: "0x5Ee5bf7ae06D1Be5997A1A72006FE6C607eC6DE8", + amountToSend: "1600000", + }, + { + tokenName: "ETH", + tokenAddress: ETH_NATIVE_TOKEN_ADDRS, + from: "0x40B38765696e3d5d8d9d834D8AaD4bB6e418E489", + amountToSend: "300000000000000000", + }, + { + tokenName: "WETH", + tokenAddress: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + from: "0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E", + amountToSend: "300000000000000000", + }, + { + tokenName: "USDT", + tokenAddress: "0xdAC17F958D2ee523a2206206994597C13D831ec7", + from: "0xF977814e90dA44bFA03b6295A0616a897441aceC", + amountToSend: "1000000000", + }, + { + tokenName: "USDC", + tokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + from: "0x28C6c06298d514Db089934071355E5743bf21d60", + amountToSend: "1000000000", + }, + { + tokenName: "DAI", + tokenAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F", + from: "0x40ec5B33f54e0E8A33A975908C5BA1c14e5BbbDf", + amountToSend: "1000000000000000000000", + }, +]; +async function main() { + console.log("🖖🏽[ethers] Preparing token balance for safe in tenderly"); + console.log(TENDERLY_ACCESS_KEY); + + const { get } = deployments; + + const safeMultisigDeployment = await get("SafeBobDeposits"); + + for (const token of TOKENS) { + if (token.tokenAddress.toLowerCase() == ETH_NATIVE_TOKEN_ADDRS) continue; + + console.log( + `Sending token ${token.tokenName} - ${token.tokenAddress} - ${token.amountToSend}` + ); + const tokenContract = await ethers.getContractAt("TestToken", token.tokenAddress); + const TX_DATA = await tokenContract.populateTransaction.transfer( + safeMultisigDeployment.address, + token.amountToSend + ); + + const transaction = { + network_id: "1", + from: token.from, + input: TX_DATA.data, + to: token.tokenAddress, + value: "0", + // tenderly specific + save: true, + }; + + const opts = { + headers: { + "X-Access-Key": TENDERLY_ACCESS_KEY || "", + }, + }; + + const resp = await axios.post(SIMULATE_API, transaction, opts); + console.log(resp.data); + + // Make the simulation publicly accessible + if (resp.data && resp.data.simulation && resp.data.simulation.id) { + const responseShare = await axios.post( + `https://api.tenderly.co/api/v1/account/${TENDERLY_USERNAME}/project/${TENDERLY_PROJECT}/simulations/${resp.data.simulation.id}/share`, + {}, + opts + ); + + console.log(responseShare.data); + } + } +} + +main().catch((error) => { + console.error(error.response); + process.exitCode = 1; +}); diff --git a/scripts/reportBobTimelockExecutor.js b/scripts/reportBobTimelockExecutor.js new file mode 100644 index 000000000..5e3c6079a --- /dev/null +++ b/scripts/reportBobTimelockExecutor.js @@ -0,0 +1,4 @@ +const hardhat = require("hardhat"); +const { generateReportTimelockDepositor } = require("./reportTimelockDepositor"); + +generateReportTimelockDepositor(hardhat); diff --git a/scripts/reportTimelockDepositor.js b/scripts/reportTimelockDepositor.js new file mode 100644 index 000000000..d0d058729 --- /dev/null +++ b/scripts/reportTimelockDepositor.js @@ -0,0 +1,320 @@ +const Logs = require("node-logs"); +const logger = new Logs().showInConsole(true); +const CONFIG_WHITELISTED_TOKENS = require("./data/bobWhitelistedTokenListDepositor.json"); +const { default: BigNumber } = require("bignumber.js"); +const { + getSovPrice, + ETH_NATIVE_TOKEN_ADDRS, + getTokenBalance, + getAllPricesFromBobSnapshotApi, + getPriceByDateFromBobSnapshot, + checkWithinSlippageTolerancePercentage, + MAX_SLIPPAGE_TOLERANCE_IN_PERCENTAGE, +} = require("./timelockDepositor"); +const moment = require("moment"); +const col = require("cli-color"); + +async function generateReportTimelockDepositor(hardhat) { + const { ethers, network, deployments } = hardhat; + const { get } = deployments; + const lockDropDeployment = await get("BobLockDrop"); + const safeDepositsDeployment = await get("SafeBobDeposits"); + const safePrePreDepositsDeployment = await get("SafeBobPreDeposit"); //@todo add pre-deposits Safe balances: 0xB82c2b7Fb8678a7353A853e81108a52e2fCaa9b0 + const sovDeployment = await get("SOV"); + + const lockDropContract = await ethers.getContract("BobLockDrop"); + const lockDropWithdrawalStartTime = await lockDropContract.withdrawalStartTime(); + + const leftWithdrawalTime = moment.unix(lockDropWithdrawalStartTime).diff(moment().unix()); + const durationObj = moment.duration(leftWithdrawalTime, "seconds"); + const daysLeft = durationObj.days(); + const hoursLeft = durationObj.hours(); + const minutesLeft = durationObj.minutes(); + const secondsLeft = durationObj.seconds(); + + const allBobPriceSnapshot = await getAllPricesFromBobSnapshotApi(); + if (!allBobPriceSnapshot.length) { + logger.error("Bob snapshot price is empty"); + return; + } + + const yesterdayDate = moment().subtract("1", "day").format("YYYY-MM-DD"); + const timeLeft = `${daysLeft} days, ${hoursLeft} hours ${minutesLeft} minutes ${secondsLeft} seconds`; + logger.info(`LockDrop time to left to withdrawalStartTime: ${timeLeft}`); + + const pk = process.env.SAFE_DEPOSITS_SENDER; + try { + const wallet = new ethers.Wallet(pk); + const executorAddress = await wallet.getAddress(); + const executorBalance = await ethers.provider.getBalance(executorAddress); + logger.info( + `Executor wallet address: ${executorAddress}, balance: ${new BigNumber(executorBalance.toString()).dividedBy(new BigNumber("1e18")).decimalPlaces(2)} ETH` + ); + } catch (error) { + logger.error("Invalid or empty SAFE_DEPOSITS_SENDER address"); + } + let emptyBobSnapshotPrice = []; + let exceedSlippageTolerance = []; + + let tokenBalancesDetail = { + lockDrop: [], + safe: [], + }; + + let wholeLockDropTokenBalances = {}; + + let totalSovRequiredLockDrop = 0; + let totalSovRequiredSafe = 0; + for (const whitelistedToken of CONFIG_WHITELISTED_TOKENS.mainnet) { + logger.info(`Processing ${whitelistedToken.tokenName}`); + const tokenContract = await ethers.getContractAt( + "TestToken", + whitelistedToken.tokenAddress + ); + + /** Get token decimals */ + const tokenDecimal = + whitelistedToken.tokenAddress === ETH_NATIVE_TOKEN_ADDRS + ? 18 + : await tokenContract.decimals(); + + /** Get token balance for our Safe only for LockDrop */ + let lockDropBalance = await lockDropContract.deposits( + safeDepositsDeployment.address, + whitelistedToken.tokenAddress == ETH_NATIVE_TOKEN_ADDRS + ? ethers.constants.AddressZero + : whitelistedToken.tokenAddress + ); + // console.log("-1-"); + lockDropBalance = normalizeTokenNumber(lockDropBalance, tokenDecimal); + tokenBalancesDetail.lockDrop.push({ + tokenAddress: whitelistedToken.tokenAddress, + tokenName: whitelistedToken.tokenName, + tokenBalance: !lockDropBalance.isNaN() + ? lockDropBalance.decimalPlaces(2).toString() + : "0", + }); + + /** Get token balance for our Safe only for LockDrop */ + let wholeLockDropBalance = await getTokenBalance( + hardhat, + whitelistedToken.tokenAddress, + lockDropDeployment.address, + ethers.provider + ); + wholeLockDropBalance = normalizeTokenNumber(wholeLockDropBalance, tokenDecimal); + wholeLockDropTokenBalances[whitelistedToken.tokenAddress] = { + tokenAddress: whitelistedToken.tokenAddress, + tokenName: whitelistedToken.tokenName, + tokenBalance: !wholeLockDropBalance.isNaN() + ? wholeLockDropBalance.decimalPlaces(2).toString() + : "0", + }; + /** Get token balance for Safe contract */ + let safeBalance = await getTokenBalance( + hardhat, + whitelistedToken.tokenAddress, + safeDepositsDeployment.address, + ethers.provider + ); + safeBalance = normalizeTokenNumber(safeBalance, tokenDecimal); + tokenBalancesDetail.safe.push({ + tokenAddress: whitelistedToken.tokenAddress, + tokenName: whitelistedToken.tokenName, + tokenBalance: !safeBalance.isNaN() ? safeBalance.decimalPlaces(2).toString() : "0", + }); + + /** Get SOV equivalent for this token - using uniswap v3 */ + const sovPrice = await getSovPrice(hardhat, whitelistedToken, false); + // SOV Amount will not consider decimal anymore (1 SOV = 1 SOV) + + /** No need to normalize the price using decimal, because the lockDrop balance already been normalized */ + const sovAmountLockDrop = new BigNumber(sovPrice) + .multipliedBy(new BigNumber(lockDropBalance.toString())) + .decimalPlaces(0); + + /** No need to normalize the price using decimal, because the safe balance already been normalized */ + const sovAmountSafe = new BigNumber(sovPrice) + .multipliedBy(new BigNumber(safeBalance.toString())) + .decimalPlaces(0); + + totalSovRequiredLockDrop = new BigNumber(sovAmountLockDrop).plus( + new BigNumber(totalSovRequiredLockDrop) + ); + totalSovRequiredSafe = new BigNumber(sovAmountSafe).plus( + new BigNumber(totalSovRequiredSafe) + ); + + /** Get price from bob api snapshot */ + /** Use bob snapshot if config flag is true */ + const sovPriceFromBobSnapshot = await getPriceByDateFromBobSnapshot( + whitelistedToken.tokenAddress, + sovDeployment.address, + yesterdayDate, + allBobPriceSnapshot + ); + if ( + !sovPriceFromBobSnapshot || + sovPriceFromBobSnapshot.toString() === "0" || + isNaN(sovPriceFromBobSnapshot) + ) { + emptyBobSnapshotPrice.push(whitelistedToken); + } else { + if ( + !checkWithinSlippageTolerancePercentage( + new BigNumber(sovPrice).toNumber(), + new BigNumber(sovPriceFromBobSnapshot).toNumber(), + MAX_SLIPPAGE_TOLERANCE_IN_PERCENTAGE, + false + ) + ) { + exceedSlippageTolerance.push({ + tokenName: whitelistedToken.tokenName, + tokenAddress: whitelistedToken.tokenAddress, + uniswapPrice: sovPrice.toString(), + bobSnapshotPrice: sovPriceFromBobSnapshot.toString(), + }); + } + } + } + + const sovContract = await ethers.getContract("SOV"); + const sovDecimal = await sovContract.decimals(); + let lockDropSovBalance = await lockDropContract.deposits( + safeDepositsDeployment.address, + sovDeployment.address + ); + let wholeLockDropSovBalance = await getTokenBalance( + hardhat, + sovDeployment.address, + lockDropDeployment.address, + ethers.provider + ); + let safeSovBalance = await getTokenBalance( + hardhat, + sovDeployment.address, + safeDepositsDeployment.address, + ethers.provider + ); + lockDropSovBalance = normalizeTokenNumber(lockDropSovBalance, sovDecimal); + wholeLockDropSovBalance = normalizeTokenNumber(wholeLockDropSovBalance, sovDecimal); + safeSovBalance = normalizeTokenNumber(safeSovBalance, sovDecimal); + + tokenBalancesDetail.lockDrop.push({ + tokenAddress: sovDeployment.address, + tokenName: "SOV", + tokenBalance: !lockDropSovBalance.isNaN() + ? lockDropSovBalance.decimalPlaces(2).toString() + : "0", + }); + + wholeLockDropTokenBalances[sovDeployment.address] = { + tokenAddress: sovDeployment.address, + tokenName: "SOV", + tokenBalance: !wholeLockDropSovBalance.isNaN() + ? wholeLockDropSovBalance.decimalPlaces(2).toString() + : "0", + }; + + tokenBalancesDetail.safe.push({ + tokenAddress: sovDeployment.address, + tokenName: "SOV", + tokenBalance: !safeSovBalance.isNaN() ? safeSovBalance.decimalPlaces(2).toString() : "0", + }); + + /** Process the token list lockdrop details */ + console.log("\n"); + logger.info("=== Bob LockDrop Contract ==="); + logger.info(`Token: balance (totalBalance, safeBalance / totalBalance %)`); + logger.info(`===========================================================`); + for (const tokenBalanceDetailLockDrop of tokenBalancesDetail.lockDrop) { + const totalBalanceLockDrop = + wholeLockDropTokenBalances[tokenBalanceDetailLockDrop.tokenAddress].tokenBalance; + const ratioLockDropBalance = new BigNumber(tokenBalanceDetailLockDrop.tokenBalance) + .dividedBy(totalBalanceLockDrop) + .multipliedBy(new BigNumber(100)) + .decimalPlaces(2); + const addSpaces = " ".repeat(19 - tokenBalanceDetailLockDrop.tokenName.length); + logger.info( + `${tokenBalanceDetailLockDrop.tokenName + addSpaces}: ${tokenBalanceDetailLockDrop.tokenBalance} (${totalBalanceLockDrop}, ${ratioLockDropBalance}%)` + ); + } + + if (totalSovRequiredLockDrop.isNaN()) totalSovRequiredLockDrop = "0"; + logger.info(`SOV (Required) : ${totalSovRequiredLockDrop}`); + + const sovMinusSovRequiredLockDrop = new BigNumber( + tokenBalancesDetail.lockDrop[tokenBalancesDetail.lockDrop.length - 1].tokenBalance + ).minus(new BigNumber(totalSovRequiredLockDrop)); + logger.info(`SOV - SOV Required : ${sovMinusSovRequiredLockDrop}`); + + console.log("\n"); + logger.info("=== Safe Deposits Contract ==="); + for (const tokenBalanceDetailSafe of tokenBalancesDetail.safe) { + const addSpaces = " ".repeat(19 - tokenBalanceDetailSafe.tokenName.length); + logger.info( + `${tokenBalanceDetailSafe.tokenName + addSpaces}: ${tokenBalanceDetailSafe.tokenBalance}` + ); + } + + if (totalSovRequiredSafe.isNaN()) totalSovRequiredSafe = "0"; + logger.info(`SOV (Required) : ${totalSovRequiredSafe}`); + + const sovMinusSovRequiredSafe = new BigNumber( + tokenBalancesDetail.safe[tokenBalancesDetail.safe.length - 1].tokenBalance + ).minus(new BigNumber(totalSovRequiredSafe)); + if (sovMinusSovRequiredSafe != "0") + logger.info(`SOV - SOV Required : ${sovMinusSovRequiredSafe}`); + + /** SECTION 2 (SLIPPAGE REPORT) */ + if (!emptyBobSnapshotPrice.length && !exceedSlippageTolerance.length) return; + console.log("\n\n"); + logger.info("===== Report Section 2 ====="); + for (const emptyPrice of emptyBobSnapshotPrice) { + logger.info( + col.bgRed(`Empty price of ${emptyPrice.tokenName} - ${emptyPrice.tokenAddress}`) + ); + } + + /** SECTION 2 (SLIPPAGE REPORT) */ + if (!emptyBobSnapshotPrice.length && !exceedSlippageTolerance.length) return; + console.log("\n\n"); + logger.info("===== Report Section 2 ====="); + for (const emptyPrice of emptyBobSnapshotPrice) { + logger.info( + col.bgRed(`Empty price of ${emptyPrice.tokenName} - ${emptyPrice.tokenAddress}`) + ); + } + + for (const exceedSlippage of exceedSlippageTolerance) { + // Calculate the percentage difference + const price1 = new BigNumber(exceedSlippage.uniswapPrice.toString()).toNumber(); + const price2 = new BigNumber(exceedSlippage.bobSnapshotPrice.toString()).toNumber(); + const difference = Math.abs(price1 - price2); + const average = (price1 + price2) / 2; + + const percentageDifference = (difference / average) * 100; + logger.info( + col.bgYellow( + `Exceed slippage (${MAX_SLIPPAGE_TOLERANCE_IN_PERCENTAGE}% - got ${percentageDifference.toFixed(2)}%): ${exceedSlippage.tokenName} - ${exceedSlippage.tokenAddress}` + ) + ); + logger.info( + col.bgYellow( + `Uniswap price: ${new BigNumber(1).dividedBy(new BigNumber(exceedSlippage.uniswapPrice.toString())).decimalPlaces(2)}, bob snapshot price: ${new BigNumber(1).dividedBy(new BigNumber(exceedSlippage.bobSnapshotPrice.toString())).decimalPlaces(2)}` + ) + ); + console.log("\n"); + } +} + +function normalizeTokenNumber(tokenAmount, decimal) { + const normalizedTokeNumber = new BigNumber(tokenAmount.toString()) + .dividedBy(new BigNumber(`1e${decimal}`)) + .decimalPlaces(2); + return normalizedTokeNumber; +} + +module.exports = { + generateReportTimelockDepositor, +}; diff --git a/scripts/timelockDepositor.js b/scripts/timelockDepositor.js new file mode 100644 index 000000000..d852734a3 --- /dev/null +++ b/scripts/timelockDepositor.js @@ -0,0 +1,620 @@ +const Logs = require("node-logs"); +const logger = new Logs().showInConsole(true); +// import { computePoolAddress, FeeAmount } from '@uniswap/v3-sdk' +const { computePoolAddress, FeeAmount } = require("@uniswap/v3-sdk"); +const { Token } = require("@uniswap/sdk-core"); +const { default: BigNumber } = require("bignumber.js"); +const axios = require("axios"); +const moment = require("moment"); +const { ZERO_ADDRESS } = require("@openzeppelin/test-helpers/src/constants"); + +require("dotenv").config(); + +/** START CONFIG */ +const ETH_NATIVE_TOKEN_ADDRS = "0x0000000000000000000000000000000000000001"; +const MAX_SLIPPAGE_TOLERANCE_IN_PERCENTAGE = 10; // 10% +const TOKEN_BALANCE_THRESHOLD_IN_USD = 100; // 100 USD +const ACTIVATE_BOB_SNAPSHOT_PRICING = true; +const CONFIG_CONTRACT_ADDRESSES = { + mainnet: { + uniswapV3PoolFactory: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + weth: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + }, + rskMainnet: { + priceFeed: "0x437AC62769f386b2d238409B7f0a7596d36506e4", + wbtc: "0x542fda317318ebf1d3deaf76e0b632741a7e677d", + weth: "0x1D931Bf8656d795E50eF6D639562C5bD8Ac2B78f", + xusd: "0xb5999795BE0EbB5bAb23144AA5FD6A02D080299F", + sov: "0xEFc78fc7d48b64958315949279Ba181c2114ABBd", + }, +}; +const CONFIG_WHITELISTED_TOKENS = require("./data/bobWhitelistedTokenListDepositor.json"); +/** END CONFIG */ + +async function executeTimeLockDepositor(hardhat, signer = null, dryRun = false) { + const { ethers, network, deployments } = hardhat; + let WHITELISTED_TOKENS = []; + if ( + network.name === "ethMainnet" || + network.name === "tenderlyForkedEthMainnet" || + network.tags.mainnet || + network.tags.testnet + ) { + WHITELISTED_TOKENS = CONFIG_WHITELISTED_TOKENS.mainnet; + } else if (network.name === "sepolia") { + WHITELISTED_TOKENS = CONFIG_WHITELISTED_TOKENS.sepolia; + } else { + throw new Error("Network not supported"); + } + + if (!signer) { + const pk = network.tags["mainnet"] + ? process.env.SAFE_DEPOSITS_SENDER + : process.env.SAFE_DEPOSITS_SENDER; + const wallet = new ethers.Wallet(pk); + signer = wallet.connect(ethers.provider); + } else { + signer = await ethers.getSigner(signer); + } + + const { get } = deployments; + const safeMultisigDeployment = await get("SafeBobDeposits"); + const safeMultisigModuleDeployment = await get("SafeDepositsSender"); + const safeMultisigModuleContract = await ethers.getContract("SafeDepositsSender"); + const safeMultisigContract = await ethers.getContract("SafeBobDeposits"); + const SovDeployment = await get("SOV"); + + let yesterdayDate; + let allBobPriceSnapshot; + + if (ACTIVATE_BOB_SNAPSHOT_PRICING) { + yesterdayDate = moment().utc().subtract("1", "day").format("YYYY-MM-DD"); + logger.info(`Yesterday date for bob snapshot pricing: ${yesterdayDate}`); + + allBobPriceSnapshot = await getAllPricesFromBobSnapshotApi(); + if (!allBobPriceSnapshot.length) { + logger.error("Bob snapshot price is empty"); + return; + } + const sovPriceSnapshot = allBobPriceSnapshot.filter((priceSnapshotObj) => { + return ( + priceSnapshotObj.token_address.toLowerCase() === + SovDeployment.address.toLowerCase() && + priceSnapshotObj.closing_day === yesterdayDate + ); + }); + + logger.info(`Yesterday SOV price: ${sovPriceSnapshot[0].price}`); + } + + /** Check Paused */ + if (await safeMultisigModuleContract.isPaused()) { + logger.warning(`Safe multisig module is paused`); + return; + } + + const tokensNameToSend = []; + const tokensAddressToSend = []; + const amountsToSend = []; + const sovAmountList = {}; + let totalSovAmount = new BigNumber(0); + + logger.info("Processing whitelisted tokens..."); + for (const whitelistedToken of WHITELISTED_TOKENS) { + logger.info( + `\n\n===== Processing whitelisted tokens ${whitelistedToken.tokenName} - ${whitelistedToken.tokenAddress} =====` + ); + + const tokenContract = await ethers.getContractAt( + "TestToken", + whitelistedToken.tokenAddress + ); + const tokenDecimal = + whitelistedToken.tokenAddress === ETH_NATIVE_TOKEN_ADDRS + ? 18 + : await tokenContract.decimals(); + + /** read balance of token */ + const tokenBalance = await getTokenBalance( + hardhat, + whitelistedToken.tokenAddress, + safeMultisigDeployment.address, + ethers.provider + ); + + logger.info( + `${whitelistedToken.tokenName} balance: ${ethers.utils.formatUnits(tokenBalance.toString(), tokenDecimal)}` + ); + + /** Process 50% of token balance */ + const processedTokenAmount = ethers.BigNumber.from(tokenBalance).div( + ethers.BigNumber.from(2) + ); + + logger.info( + `Proocessing 50% of ${whitelistedToken.tokenName} balance: ${ethers.utils.formatUnits(processedTokenAmount.toString(), tokenDecimal)}` + ); + + /** Get SOV Amount for the token */ + let sovPrice; + if (ACTIVATE_BOB_SNAPSHOT_PRICING) { + /** Use bob snapshot if config flag is true */ + sovPrice = await getPriceByDateFromBobSnapshot( + whitelistedToken.tokenAddress, + SovDeployment.address, + yesterdayDate, + allBobPriceSnapshot + ); + if (!sovPrice || sovPrice.toString() === "0" || isNaN(sovPrice)) { + throw new Error( + `getPriceByDateFromBobSnapshot: empty price data from bob snapshot for token ${whitelistedToken.tokenName} - ${whitelistedToken.tokenAddress}` + ); + } + } else { + /** Use uniswap if bob snapshot config is false */ + // the function will return the price in floating format, e.g: 1 XDAI = 0.6123xx SOV + sovPrice = await getSovPrice(hardhat, whitelistedToken); // from uniswap v3 + } + + // SOV Amount will not consider decimal anymore (1 SOV = 1 SOV) + const sovAmount = new BigNumber(sovPrice) + .multipliedBy(new BigNumber(processedTokenAmount.toString())) + .dividedBy(new BigNumber(`1e${tokenDecimal}`)) + .decimalPlaces(0); + + /** @todo uncomment this line 201 - 220 to check slippage tolerance */ + // get sov price from RSK PriceFeed for slippage comparison + // the function will return price in floating format, e.g: 1 XDAI = 0.6123xx SOV + // NOTE: Slippage check cannot be implemented when using bob snapshot pricing, because we will use the yesterday's price, and there might be a huge slippage between those time + if (!ACTIVATE_BOB_SNAPSHOT_PRICING) { + const sovPriceFromRskPriceFeed = await getPriceFromRskSovrynPriceFeed( + hardhat, + getMappedRskTokenFromEther(whitelistedToken.tokenName), + CONFIG_CONTRACT_ADDRESSES.rskMainnet.sov + ); + + if ( + !checkWithinSlippageTolerancePercentage( + sovPrice.toNumber(), + sovPriceFromRskPriceFeed.toNumber(), + MAX_SLIPPAGE_TOLERANCE_IN_PERCENTAGE + ) + ) { + const errMessage = `token ${whitelistedToken.tokenName} has exceed the max slippage tolerance, uniswapPrice: ${sovPrice}, rskSovrynPrice: ${sovPriceFromRskPriceFeed}`; + logger.error(errMessage); + throw new Error(errMessage); + } + + logger.info( + `Slippage check has passed, uniswapPrice: ${sovPrice}, rskSovrynPrice: ${sovPriceFromRskPriceFeed}` + ); + } + + logger.info(`SOV Amount from 50% ${whitelistedToken.tokenName}: ${sovAmount.toString()}`); + + /** Get USD Price of the processed SOV */ + // GET SOV Price in USD + const sovPriceInUsd = await getPriceFromRskSovrynPriceFeed( + hardhat, + CONFIG_CONTRACT_ADDRESSES.rskMainnet.sov, + CONFIG_CONTRACT_ADDRESSES.rskMainnet.xusd + ); + logger.info(`Current SOV Price in USD: ${sovPriceInUsd}`); + + /** USD Price for 100% processed token */ + const fullProcessedUsdAmountInUsd = sovPriceInUsd + .multipliedBy(sovAmount) + .multipliedBy(new BigNumber(2)); + + /** Compare the full USD Value to the threshold config */ + if (fullProcessedUsdAmountInUsd.lt(TOKEN_BALANCE_THRESHOLD_IN_USD)) { + logger.warning( + `${whitelistedToken.tokenName} balance ${fullProcessedUsdAmountInUsd.toString()} < threshold value to send to LockDrop: ${TOKEN_BALANCE_THRESHOLD_IN_USD}$` + ); + continue; + } + + logger.info( + `token ${whitelistedToken.tokenName} will be processed (USD value: ${fullProcessedUsdAmountInUsd.toString()})` + ); + + tokensNameToSend.push(whitelistedToken.tokenName); + tokensAddressToSend.push(whitelistedToken.tokenAddress); + amountsToSend.push(processedTokenAmount.toString()); + totalSovAmount = totalSovAmount.plus(sovAmount); + + /** For logging purposes */ + sovAmountList[whitelistedToken.tokenName] = sovAmount.toString(); + } + + /** Consider the decimal of SOV */ + const totalSovAmountWithDecimal = totalSovAmount + .multipliedBy(new BigNumber("1e18")) + .decimalPlaces(0); + + /** Check SOV Amount */ + const safeSOVBalance = await getTokenBalance( + hardhat, + SovDeployment.address, + safeMultisigDeployment.address, + ethers.provider + ); + + if (new BigNumber(safeSOVBalance).lt(totalSovAmountWithDecimal)) { + logger.error( + `insufficient SOV Amount, need: ${totalSovAmount.toString()} , got: ${safeSOVBalance.toString()}` + ); + + /** @TODO Trigger alert to discord maybe */ + return; + } + + logger.info("Token list to send.."); + logger.info(JSON.stringify(tokensNameToSend)); + + logger.info("Token Address to send.."); + logger.info(JSON.stringify(tokensAddressToSend)); + + logger.info("Amounts list to send.."); + logger.info(JSON.stringify(amountsToSend)); + + logger.info("Token <> SOV List Details"); + logger.info(JSON.stringify(sovAmountList)); + + logger.info(`Total SOV Amount: ${totalSovAmount.toString()}`); + logger.info( + `Total SOV Amount (With decimal) to sent: ${totalSovAmountWithDecimal.toString()}` + ); + + if (amountsToSend.length != tokensAddressToSend.length) { + throw new Error( + `Tokens amount length: (${amountsToSend.length}) mismatch with token addresses length: (${tokensAddressToSend.length})` + ); + } + + if (!amountsToSend.length) { + logger.info("Empty token list to be processed, exiting..."); + return; + } + + /** Process sending token */ + if (!dryRun) { + logger.info("===== Execute the sendToLockDropContract function from multisig safe ====="); + logger.info(`Safe Module address: ${safeMultisigModuleDeployment.address}`); + const tx = await safeMultisigModuleContract + .connect(signer) + .sendToLockDropContract( + tokensAddressToSend, + amountsToSend, + totalSovAmountWithDecimal.toFixed() + ); + logger.info("===== Execute Done ====="); + logger.info(tx); + } +} + +async function getPoolAddress(hardhat, tokenInAddress, tokenOutAddress, fee = FeeAmount.HIGH) { + const { ethers } = hardhat; + const tokenInContract = await ethers.getContractAt("TestToken", tokenInAddress); + const tokenOutContract = await ethers.getContractAt("TestToken", tokenOutAddress); + const tokenInDecimal = await tokenInContract.decimals(); + const tokenOutDecimal = await tokenOutContract.decimals(); + const TOKEN_IN = new Token( + 1, + tokenInAddress, + tokenInDecimal, + "IN", // dummy name + "IN" // dummy symbol + ); + + const TOKEN_OUT = new Token( + 1, + tokenOutAddress, + tokenOutDecimal, + "OUT", // dummy name + "OUT" // dummy symbol + ); + + const currentPoolAddress = computePoolAddress({ + factoryAddress: CONFIG_CONTRACT_ADDRESSES.mainnet.uniswapV3PoolFactory, + tokenA: TOKEN_IN, + tokenB: TOKEN_OUT, + fee: fee, + }); + + console.log(`pool address of ${tokenInAddress} <> ${tokenOutAddress}: ${currentPoolAddress}`); +} + +async function getSovPrice(hardhat, whitelistedTokenConfig, log = true) { + const { ethers, deployments } = hardhat; + const { get } = deployments; + const SovDeployment = await get("SOV"); + + const wethAddress = CONFIG_CONTRACT_ADDRESSES.mainnet.weth; + if (!whitelistedTokenConfig.pricingRoutePath.length) throw new Error("Empty route path"); + if (whitelistedTokenConfig.pricingRoutePath.length > 2) + throw new Error("Only support 2 route path for token pricing"); + + let latestPrice = 0; + let previousRoutePrice = 0; + for (const [index, pricingRoute] of whitelistedTokenConfig.pricingRoutePath.entries()) { + const poolContract = await ethers.getContractAt("UniswapV3Pool", pricingRoute); + const poolToken0 = await poolContract.token0(); + const poolToken1 = await poolContract.token1(); + + // if last index is not TOKEN <> SOV pool, it will revert + if ( + index === whitelistedTokenConfig.pricingRoutePath.length - 1 && + poolToken0.toLowerCase() != SovDeployment.address.toLowerCase() && + poolToken1.toLowerCase() != SovDeployment.address.toLowerCase() + ) { + throw new Error("Last route must be SOV pool"); + } + + const token0Contract = await ethers.getContractAt("TestToken", poolToken0); + const token1Contract = await ethers.getContractAt("TestToken", poolToken1); + + const token0Decimal = await token0Contract.decimals(); + const token1Decimal = await token1Contract.decimals(); + + if (poolToken0 != wethAddress && poolToken1 != wethAddress) { + throw new Error( + `failed to get pricing for ${tokenInAddress} - ${tokenOutAddress}, non of token index are weth` + ); + } + + const slot = await poolContract.slot0(); + const sqrtPriceX96 = slot["sqrtPriceX96"]; + let rawPrice = sqrtPriceX96 ** 2 / 2 ** 192; + let decimalDiff = token0Decimal - token1Decimal; + + let price; + if (index === whitelistedTokenConfig.pricingRoutePath.length - 1) { + /** For last route, which is sov, we get the price in SOV unit instead */ + price = + poolToken0.toLowerCase() === wethAddress.toLowerCase() + ? new BigNumber(rawPrice) + : new BigNumber(1).div(new BigNumber(rawPrice)); // always in SOV Unit + decimalDiff = + poolToken0.toLowerCase() === wethAddress.toLowerCase() + ? decimalDiff + : decimalDiff * -1; + } else { + /** For non last route, we get the price in WETH unit */ + price = + poolToken0.toLowerCase() === wethAddress.toLowerCase() + ? new BigNumber(1).div(new BigNumber(rawPrice)) + : new BigNumber(rawPrice); // always in WETH Unit + + /** */ + decimalDiff = + poolToken0.toLowerCase() === wethAddress.toLowerCase() + ? decimalDiff * -1 + : decimalDiff; + } + + if (decimalDiff != 0) { + price = price.multipliedBy(new BigNumber(`1e${decimalDiff}`)); + } + + if (previousRoutePrice === 0) { + latestPrice = price; + } else { + // previousRoutePrice always be in ETH unit, so to normalize we need to do the ^1e18 + latestPrice = new BigNumber(previousRoutePrice).multipliedBy(new BigNumber(price)); + } + + previousRoutePrice = price; + } + + if (log) { + console.log( + `(Uniswap v3) SOV Price of ${whitelistedTokenConfig.tokenName} - ${whitelistedTokenConfig.tokenAddress}: ${latestPrice.toString()}` + ); + } + + /** Price = price per unit */ + return latestPrice; +} + +async function getPriceFromRskSovrynPriceFeed(hardhat, sourceTokenAddress, destTokenAddress) { + const { ethers } = hardhat; + const rskProvider = new ethers.providers.JsonRpcProvider("https://mainnet-dev.sovryn.app/rpc"); + const priceFeedFactory = await ethers.getContractFactory("PriceFeeds"); + const priceFeedAbi = priceFeedFactory.interface.format(ethers.utils.FormatTypes.json); + const priceFeedContract = new ethers.Contract( + CONFIG_CONTRACT_ADDRESSES.rskMainnet.priceFeed, + priceFeedAbi, + rskProvider + ); + + const price = await priceFeedContract.queryRate(sourceTokenAddress, destTokenAddress); + + const finalPrice = new BigNumber(price[0].toString()).dividedBy( + new BigNumber(price[1].toString()) + ); + + // console.log(`${sourceTokenAddress}: ${finalPrice}`); + + return finalPrice; +} + +async function getAllPricesFromBobSnapshotApi() { + const response = await axios.get("https://fusion-api.gobob.xyz/tokenprices"); + + return response.data; +} + +/** + * Calculate Dest Token Price from the give source token address + * @param sourceTokenAddress address of source token + * @param destinationTokenAddress address of dest token + * @param date date of snapshot price, format YYYY-MM-DD e.g: 2023-03-23 + * @param allBobPriceSnapshot array of object of all bob price snapshot + * + * @return sov price, e.g: 1 USD (source token) = 0.6 SOV (dest token), this function will return "0.6" -> Type BigNumber + * @NOTE returning zero price meaning there is an issue with the api data. + */ +async function getPriceByDateFromBobSnapshot( + sourceTokenAddress, + destinationTokenAddress, + date, + allBobPriceSnapshot +) { + if (sourceTokenAddress === ETH_NATIVE_TOKEN_ADDRS) sourceTokenAddress = ZERO_ADDRESS; + if (destinationTokenAddress === ETH_NATIVE_TOKEN_ADDRS) destinationTokenAddress = ZERO_ADDRESS; + + /** For WETH, we use ETH instead */ + if (sourceTokenAddress === CONFIG_CONTRACT_ADDRESSES.mainnet.weth) + sourceTokenAddress = ZERO_ADDRESS; + if (destinationTokenAddress === CONFIG_CONTRACT_ADDRESSES.mainnet.weth) + destinationTokenAddress = ZERO_ADDRESS; + + const price = allBobPriceSnapshot.filter((priceSnapshotObj) => { + return ( + priceSnapshotObj.token_address.toLowerCase() === sourceTokenAddress.toLowerCase() && + priceSnapshotObj.closing_day === date + ); + }); + + if (price.length > 1) { + throw new Error( + `bobPriceSnapshot: There are two identical price for ${sourceTokenAddress} with date ${date}` + ); + } + + if (!price.length) { + return 0; + } + + const sourceTokenInUsdPrice = price[0].price; + + const destTokenPrice = allBobPriceSnapshot.filter((priceSnapshotObj) => { + return ( + priceSnapshotObj.token_address.toLowerCase() === + destinationTokenAddress.toLowerCase() && priceSnapshotObj.closing_day === date + ); + }); + + if (destTokenPrice.length > 1) { + throw new Error( + `bobPriceSnapshot: There are two identical price for ${destinationTokenAddress} Token with date ${date}` + ); + } + + if (!destTokenPrice.length) { + return 0; // just return 0 price to indicates there is an issue + } + + const destTokenInUsdPrice = destTokenPrice[0].price; + + return new BigNumber(sourceTokenInUsdPrice).dividedBy(new BigNumber(destTokenInUsdPrice)); +} + +async function getSovAmountByQuoter(hardhat, tokenInAddress, tokenOutAddress, amountIn) { + /** The other solution to get price - but this one will consider the liquidity and swap amount in the pool */ + const { ethers } = hardhat; + const quoterContract = await ethers.getContract("UniswapQuoter"); + const quotedAmountOut = await quoterContract.callStatic.quoteExactInputSingle( + tokenInAddress, + tokenOutAddress, + ethers.BigNumber.from(FeeAmount.HIGH), + amountIn, + 0 + ); + + console.log(quotedAmountOut.toString()); + + return quotedAmountOut; +} + +async function getTokenBalance(hardhat, tokenAddress, holderAdress, provider) { + const { ethers } = hardhat; + if (tokenAddress === ETH_NATIVE_TOKEN_ADDRS) { + return await provider.getBalance(holderAdress); + } else { + const tokenContract = await ethers.getContractAt("TestToken", tokenAddress); + return await tokenContract.balanceOf(holderAdress); + } +} + +function checkWithinSlippageTolerancePercentage( + price1, + price2, + slippageMaxPercentage, + log = true +) { + // Calculate the percentage difference + const difference = Math.abs(price1 - price2); + const average = (price1 + price2) / 2; + + const percentageDifference = (difference / average) * 100; + + if (log) console.log("slippage percentage diff: ", percentageDifference); + // Check if the percentage difference is within 10% + return percentageDifference <= slippageMaxPercentage; +} + +function getMappedRskTokenFromEther(etherTokenName) { + switch (etherTokenName) { + case "WBTC": + return CONFIG_CONTRACT_ADDRESSES.rskMainnet.wbtc; + case "ETH": + case "WETH": + return CONFIG_CONTRACT_ADDRESSES.rskMainnet.weth; + case "USDT": + case "USDC": + case "DAI": + return CONFIG_CONTRACT_ADDRESSES.rskMainnet.xusd; + default: + throw new Error("Failed to map the eth <> rsk token"); + } +} +// executeTimeLockDepositor(); + +// Example usage: +// console.log(checkWithinSlippageTolerancePercentage(50, 59, 10)); // Output: false +// console.log(checkWithinSlippageTolerancePercentage(50, 54, 10)); // Output: true +// console.log(checkWithinSlippageTolerancePercentage(0.555250425310134847, 0.495250425310134847, 10)); // Output: false +// console.log(checkWithinSlippageTolerancePercentage(37897.01, 37283.26, 10)); // Output: false + +// getPoolAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") // get USDT <> WETH +// getPoolAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") // get USDC <> WETH +// getPoolAddress("0x6B175474E89094C44Da98b954EedeAC495271d0F", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") // get DAI <> WETH + +// getPoolAddress("0x18084fba666a33d37592fa2633fd49a74dd93a88", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", FeeAmount.MEDIUM) // get TBTC <> WETH +// getPoolAddress("0xae78736cd615f374d3085123a210448e74fc6393", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", FeeAmount.MEDIUM) // get rETH <> WETH +// getPoolAddress("0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", FeeAmount.MEDIUM) // get wstETH <> WETH + +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[0]); // get wbtc price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[1]) // get eth price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[2]) // get weth price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[3]) // get usdt price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[4]) // get usdc price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[5]) // get dai price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[6]) // get tbtc price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[7]) // get reth price +// getSovPrice(CONFIG_WHITELISTED_TOKENS.mainnet[8]) // get wsteth price + +// getPriceFromRskSovrynPriceFeed(CONFIG_CONTRACT_ADDRESSES.rskMainnet.wbtc, CONFIG_CONTRACT_ADDRESSES.rskMainnet.sov) +// getPriceFromRskSovrynPriceFeed(CONFIG_CONTRACT_ADDRESSES.rskMainnet.xusd, CONFIG_CONTRACT_ADDRESSES.rskMainnet.sov) +// getPriceFromRskSovrynPriceFeed(CONFIG_CONTRACT_ADDRESSES.rskMainnet.weth, CONFIG_CONTRACT_ADDRESSES.rskMainnet.sov) + +// (async () => { +// const allPrices = await getAllPricesFromBobSnapshotApi() +// const date = moment().format('YYYY-MM-DD'); +// console.log(date) +// const tokenPrice = await getTokenPriceByDateFromBobSnapshot("0x0000000000000000000000000000000000000000", date, allPrices); +// console.log(tokenPrice) +// })() + +module.exports = { + executeTimeLockDepositor, + getSovPrice, + ETH_NATIVE_TOKEN_ADDRS, + getTokenBalance, + getAllPricesFromBobSnapshotApi, + getPriceByDateFromBobSnapshot, + MAX_SLIPPAGE_TOLERANCE_IN_PERCENTAGE, + checkWithinSlippageTolerancePercentage, +}; diff --git a/tests-foundry/README.md b/tests-foundry/README.md index 9e632a814..9dfa8eaa9 100644 --- a/tests-foundry/README.md +++ b/tests-foundry/README.md @@ -5,8 +5,13 @@ forge test ``` ### Run a specific test +**Examples** ``` forge test --match-path */staking/StakingStake.t.sol --match-test testFuzz_Withdraw -vvv ``` +``` +forge test --match-contract SafeDepositsSenderTest -vvv +``` + *-vvv is verbosity level, it is the most optimal if having failing tests* \ No newline at end of file diff --git a/tests-foundry/deposits-sender/README.md b/tests-foundry/deposits-sender/README.md new file mode 100644 index 000000000..97d1a0d47 --- /dev/null +++ b/tests-foundry/deposits-sender/README.md @@ -0,0 +1,5 @@ +Gnosis Safe module is designed to send funds accumulated by the Safe to the BOB LockDrop contract from a script using the dedicated wallet 0x86De732721FfFCdf163629C64e3925B5BF7F371A. + +``` +forge test --match-contract SafeDepositsSenderTest -vvv +``` \ No newline at end of file diff --git a/tests-foundry/deposits-sender/SafeDepositsSender.t.sol b/tests-foundry/deposits-sender/SafeDepositsSender.t.sol new file mode 100644 index 000000000..c497c37b6 --- /dev/null +++ b/tests-foundry/deposits-sender/SafeDepositsSender.t.sol @@ -0,0 +1,482 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.17; + +using stdStorage for StdStorage; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +//import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +// import "forge-std/console.sol"; +import { stdStorage, StdStorage, Test, console } from "forge-std/Test.sol"; +import { ILockDrop } from "@contracts/integrations/bob/interfaces/ILockDrop.sol"; +import { SafeDepositsSender, GnosisSafe } from "@contracts/integrations/bob/SafeDepositsSender.sol"; +import { ISafeDepositsSender } from "@contracts/integrations/bob/interfaces/ISafeDepositsSender.sol"; +import { Utilities } from "./Utilities.sol"; + +contract ArbitraryErc20 is ERC20, Ownable { + constructor( + string memory _name, + string memory _symbol, + address _owner + ) ERC20(_name, _symbol) Ownable() {} + + function sudoMint(address to, uint256 amount) public /*onlyOwner*/ { + _mint(to, amount); + } +} + +// Dummy Bridge contract +contract MockLockDrop { + using SafeERC20 for IERC20; + + /** + * @dev Deposit ERC20 tokens. + * @param token Address of the ERC20 token. + * @param amount Amount of tokens to deposit. + */ + function depositERC20( + address token, + uint256 amount + ) external /*isDepositAllowed(amount) whenNotPaused*/ { + // require(allowedTokens[token].isAllowed, "Deposit token not allowed"); + + // deposits[msg.sender][token] += amount; + // totalDeposits[token] += amount; + // Transfer tokens to contract + IERC20(token).safeTransferFrom(msg.sender, address(this), amount); + // Emit Deposit event + // emit Deposit(msg.sender, token, amount, block.timestamp); + } + + /** + * @dev Deposit Ether + * Allows users to deposit Ether into the contract. + */ + function depositEth() external payable /*isDepositAllowed(msg.value) whenNotPaused*/ { + // Increase the deposited Ether amount for the sender. + // deposits[msg.sender][ETH_TOKEN_ADDRESS] += msg.value; + // totalDeposits[ETH_TOKEN_ADDRESS] += msg.value; + // // Emit Deposit Event + // emit Deposit(msg.sender, ETH_TOKEN_ADDRESS, msg.value, block.timestamp); + } +} + +contract SafeMock { + /** + * @notice Executes either a delegatecall or a call with provided parameters. + * @dev This method doesn't perform any sanity check of the transaction, such as: + * - if the contract at `to` address has code or not + * It is the responsibility of the caller to perform such checks. + * @param to Destination address. + * @param value Ether value. + * @param data Data payload. + * @param operation Operation type. + * @return success boolean flag indicating if the call succeeded. + */ + function execute( + address to, + uint256 value, + bytes memory data, + GnosisSafe.Operation operation, + uint256 txGas + ) internal returns (bool success) { + if (operation == GnosisSafe.Operation.DelegateCall) { + /* solhint-disable no-inline-assembly */ + /// @solidity memory-safe-assembly + assembly { + success := delegatecall(txGas, to, add(data, 0x20), mload(data), 0, 0) + } + /* solhint-enable no-inline-assembly */ + } else { + /* solhint-disable no-inline-assembly */ + /// @solidity memory-safe-assembly + assembly { + success := call(txGas, to, value, add(data, 0x20), mload(data), 0, 0) + } + /* solhint-enable no-inline-assembly */ + } + } + + /** + * @notice Execute `operation` (0: Call, 1: DelegateCall) to `to` with `value` (Native Token) + * @dev Function is virtual to allow overriding for L2 singleton to emit an event for indexing. + * @param to Destination address of module transaction. + * @param value Ether value of module transaction. + * @param data Data payload of module transaction. + * @param operation Operation type of module transaction. + * @return success Boolean flag indicating if the call succeeded. + */ + function execTransactionFromModule( + address to, + uint256 value, + bytes memory data, + GnosisSafe.Operation operation + ) public returns (bool success) { + // (address guard, bytes32 guardHash) = preModuleExecution(to, value, data, operation); + success = execute(to, value, data, operation, type(uint256).max); + // postModuleExecution(guard, guardHash, success); + } +} + +contract SafeDepositsSenderTest is SafeDepositsSender, Test { + ArbitraryErc20[] tokens; // = new ArbitraryErc20[](3); + address internal sudoOwner = address(0x1234567890123456789012345678901234567890); + address internal depositsSender = address(0x1234567890123456789012345678901234567891); + address constant NATIVE_TOKEN_ADDRESS = address(0x01); + + SafeMock safe = new SafeMock(); + MockLockDrop lockDrop = new MockLockDrop(); + address internal lockDropAddress = address(lockDrop); + + ArbitraryErc20 sov = new ArbitraryErc20("SOV", "SOV", sudoOwner); + + Utilities internal utils; + + uint32 constant MIN_GAS_LIMIT = 20000; + address internal alice; + address internal bob; + address internal owner; + address payable[] internal users; + + uint96 constant MAX_96 = 2 ** 96 - 1; + uint256 constant MAX_256 = 2 ** 256 - 1; + uint32 constant MAX_32 = 2 ** 32 - 1; + + constructor() + SafeDepositsSender(address(safe), address(lockDrop), address(sov), depositsSender) + {} + + function setAddressArray(address[] memory source) private returns (address[] memory target) { + for (uint256 i = 0; i < source.length; i++) { + target[i] = source[i]; + } + return target; + } + + function setUintArray(uint256[] memory source) private returns (uint256[] memory target) { + for (uint256 i = 0; i < source.length; i++) { + target[i] = source[i]; + } + return target; + } + + function setUp() public { + utils = new Utilities(); + users = utils.createUsers(5); + + // owner = users[0]; + // vm.label(owner, "Owner"); + alice = users[0]; + vm.label(alice, "Alice"); + bob = users[1]; + vm.label(bob, "Bob"); + + tokens = [ + new ArbitraryErc20("wETH", "wETH", sudoOwner), + new ArbitraryErc20("USDT", "USDT", sudoOwner), + new ArbitraryErc20("DAI", "DAI", sudoOwner) + ]; + + vm.deal(address(this), 0 ether); + } + + function testFuzz_SendingMultipleTokensToLockDrop( + uint256 amount, + uint256 numberOfTokens, + bool useNativeToken + ) public { + numberOfTokens = bound(numberOfTokens, 1, 3); + amount = bound(amount, 1, MAX_256 / 1000) * 2; + uint256 tokensQty = numberOfTokens + (useNativeToken ? 1 : 0); + uint256[] memory amounts = new uint256[](tokensQty); + // add pseudo address for ETH 0x01 in the end- not 0x00 to avoid default address errors + address[] memory tokensParam = new address[](tokensQty); + + uint256 sovAmount = amount * 100; + console.log("sovAmount:", sovAmount); + console.log("amount:", amount); + console.log("tokensQty:", tokensQty); + + vm.startPrank(sudoOwner); + for (uint256 i = 0; i < numberOfTokens; i++) { + tokens[i].sudoMint(address(safe), amount); + amounts[i] = amount / 2; + tokensParam[i] = address(tokens[i]); + console.log("amounts [%s]: %s", i, amounts[i]); + } + if (useNativeToken) { + vm.deal(address(safe), amount); + amounts[amounts.length - 1] = amount / 2; + tokensParam[tokensParam.length - 1] = NATIVE_TOKEN_ADDRESS; + } + + sov.sudoMint(address(safe), sovAmount); + vm.stopPrank(); + + vm.startPrank(depositsSender); + + // calling sendToLockDropContract should transfer 50% of tokens to LockDrop + // and another 50% to this contract if there is enough balance on the Safe + // in effect Safe should have 0 balance on all tokens except SOV and native token + for (uint256 i = 0; i < numberOfTokens; i++) { + vm.expectEmit(); + emit DepositToLockdrop(address(lockDrop), address(tokens[i]), amounts[i]); + emit WithdrawBalanceFromSafe(address(tokens[i]), amounts[i]); + } + emit DepositSOVToLockdrop(address(lockDrop), sovAmount / 2); + this.sendToLockDropContract(tokensParam, amounts, sovAmount / 2); + vm.stopPrank(); + + // check LockDrop balances + for (uint256 i = 0; i < numberOfTokens; i++) { + assertEq(tokens[i].balanceOf(address(lockDrop)), amounts[i]); + } + if (useNativeToken) { + assertEq((address(lockDrop)).balance, amount / 2); + } + assertEq(sov.balanceOf(address(safe)), sovAmount / 2); + + //check Safe balances + for (uint256 i = 0; i < numberOfTokens; i++) { + assertEq(tokens[i].balanceOf(address(safe)), 0); + } + if (useNativeToken) { + assertEq((address(safe)).balance, 0); + } + assertEq(sov.balanceOf(address(safe)), sovAmount / 2); + + // check this module balance - should have safe tokens balances transferred to the module + for (uint256 i = 0; i < numberOfTokens; i++) { + assertEq(tokens[i].balanceOf(address(this)), amounts[i]); + } + if (useNativeToken) { + assertEq(address(this).balance, amount / 2); + } + assertEq(sov.balanceOf(address(this)), 0); + } + + function test_SendingMultipleTokensToLockDropSettersAndExceptions() public { + // add pseudo address for ETH 0x01 in the end- not 0x00 to avoid default address errors + address[] memory tokensParam = new address[](tokens.length); + + for (uint256 i = 0; i < tokens.length; i++) { + tokensParam[i] = address(tokens[i]); + } + + uint256[] memory amountsParam = new uint256[](1); + amountsParam[0] = uint256(100); + + vm.startPrank(alice); + vm.expectRevert("SafeDepositsSender: Only Depositor or Safe"); + this.sendToLockDropContract(tokensParam, amountsParam, 1); + vm.stopPrank(); + + vm.startPrank(depositsSender); + + vm.expectRevert("SafeDepositsSender: Tokens and amounts length mismatch"); + this.sendToLockDropContract(tokensParam, amountsParam, 0); + + address[] memory sovParam = new address[](1); + sovParam[0] = address(sov); + + address[] memory tokenParam = new address[](1); + tokenParam[0] = address(tokens[0]); + + vm.expectRevert("SafeDepositsSender: SOV token is transferred separately"); + this.sendToLockDropContract(sovParam, amountsParam, 100); + + vm.expectRevert("SafeDepositsSender: Invalid SOV amount"); + this.sendToLockDropContract(tokenParam, amountsParam, 0); + + vm.stopPrank(); + + vm.startPrank(address(safe)); + this.pause(); + vm.stopPrank(); + + vm.startPrank(depositsSender); + vm.expectRevert("SafeDepositsSender: Paused"); + amountsParam = new uint256[](3); + amountsParam[0] = uint256(100); + amountsParam[1] = uint256(200); + amountsParam[2] = uint256(300); + this.sendToLockDropContract(tokensParam, amountsParam, 1); + + vm.expectEmit(); + emit MapDepositorToReceiver(depositsSender, alice); + this.mapDepositorToReceiver(alice); + (lockDropAddress); + assertEq(this.getLockDropAddress(), lockDropAddress); + vm.stopPrank(); + + vm.startPrank(address(safe)); + this.unpause(); + vm.stopPrank(); + + vm.startPrank(alice); + vm.expectRevert("SafeDepositsSender: Only Safe"); + this.setDepositorAddress(address(0x01)); + vm.stopPrank(); + + vm.startPrank(address(safe)); + vm.expectEmit(); + emit SetDepositorAddress(depositsSender, address(0x01)); + this.setDepositorAddress(address(0x01)); + assertEq(this.getDepositorAddress(), address(0x01)); + + vm.expectEmit(); + emit SetDepositorAddress(address(0x01), address(0x00)); + this.setDepositorAddress(address(0x00)); + assertEq(this.getDepositorAddress(), address(0x00)); + + vm.expectEmit(); + emit SetDepositorAddress(address(0x00), depositsSender); + this.setDepositorAddress(depositsSender); + assertEq(this.getDepositorAddress(), depositsSender); + + vm.expectEmit(); + emit SetLockDropAddress(lockDropAddress, address(0x01)); + this.setLockDropAddress(address(0x01)); + assertEq(this.getLockDropAddress(), address(0x01)); + + vm.expectRevert("SafeDepositsSender: Zero address not allowed"); + emit SetLockDropAddress(address(0x01), address(0x00)); + this.setLockDropAddress(address(0x00)); + + vm.expectEmit(); + emit SetLockDropAddress(address(0x01), lockDropAddress); + this.setLockDropAddress(lockDropAddress); + assertEq(this.getLockDropAddress(), lockDropAddress); + + vm.stopPrank(); + + //@todo add more tests for exceptions + + vm.startPrank(address(safe)); + vm.expectEmit(); + emit Stop(); + this.stop(); + vm.stopPrank(); + + vm.startPrank(depositsSender); + vm.expectRevert("SafeDepositsSender: Stopped"); + this.sendToLockDropContract(tokensParam, amountsParam, 1); + } + + function testFuzz_WithdrawFundsFromModuleBySafe( + uint256 amount, + uint256 numberOfTokens, + bool useNativeToken + ) public { + numberOfTokens = bound(numberOfTokens, 1, 3); + amount = bound(amount, 1, MAX_256 / 1000) * 2; + uint256 tokensQty = numberOfTokens + 1 + (useNativeToken ? 1 : 0); // +1 for SOV + uint256[] memory amounts = new uint256[](tokensQty); + // add pseudo address for ETH 0x01 in the end- not 0x00 to avoid default address errors + address[] memory tokensParam = new address[](tokensQty); + + uint256 sovAmount = amount * 100; + console.log("sovAmount:", sovAmount); + console.log("amount:", amount); + console.log("tokensQty:", tokensQty); + + tokensParam[0] = address(sov); + console.log("tokensParam[0]", tokensParam[0]); + console.log("sovAmount", sovAmount); + amounts[0] = sovAmount; + deal(tokensParam[0], address(this), sovAmount); + console.log("amounts[0]: %s", amounts[0]); + deal(address(sov), address(this), sovAmount); + for (uint256 i = 0; i < numberOfTokens; i++) { + tokensParam[i + 1] = address(tokens[i]); + amounts[i + 1] = amount; + console.log("amounts [%s]: %s", i + 1, amount); + deal(tokensParam[i + 1], address(this), amount); + console.log("tokens[%s] balance %s", i + 1, tokens[i].balanceOf(address(this))); + } + if (useNativeToken) { + amounts[amounts.length - 1] = amount; + tokensParam[tokensParam.length - 1] = NATIVE_TOKEN_ADDRESS; + vm.deal(address(this), amount); + } + + console.log("NATIVE_TOKEN_ADDRESS:", NATIVE_TOKEN_ADDRESS); + console.log("tokensParam.length:", tokensParam.length); + + uint256 snapshot = vm.snapshot(); + + vm.startPrank(address(safe)); + vm.deal(bob, 0 ether); + this.withdraw(tokensParam, amounts, bob); + _expectBalancesZero(address(this), tokensParam); + _expectBalances(bob, tokensParam, amounts); + vm.stopPrank(); + + vm.revertTo(snapshot); + snapshot = vm.snapshot(); + + vm.startPrank(address(safe)); + vm.deal(bob, 0 ether); + this.withdrawAll(tokensParam, bob); + _expectBalancesZero(address(this), tokensParam); + _expectBalances(bob, tokensParam, amounts); + vm.stopPrank(); + + vm.revertTo(snapshot); + + vm.startPrank(address(safe)); + vm.deal(bob, 0 ether); + for (uint256 i = 0; i < amounts.length; i++) { + console.log("before amounts [%s]: %s", i + 1, amounts[i]); + amounts[i] = amounts[i] / 2; + console.log("after amounts [%s]: %s", i + 1, amounts[i]); + } + this.withdraw(tokensParam, amounts, bob); + _expectBalances(address(this), tokensParam, amounts); + _expectBalances(bob, tokensParam, amounts); + vm.stopPrank(); + + vm.revertTo(snapshot); + + vm.startPrank(bob); + vm.deal(bob, 0 ether); + vm.expectRevert("SafeDepositsSender: Only Safe"); + this.withdraw(tokensParam, amounts, bob); + vm.expectRevert("SafeDepositsSender: Only Safe"); + this.withdrawAll(tokensParam, bob); + vm.stopPrank(); + } + + function test_execTransactionFromSafe() public { + bytes memory data = abi.encodeWithSignature("approve(address,uint256)", alice, 111 ether); + vm.startPrank(address(safe)); + this.execTransactionFromSafe(address(sov), 0, data, GnosisSafe.Operation.Call); + vm.stopPrank(); + assertEq(sov.allowance(address(this), alice), 111 ether); + } + + function _expectBalancesZero(address _address, address[] memory _tokens) internal { + for (uint256 i = 0; i < _tokens.length; i++) { + if (_tokens[i] == address(0x01)) { + assertEq(_address.balance, 0); + continue; + } + assertEq(ArbitraryErc20(_tokens[i]).balanceOf(_address), 0); + } + } + + function _expectBalances( + address _address, + address[] memory _tokens, + uint256[] memory _amounts + ) internal { + for (uint256 i = 0; i < _tokens.length; i++) { + if (_tokens[i] == address(0x01)) { + assertEq(_address.balance, _amounts[i]); + continue; + } + assertEq(ArbitraryErc20(_tokens[i]).balanceOf(_address), _amounts[i]); + } + } +} diff --git a/tests-foundry/deposits-sender/Utilities.sol b/tests-foundry/deposits-sender/Utilities.sol new file mode 100644 index 000000000..ec5a56837 --- /dev/null +++ b/tests-foundry/deposits-sender/Utilities.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.17; + +import { DSTest } from "ds-test/test.sol"; +import { Vm } from "forge-std/Vm.sol"; + +//common utilities for forge tests +contract Utilities is DSTest { + Vm internal immutable vm = Vm(HEVM_ADDRESS); + bytes32 internal nextUser = keccak256(abi.encodePacked("user address")); + + function getNextUserAddress() external returns (address payable) { + //bytes32 to address conversion + address payable user = payable(address(uint160(uint256(nextUser)))); + nextUser = keccak256(abi.encodePacked(nextUser)); + return user; + } + + //create users with 1 ether balance + function createUsers(uint256 userNum) external returns (address payable[] memory) { + address payable[] memory users = new address payable[](userNum); + for (uint256 i = 0; i < userNum; i++) { + address payable user = this.getNextUserAddress(); + vm.deal(user, 1 ether); + users[i] = user; + } + return users; + } +} diff --git a/tests/protocol/CloseDepositTestToken.test.js b/tests/protocol/CloseDepositTestToken.test.js index 5d7e1ba83..16ee12dec 100644 --- a/tests/protocol/CloseDepositTestToken.test.js +++ b/tests/protocol/CloseDepositTestToken.test.js @@ -17,7 +17,7 @@ const { increaseTime, blockNumber } = require("../Utils/Ethereum"); const FeesEvents = artifacts.require("FeesEvents"); const LoanClosingsEvents = artifacts.require("LoanClosingsEvents"); -const IERC20 = artifacts.require("IERC20"); +const IERC20 = artifacts.require("contracts/interfaces/IERC20.sol:IERC20"); const LockedSOVMockup = artifacts.require("LockedSOVMockup"); const {