More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,483 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 21442714 | 10 hrs ago | IN | 0 ETH | 0.02517505 | ||||
Remove Liquidity... | 21438144 | 25 hrs ago | IN | 0 ETH | 0.02691779 | ||||
Remove Liquidity... | 21437976 | 25 hrs ago | IN | 0 ETH | 0.0217535 | ||||
Add Liquidity | 21394517 | 7 days ago | IN | 0 ETH | 0.01592987 | ||||
Add Liquidity | 21389551 | 7 days ago | IN | 0 ETH | 0.01246872 | ||||
Add Liquidity | 21387007 | 8 days ago | IN | 0 ETH | 0.02581898 | ||||
Remove Liquidity | 21386962 | 8 days ago | IN | 0 ETH | 0.02831119 | ||||
Remove Liquidity | 21385576 | 8 days ago | IN | 0 ETH | 0.01412685 | ||||
Remove Liquidity | 21380609 | 9 days ago | IN | 0 ETH | 0.0281331 | ||||
Remove Liquidity | 21380603 | 9 days ago | IN | 0 ETH | 0.02298139 | ||||
Add Liquidity | 21377089 | 9 days ago | IN | 0 ETH | 0.01025916 | ||||
Remove Liquidity | 21359832 | 11 days ago | IN | 0 ETH | 0.0082801 | ||||
Add Liquidity | 21353720 | 12 days ago | IN | 0 ETH | 0.00978943 | ||||
Remove Liquidity | 21336903 | 15 days ago | IN | 0 ETH | 0.01696205 | ||||
Remove Liquidity | 21336902 | 15 days ago | IN | 0 ETH | 0.01938015 | ||||
Remove Liquidity | 21336883 | 15 days ago | IN | 0 ETH | 0.01921052 | ||||
Remove Liquidity | 21336882 | 15 days ago | IN | 0 ETH | 0.01995287 | ||||
Add Liquidity | 21328859 | 16 days ago | IN | 0 ETH | 0.01518893 | ||||
Remove Liquidity... | 21326673 | 16 days ago | IN | 0 ETH | 0.01250103 | ||||
Remove Liquidity | 21323134 | 17 days ago | IN | 0 ETH | 0.02089477 | ||||
Remove Liquidity | 21323134 | 17 days ago | IN | 0 ETH | 0.02117595 | ||||
Remove Liquidity | 21323054 | 17 days ago | IN | 0 ETH | 0.02672424 | ||||
Remove Liquidity | 21301276 | 20 days ago | IN | 0 ETH | 0.01203675 | ||||
Add Liquidity | 21299492 | 20 days ago | IN | 0 ETH | 0.00667641 | ||||
Remove Liquidity... | 21292153 | 21 days ago | IN | 0 ETH | 0.00503168 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurveDepositZap
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import "Ownable.sol"; import "SafeERC20.sol"; import "IVault.sol"; interface ICurveToken { function minter() external view returns (address); } interface ICurvePool { function remove_liquidity_one_coin( uint256 _burn_amount, int128 i, uint256 _min_received ) external returns (uint256); function calc_withdraw_one_coin(uint256 _burn_amount, int128 i) external view returns (uint256); function coins(uint256 arg0) external view returns (address); function balances(uint256 i) external view returns (uint256); } interface ICurvePoolV2 { function remove_liquidity_one_coin( uint256 _burn_amount, uint256 i, uint256 _min_received ) external returns (uint256); function gamma() external view returns (uint256); // changed interface only appears to be used in 2-coin v2 pools function calc_token_amount(uint256[2] calldata amounts) external view returns (uint256); function calc_withdraw_one_coin(uint256 _burn_amount, uint256 i) external view returns (uint256); } interface ICurvePool2 is ICurvePool { function add_liquidity(uint256[2] calldata _amounts, uint256 _min_mint_amount) external returns (uint256); function remove_liquidity(uint256 _burn_amount, uint256[2] calldata _min_amounts) external; function calc_token_amount(uint256[2] calldata _amounts, bool _is_deposit) external view returns (uint256); } interface ICurvePool3 is ICurvePool { function add_liquidity(uint256[3] calldata _amounts, uint256 _min_mint_amount) external returns (uint256); function remove_liquidity(uint256 _burn_amount, uint256[3] calldata _min_amounts) external; function calc_token_amount(uint256[3] calldata _amounts, bool _is_deposit) external view returns (uint256); } interface ICurvePool4 is ICurvePool { function add_liquidity(uint256[4] calldata _amounts, uint256 _min_mint_amount) external returns (uint256); function remove_liquidity(uint256 _burn_amount, uint256[4] calldata _min_amounts) external; function calc_token_amount(uint256[4] calldata _amounts, bool _is_deposit) external view returns (uint256); } interface ICurvePoolNg { function N_COINS() external view returns (uint256); function add_liquidity(uint256[] calldata amounts, uint256 min_mint_amount) external returns (uint256); function remove_liquidity(uint256 burn_amount, uint256[] calldata min_amounts) external; function calc_token_amount(uint256[] calldata amounts, bool is_deposit) external view returns (uint256); } interface IDepositToken { function emissionId() external view returns (uint256); function lpToken() external view returns (address); function deposit(address receiver, uint256 amount) external returns (bool); function withdraw(address receiver, uint256 amount) external returns (bool); } /** @title PRISMA Curve Deposit Zap @notice Deposits tokens into Curve and stakes LP tokens into Curve/Convex via Prisma @dev Integrating Curve is difficult because of a lack of standard interfaces. This zap appears to work today, but there is no guarantee it will work tomorrow. */ contract CurveDepositZap is Ownable { using SafeERC20 for IERC20; struct CurvePool { address pool; bool isMetapool; bool isCryptoswap; bool isStableNg; address[] coins; } IPrismaVault public immutable vault; mapping(address lpToken => CurvePool) poolData; mapping(address depositToken => address lpToken) depositTokenToLpToken; event PoolAdded(address pool, address lpToken, bool isMetapool, bool isCryptoswap, address[] coins); event DepositTokenRegistered(address depositToken, address pool); constructor(IPrismaVault _vault, address[2][] memory _basePools) { vault = _vault; for (uint i = 0; i < _basePools.length; i++) { addCurvePool(_basePools[i][0], _basePools[i][1]); } } /** @notice Get an array of coins used in `depositToken` @dev Arrays for `amounts` or `minReceived` correspond to the returned coins */ function getCoins(address depositToken) public view returns (address[] memory coins) { (, CurvePool memory pool) = _getDepositTokenData(depositToken); if (!pool.isMetapool) { return pool.coins; } CurvePool memory basePool = poolData[pool.coins[1]]; coins = new address[](basePool.coins.length + 1); coins[0] = pool.coins[0]; for (uint i = 1; i < coins.length; i++) { coins[i] = basePool.coins[i - 1]; } return coins; } /** @notice Get the expected amount of LP tokens returned when adding liquidity to `depositToken` @dev Used to calculate `minReceived` when calling `addLiquidity` */ function getAddLiquidityReceived(address depositToken, uint256[] memory amounts) external view returns (uint256) { (, CurvePool memory pool) = _getDepositTokenData(depositToken); if (pool.isMetapool) { CurvePool memory basePool = poolData[pool.coins[1]]; require(amounts.length == basePool.coins.length + 1, "Incorrect amounts.length"); bool isBaseDeposit; for (uint i = 1; i < amounts.length; i++) { if (amounts[i] > 0) { isBaseDeposit = true; break; } } if (isBaseDeposit) { amounts[1] = _calcTokenAmount(basePool, 1, amounts); } else { amounts[1] = 0; } } else { require(amounts.length == pool.coins.length, "Incorrect amounts.length"); } return _calcTokenAmount(pool, 0, amounts); } function _calcTokenAmount( CurvePool memory pool, uint256 i, uint256[] memory amounts ) internal view returns (uint256) { uint256 numCoins = pool.coins.length; if (pool.isStableNg) { return ICurvePoolNg(pool.pool).calc_token_amount(amounts, true); } if (numCoins == 2) { if (pool.isCryptoswap) { return ICurvePoolV2(pool.pool).calc_token_amount([amounts[i], amounts[i + 1]]); } else { return ICurvePool2(pool.pool).calc_token_amount([amounts[i], amounts[i + 1]], true); } } if (numCoins == 3) { return ICurvePool3(pool.pool).calc_token_amount([amounts[i], amounts[i + 1], amounts[i + 2]], true); } if (numCoins == 4) { return ICurvePool4(pool.pool).calc_token_amount( [amounts[i], amounts[i + 1], amounts[i + 2], amounts[i + 3]], true ); } // should be impossible to get here revert(); } /** @notice Get the expected amount of coins returned when removing liquidity from `depositToken` @dev Used to calculate `minReceived` when calling `removeLiquidity` */ function getRemoveLiquidityReceived( address depositToken, uint256 burnAmount ) external view returns (uint256[] memory received) { (address lpToken, CurvePool memory pool) = _getDepositTokenData(depositToken); if (pool.isMetapool) { CurvePool memory basePool = poolData[pool.coins[1]]; uint256 length = basePool.coins.length; received = new uint256[](length + 1); uint256 supply = IERC20(lpToken).totalSupply(); received[0] = (ICurvePool(pool.pool).balances(0) * burnAmount) / supply; burnAmount = (ICurvePool(pool.pool).balances(1) * burnAmount) / supply; supply = IERC20(pool.coins[1]).totalSupply(); for (uint i = 0; i < length; i++) { received[i + 1] = (ICurvePool(basePool.pool).balances(i) * burnAmount) / supply; } return received; } else { uint256 length = pool.coins.length; received = new uint256[](length); uint256 supply = IERC20(lpToken).totalSupply(); for (uint i = 0; i < length; i++) { received[i] = (ICurvePool(pool.pool).balances(i) * burnAmount) / supply; } return received; } } /** @notice Get the expected amount of coins returned when removing liquidity one-sided from `depositToken` @dev Used to calculate `minReceived` when calling `removeLiquidityOneCoin` */ function getRemoveLiquidityOneCoinReceived( address depositToken, uint256 burnAmount, uint256 index ) external view returns (uint256) { (, CurvePool memory pool) = _getDepositTokenData(depositToken); if (index != 0 && pool.isMetapool) { if (pool.isCryptoswap) { burnAmount = ICurvePoolV2(pool.pool).calc_withdraw_one_coin(burnAmount, 1); } else { burnAmount = ICurvePool(pool.pool).calc_withdraw_one_coin(burnAmount, 1); } pool = poolData[pool.coins[1]]; index -= 1; } if (pool.isCryptoswap) { return ICurvePoolV2(pool.pool).calc_withdraw_one_coin(burnAmount, index); } else { return ICurvePool(pool.pool).calc_withdraw_one_coin(burnAmount, int128(int256(index))); } } /** @notice For emergencies if someone accidentally sent some ERC20 tokens here */ function recoverERC20(IERC20 token, uint256 amount) external onlyOwner { token.safeTransfer(msg.sender, amount); } /** @notice Owner-only method to add data about a curve pool @dev Pools used as bases for metapools must be added this way prior to the metapool being added, otherwise things could break strangely. */ function addCurvePool(address pool, address lpToken) public onlyOwner { _addPoolData(pool, lpToken); } /** @notice Register a deposit token @dev Also called the first time liquidity is added or removed via the zap, this method is only needed to ensure the view methods work prior. */ function registerDepositToken(address depositToken) external { require(depositTokenToLpToken[depositToken] == address(0), "Already registered"); _getDepositTokenDataWrite(depositToken); } /** @dev Fetch data about the Curve pool related to `depositToken` */ function _getDepositTokenData(address depositToken) internal view returns (address lpToken, CurvePool memory pd) { lpToken = IDepositToken(depositToken).lpToken(); address pool = _getPoolFromLpToken(lpToken); return (lpToken, _getPoolData(pool)); } /** @dev Non-view version of `_getDepositTokenData`. The first call for each `depositToken` stores data locally and sets required token approvals. */ function _getDepositTokenDataWrite(address depositToken) internal returns (CurvePool memory pd) { address lpToken = depositTokenToLpToken[depositToken]; if (lpToken != address(0)) return poolData[lpToken]; lpToken = IDepositToken(depositToken).lpToken(); depositTokenToLpToken[depositToken] = lpToken; pd = poolData[lpToken]; //address pool = poolData[lpToken].pool; if (pd.pool == address(0)) { uint256 id = IDepositToken(depositToken).emissionId(); (address receiver, ) = vault.idToReceiver(id); require(receiver == depositToken, "receiver != depositToken"); pd = _addPoolData(_getPoolFromLpToken(lpToken), lpToken); } IERC20(lpToken).safeApprove(depositToken, type(uint256).max); emit DepositTokenRegistered(depositToken, pd.pool); return pd; } function _addPoolData(address pool, address lpToken) internal returns (CurvePool memory pd) { pd = _getPoolData(pool); for (uint i = 0; i < pd.coins.length; i++) { IERC20(pd.coins[i]).safeApprove(pd.pool, type(uint256).max); } poolData[lpToken] = pd; emit PoolAdded(pd.pool, lpToken, pd.isMetapool, pd.isCryptoswap, pd.coins); return pd; } function _getPoolData(address pool) internal view returns (CurvePool memory pd) { pd.pool = pool; address[] memory coins = new address[](4); uint256 i; for (; i < 4; i++) { try ICurvePool(pool).coins(i) returns (address _coin) { coins[i] = _coin; } catch { assembly { mstore(coins, i) } break; } } pd.coins = coins; address lastCoin = coins[i - 1]; address basePool = poolData[lastCoin].pool; if (basePool != address(0)) pd.isMetapool = true; try ICurvePoolV2(pool).gamma() returns (uint256) { pd.isCryptoswap = true; } catch { try ICurvePoolNg(pool).N_COINS() returns (uint256) { pd.isStableNg = true; } catch {} } return pd; } function _getPoolFromLpToken(address lpToken) internal view returns (address pool) { try ICurveToken(lpToken).minter() returns (address _pool) { pool = _pool; } catch { pool = lpToken; } return pool; } /** @notice Add liquidity to Curve and stake LP tokens via `depositToken` @param depositToken Address of Prisma `CurveDepositToken` or `ConvexDepositToken` deployment @param amounts Array of coin amounts to deposit into Curve @param minReceived Minimum amount of Curve LP tokens received when adding liquidity @param receiver Address to deposit into Prisma on behalf of @return lpTokenAmount Amount of LP tokens deposited into `depositToken` */ function addLiquidity( address depositToken, uint256[] memory amounts, uint256 minReceived, address receiver ) external returns (uint256 lpTokenAmount) { CurvePool memory pool = _getDepositTokenDataWrite(depositToken); if (amounts[0] > 0) IERC20(pool.coins[0]).safeTransferFrom(msg.sender, address(this), amounts[0]); if (pool.isMetapool) { CurvePool memory basePool = poolData[pool.coins[1]]; uint256 length = basePool.coins.length + 1; require(amounts.length == length, "Incorrect amounts.length"); bool isBaseDeposit; for (uint i = 1; i < length; i++) { if (amounts[i] > 0) { isBaseDeposit = true; IERC20(basePool.coins[i - 1]).safeTransferFrom(msg.sender, address(this), amounts[i]); } } if (isBaseDeposit) { amounts[1] = _addLiquidity(basePool, length - 1, 1, amounts, 0); } else { amounts[1] = 0; } } else { uint256 length = pool.coins.length; require(amounts.length == length, "Incorrect amounts.length"); for (uint i = 1; i < length; i++) { if (amounts[i] > 0) { IERC20(pool.coins[i]).safeTransferFrom(msg.sender, address(this), amounts[i]); } } } lpTokenAmount = _addLiquidity(pool, pool.coins.length, 0, amounts, minReceived); IDepositToken(depositToken).deposit(receiver, lpTokenAmount); return lpTokenAmount; } function _addLiquidity( CurvePool memory pool, uint256 numCoins, uint256 i, uint256[] memory amounts, uint256 minReceived ) internal returns (uint256) { if (pool.isStableNg) { return ICurvePoolNg(pool.pool).add_liquidity(amounts, minReceived); } if (numCoins == 2) { return ICurvePool2(pool.pool).add_liquidity([amounts[i], amounts[i + 1]], minReceived); } if (numCoins == 3) { return ICurvePool3(pool.pool).add_liquidity([amounts[i], amounts[i + 1], amounts[i + 2]], minReceived); } if (numCoins == 4) { return ICurvePool4(pool.pool).add_liquidity( [amounts[i], amounts[i + 1], amounts[i + 2], amounts[i + 3]], minReceived ); } // should be impossible to get here revert(); } /** @notice Withdraw LP tokens from `depositToken` and remove liquidity from Curve @param depositToken Address of Prisma `CurveDepositToken` or `ConvexDepositToken` deployment @param burnAmount Amount of Curve LP tokens to withdraw @param minReceived Minimum coin amounts received when removing liquidity @param receiver Address to send withdrawn coins to @return received Array of withdrawn coin amounts */ function removeLiquidity( address depositToken, uint256 burnAmount, uint256[] calldata minReceived, address receiver ) external returns (uint256[] memory received) { CurvePool memory pool = _getDepositTokenDataWrite(depositToken); IERC20(depositToken).transferFrom(msg.sender, address(this), burnAmount); IDepositToken(depositToken).withdraw(address(this), burnAmount); if (pool.isMetapool) return _removeLiquidityMeta(pool, burnAmount, minReceived, receiver); else return _removeLiquidityPlain(pool, burnAmount, minReceived, receiver); } function _removeLiquidityMeta( CurvePool memory pool, uint256 burnAmount, uint256[] calldata minReceived, address receiver ) internal returns (uint256[] memory) { CurvePool memory basePool = poolData[pool.coins[1]]; uint256 length = basePool.coins.length; require(minReceived.length == length + 1, "Incorrect minReceived.length"); uint256[] memory received = new uint256[](length + 1); _removeLiquidity(pool, 2, burnAmount); IERC20 coin = IERC20(pool.coins[0]); uint256 amount = coin.balanceOf(address(this)); require(amount >= minReceived[0], "Slippage"); coin.safeTransfer(receiver, amount); received[0] = amount; burnAmount = IERC20(pool.coins[1]).balanceOf(address(this)); _removeLiquidity(basePool, length, burnAmount); for (uint i = 0; i < length; i++) { coin = IERC20(basePool.coins[i]); amount = coin.balanceOf(address(this)); require(amount >= minReceived[i + 1], "Slippage"); coin.safeTransfer(receiver, amount); received[i + 1] = amount; } return received; } function _removeLiquidityPlain( CurvePool memory pool, uint256 burnAmount, uint256[] calldata minReceived, address receiver ) internal returns (uint256[] memory) { uint length = pool.coins.length; require(minReceived.length == length, "Incorrect minReceived.length"); uint256[] memory received = new uint256[](length); _removeLiquidity(pool, length, burnAmount); for (uint i = 0; i < length; i++) { IERC20 coin = IERC20(pool.coins[i]); uint256 amount = coin.balanceOf(address(this)); require(amount >= minReceived[i], "Slippage"); coin.safeTransfer(receiver, amount); received[i] = amount; } return received; } function _removeLiquidity(CurvePool memory pool, uint256 numCoins, uint256 burnAmount) internal { if (pool.isStableNg) { ICurvePoolNg(pool.pool).remove_liquidity(burnAmount, new uint256[](numCoins)); } else if (numCoins == 2) { ICurvePool2(pool.pool).remove_liquidity(burnAmount, [uint256(0), uint256(0)]); } else if (numCoins == 3) { ICurvePool3(pool.pool).remove_liquidity(burnAmount, [uint256(0), uint256(0), uint256(0)]); } else if (numCoins == 4) { ICurvePool4(pool.pool).remove_liquidity(burnAmount, [uint256(0), uint256(0), uint256(0), uint256(0)]); } } /** @notice Withdraw LP tokens from `depositToken` and remove liquidity from Curve single-sided @param depositToken Address of Prisma `CurveDepositToken` or `ConvexDepositToken` deployment @param burnAmount Amount of Curve LP tokens to withdraw @param index Index of coin to withdraw (from `getCoins`) @param minReceived Minimum amount received when removing liquidity @param receiver Address to send withdrawn coins to @return received Amount of coin received in withdrawal */ function removeLiquidityOneCoin( address depositToken, uint256 burnAmount, uint256 index, uint256 minReceived, address receiver ) external returns (uint256) { CurvePool memory pool = _getDepositTokenDataWrite(depositToken); IERC20(depositToken).transferFrom(msg.sender, address(this), burnAmount); IDepositToken(depositToken).withdraw(address(this), burnAmount); if (index != 0 && pool.isMetapool) { if (pool.isCryptoswap) { burnAmount = ICurvePoolV2(pool.pool).remove_liquidity_one_coin(burnAmount, 1, 0); } else { burnAmount = ICurvePool(pool.pool).remove_liquidity_one_coin(burnAmount, 1, 0); } pool = poolData[pool.coins[1]]; index -= 1; } uint256 amount; if (pool.isCryptoswap) { amount = ICurvePoolV2(pool.pool).remove_liquidity_one_coin(burnAmount, index, minReceived); } else { amount = ICurvePool(pool.pool).remove_liquidity_one_coin(burnAmount, int128(int256(index)), minReceived); } IERC20(pool.coins[index]).safeTransfer(receiver, amount); return amount; } /** @notice Withdraw from `srcToken` and deposit to `destToken` @dev `srcToken` and `destToken` must both use the same LP token @param srcToken Address of `CurveDepositToken` or `ConvexDepositToken` to withdraw from @param destToken Address of `CurveDepositToken` or `ConvexDepositToken` to deposit to @param amount Quantity of tokens to transfer @param receiver Address to send `destToken` balance to */ function zapBetweenCurveConvex( address srcToken, address destToken, uint256 amount, address receiver ) external returns (bool) { address srcPool = _getDepositTokenDataWrite(srcToken).pool; address destPool = _getDepositTokenDataWrite(destToken).pool; require(srcPool == destPool, "Pools use different LP tokens"); IERC20(srcToken).transferFrom(msg.sender, address(this), amount); IDepositToken(srcToken).withdraw(address(this), amount); IDepositToken(destToken).deposit(receiver, amount); return true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "IERC20.sol"; import "IERC20Permit.sol"; import "Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IPrismaVault { struct InitialAllowance { address receiver; uint256 amount; } event BoostCalculatorSet(address boostCalculator); event BoostDelegationSet(address indexed boostDelegate, bool isEnabled, uint256 feePct, address callback); event EmissionScheduleSet(address emissionScheduler); event IncreasedAllocation(address indexed receiver, uint256 increasedAmount); event NewReceiverRegistered(address receiver, uint256 id); event ReceiverIsActiveStatusModified(uint256 indexed id, bool isActive); event UnallocatedSupplyIncreased(uint256 increasedAmount, uint256 unallocatedTotal); event UnallocatedSupplyReduced(uint256 reducedAmount, uint256 unallocatedTotal); function allocateNewEmissions(uint256 id) external returns (uint256); function batchClaimRewards( address receiver, address boostDelegate, address[] calldata rewardContracts, uint256 maxFeePct ) external returns (bool); function increaseUnallocatedSupply(uint256 amount) external returns (bool); function registerReceiver(address receiver, uint256 count) external returns (bool); function setBoostCalculator(address _boostCalculator) external returns (bool); function setBoostDelegationParams(bool isEnabled, uint256 feePct, address callback) external returns (bool); function setEmissionSchedule(address _emissionSchedule) external returns (bool); function setInitialParameters( address _emissionSchedule, address _boostCalculator, uint256 totalSupply, uint64 initialLockWeeks, uint128[] calldata _fixedInitialAmounts, InitialAllowance[] calldata initialAllowances ) external; function setReceiverIsActive(uint256 id, bool isActive) external returns (bool); function transferAllocatedTokens(address claimant, address receiver, uint256 amount) external returns (bool); function transferTokens(address token, address receiver, uint256 amount) external returns (bool); function PRISMA_CORE() external view returns (address); function allocated(address) external view returns (uint256); function boostCalculator() external view returns (address); function boostDelegation(address) external view returns (bool isEnabled, uint16 feePct, address callback); function claimableRewardAfterBoost( address account, address receiver, address boostDelegate, address rewardContract ) external view returns (uint256 adjustedAmount, uint256 feeToDelegate); function emissionSchedule() external view returns (address); function getClaimableWithBoost(address claimant) external view returns (uint256 maxBoosted, uint256 boosted); function getWeek() external view returns (uint256 week); function guardian() external view returns (address); function idToReceiver(uint256) external view returns (address account, bool isActive); function lockWeeks() external view returns (uint64); function locker() external view returns (address); function owner() external view returns (address); function claimableBoostDelegationFees(address claimant) external view returns (uint256 amount); function prismaToken() external view returns (address); function receiverUpdatedWeek(uint256) external view returns (uint16); function totalUpdateWeek() external view returns (uint64); function unallocatedTotal() external view returns (uint128); function voter() external view returns (address); function weeklyEmissions(uint256) external view returns (uint128); }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "CurveDepositZap.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IPrismaVault","name":"_vault","type":"address"},{"internalType":"address[2][]","name":"_basePools","type":"address[2][]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositToken","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"}],"name":"DepositTokenRegistered","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":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"bool","name":"isMetapool","type":"bool"},{"indexed":false,"internalType":"bool","name":"isCryptoswap","type":"bool"},{"indexed":false,"internalType":"address[]","name":"coins","type":"address[]"}],"name":"PoolAdded","type":"event"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"lpToken","type":"address"}],"name":"addCurvePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minReceived","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"lpTokenAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"getAddLiquidityReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"}],"name":"getCoins","outputs":[{"internalType":"address[]","name":"coins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRemoveLiquidityOneCoinReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"getRemoveLiquidityReceived","outputs":[{"internalType":"uint256[]","name":"received","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"}],"name":"registerDepositToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"internalType":"uint256[]","name":"minReceived","type":"uint256[]"},{"internalType":"address","name":"receiver","type":"address"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256[]","name":"received","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositToken","type":"address"},{"internalType":"uint256","name":"burnAmount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"minReceived","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"removeLiquidityOneCoin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IPrismaVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"destToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"zapBetweenCurveConvex","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162004ca238038062004ca2833981016040819052620000349162000a8c565b6200003f33620000ef565b6001600160a01b03821660805260005b8151811015620000e657620000d182828151811062000072576200007262000baf565b60200260200101516000600281106200008f576200008f62000baf565b6020020151838381518110620000a957620000a962000baf565b6020026020010151600160028110620000c657620000c662000baf565b60200201516200013f565b80620000dd8162000bdb565b9150506200004f565b50505062000d62565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001496200015a565b620001558282620001bc565b505050565b6000546001600160a01b03163314620001ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6040805160a0810182526000808252602082018190529181018290526060808201929092526080810191909152620001f48362000352565b905060005b81608001515181101562000262576200024d8260000151600019846080015184815181106200022c576200022c62000baf565b60200260200101516001600160a01b0316620005bc60201b9092919060201c565b80620002598162000bdb565b915050620001f9565b506001600160a01b0380831660009081526001602081815260409283902085518154838801519588015160608901511515600160b01b0260ff60b01b19911515600160a81b029190911661ffff60a81b19971515600160a01b026001600160a81b0319909316939098169290921717949094169490941792909217835560808401518051859493620002f99385019201906200097e565b505081516020830151604080850151608086015191517fc9164a717f6e0d393a454183fde305bc87c2638940bbadf9e6cf65ee5ac9a35f9550620003439493889390929162000bf7565b60405180910390a15b92915050565b6040805160a08082018352600060208301819052828401819052606080840182905260808401526001600160a01b03851683528351600480825292810190945291929081602001602082028036833701905050905060005b6004811015620004725760405163c661065760e01b8152600481018290526001600160a01b0385169063c661065790602401602060405180830381865afa92505050801562000418575060408051601f3d908101601f19168201909252620004159181019062000c6e565b60015b620004265780825262000472565b808383815181106200043c576200043c62000baf565b60200260200101906001600160a01b031690816001600160a01b0316815250505080620004698162000bdb565b915050620003aa565b608083018290526000826200048960018462000c95565b815181106200049c576200049c62000baf565b6020908102919091018101516001600160a01b0380821660009081526001909352604090922054909250168015620004d657600160208601525b856001600160a01b031663b13739296040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562000533575060408051601f3d908101601f19168201909252620005309181019062000cab565b60015b620005aa57856001600160a01b031663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801562000595575060408051601f3d908101601f19168201909252620005929181019062000cab565b60015b15620005a45750600160608601525b620005b3565b50600160408601525b50505050919050565b8015806200063a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801562000612573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000638919062000cab565b155b620006ae5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401620001b1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620001559185916200070616565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000755906001600160a01b038516908490620007da565b90508051600014806200077957508080602001905181019062000779919062000cc5565b620001555760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620001b1565b6060620007eb8484600085620007f3565b949350505050565b606082471015620008565760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620001b1565b600080866001600160a01b0316858760405162000874919062000d0f565b60006040518083038185875af1925050503d8060008114620008b3576040519150601f19603f3d011682016040523d82523d6000602084013e620008b8565b606091505b509092509050620008cc87838387620008d7565b979650505050505050565b606083156200094b57825160000362000943576001600160a01b0385163b620009435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001b1565b5081620007eb565b620007eb8383815115620009625781518083602001fd5b8060405162461bcd60e51b8152600401620001b1919062000d2d565b828054828255906000526020600020908101928215620009d6579160200282015b82811115620009d657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200099f565b50620009e4929150620009e8565b5090565b5b80821115620009e45760008155600101620009e9565b6001600160a01b038116811462000a1557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171562000a535762000a5362000a18565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000a845762000a8462000a18565b604052919050565b600080604080848603121562000aa157600080fd5b835162000aae81620009ff565b602085810151919450906001600160401b038082111562000ace57600080fd5b8187019150601f888184011262000ae457600080fd5b82518281111562000af95762000af962000a18565b62000b09858260051b0162000a59565b818152858101935060069190911b84018501908a82111562000b2a57600080fd5b938501935b8185101562000b9e578a8386011262000b485760008081fd5b62000b5262000a2e565b808887018d81111562000b655760008081fd5b875b8181101562000b8b57805162000b7d81620009ff565b845292890192890162000b67565b5050855250938601939285019262000b2f565b809750505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000bf05762000bf062000bc5565b5060010190565b600060a0820160018060a01b0380891684526020818916818601528715156040860152861515606086015260a0608086015282865180855260c087019150828801945060005b8181101562000c5d57855185168352948301949183019160010162000c3d565b50909b9a5050505050505050505050565b60006020828403121562000c8157600080fd5b815162000c8e81620009ff565b9392505050565b818103818111156200034c576200034c62000bc5565b60006020828403121562000cbe57600080fd5b5051919050565b60006020828403121562000cd857600080fd5b8151801515811462000c8e57600080fd5b60005b8381101562000d0657818101518382015260200162000cec565b50506000910152565b6000825162000d2381846020870162000ce9565b9190910192915050565b602081526000825180602084015262000d4e81604085016020870162000ce9565b601f01601f19169190910160400192915050565b608051613f1d62000d856000396000818161024f0152611f0e0152613f1d6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638980f11f11610097578063c093506711610066578063c093506714610211578063e22ff8e014610224578063f2fde38b14610237578063fbfa77cf1461024a57600080fd5b80638980f11f146101a65780638da5cb5b146101b95780639f5203a8146101de578063b752c763146101f157600080fd5b80633cde7449116100d35780633cde7449146101635780636dc9f9d814610176578063703fd9fd14610189578063715018a61461019c57600080fd5b806310ef1d5a146100fa5780631e2b31f11461012057806337b83c9d14610140575b600080fd5b61010d6101083660046136dd565b610271565b6040519081526020015b60405180910390f35b61013361012e366004613712565b61054d565b6040516101179190613779565b61015361014e36600461378c565b610b06565b6040519015158152602001610117565b6101336101713660046137df565b610cec565b61010d610184366004613886565b610e17565b61010d610197366004613974565b61127b565b6101a4611652565b005b6101a46101b4366004613712565b611666565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610117565b61010d6101ec3660046139d5565b611686565b6102046101ff366004613a25565b611895565b6040516101179190613a7b565b6101a461021f366004613a25565b611ab9565b6101a4610232366004613a8e565b611b1f565b6101a4610245366004613a25565b611b36565b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b60008061027d85611baf565b9150508215801590610290575080602001515b15610486578060400151156103195780516040516327d8462f60e11b815260048101869052600160248201526001600160a01b0390911690634fb08c5e90604401602060405180830381865afa1580156102ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103129190613ac7565b935061038f565b805160405163cc2b27d760e01b815260048101869052600160248201526001600160a01b039091169063cc2b27d790604401602060405180830381865afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190613ac7565b93505b6001600082608001516001815181106103aa576103aa613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561046b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161044d575b50505050508152505090506001836104839190613b0c565b92505b80604001511561050c5780516040516327d8462f60e11b815260048101869052602481018590526001600160a01b0390911690634fb08c5e906044015b602060405180830381865afa1580156104e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105049190613ac7565b915050610546565b805160405163cc2b27d760e01b815260048101869052600f85900b60248201526001600160a01b039091169063cc2b27d7906044016104c3565b9392505050565b606060008061055b85611baf565b9150915080602001511561098b57600060016000836080015160018151811061058657610586613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561064757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610629575b50505091909252505050608081015151909150610665816001613b1f565b67ffffffffffffffff81111561067d5761067d6138ce565b6040519080825280602002602001820160405280156106a6578160200160208202803683370190505b5094506000846001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070d9190613ac7565b8451604051634903b0d160e01b815260006004820152919250829189916001600160a01b031690634903b0d190602401602060405180830381865afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190613ac7565b6107889190613b32565b6107929190613b49565b866000815181106107a5576107a5613ae0565b60209081029190910101528351604051634903b0d160e01b815260016004820152829189916001600160a01b0390911690634903b0d190602401602060405180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190613ac7565b61082a9190613b32565b6108349190613b49565b9650836080015160018151811061084d5761084d613ae0565b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190613ac7565b905060005b82811015610980578351604051634903b0d160e01b81526004810183905283918a916001600160a01b0390911690634903b0d190602401602060405180830381865afa15801561090f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109339190613ac7565b61093d9190613b32565b6109479190613b49565b87610953836001613b1f565b8151811061096357610963613ae0565b60209081029190910101528061097881613b6b565b9150506108bb565b505050505050610b00565b6080810151518067ffffffffffffffff8111156109aa576109aa6138ce565b6040519080825280602002602001820160405280156109d3578160200160208202803683370190505b5093506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a9190613ac7565b905060005b82811015610afa578351604051634903b0d160e01b815260048101839052839189916001600160a01b0390911690634903b0d190602401602060405180830381865afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190613ac7565b610ac19190613b32565b610acb9190613b49565b868281518110610add57610add613ae0565b602090810291909101015280610af281613b6b565b915050610a3f565b50505050505b92915050565b600080610b1286611c3e565b5190506000610b2086611c3e565b5190506001600160a01b0382811690821614610b835760405162461bcd60e51b815260206004820152601d60248201527f506f6f6c732075736520646966666572656e74204c5020746f6b656e7300000060448201526064015b60405180910390fd5b6040516323b872dd60e01b81526001600160a01b038816906323b872dd90610bb390339030908a90600401613b84565b6020604051808303816000875af1158015610bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf69190613bb8565b5060405163f3fef3a360e01b8152306004820152602481018690526001600160a01b0388169063f3fef3a3906044016020604051808303816000875af1158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613bb8565b506040516311f9fbc960e21b81526001600160a01b038581166004830152602482018790528716906347e7ef24906044016020604051808303816000875af1158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc9190613bb8565b506001925050505b949350505050565b60606000610cf987611c3e565b6040516323b872dd60e01b81529091506001600160a01b038816906323b872dd90610d2c90339030908b90600401613b84565b6020604051808303816000875af1158015610d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6f9190613bb8565b5060405163f3fef3a360e01b8152306004820152602481018790526001600160a01b0388169063f3fef3a3906044016020604051808303816000875af1158015610dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de19190613bb8565b50806020015115610e0157610df98187878787612055565b915050610e0e565b610df981878787876124d0565b95945050505050565b600080610e2387611c3e565b6040516323b872dd60e01b81529091506001600160a01b038816906323b872dd90610e5690339030908b90600401613b84565b6020604051808303816000875af1158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e999190613bb8565b5060405163f3fef3a360e01b8152306004820152602481018790526001600160a01b0388169063f3fef3a3906044016020604051808303816000875af1158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190613bb8565b508415801590610f1c575080602001515b1561112457806040015115610fae57805160405163f1dc3cc960e01b81526004810188905260016024820152600060448201526001600160a01b039091169063f1dc3cc9906064016020604051808303816000875af1158015610f83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa79190613ac7565b955061102d565b8051604051630d2680e960e11b81526004810188905260016024820152600060448201526001600160a01b0390911690631a4d01d2906064016020604051808303816000875af1158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a9190613ac7565b95505b60016000826080015160018151811061104857611048613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561110957602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110eb575b50505050508152505090506001856111219190613b0c565b94505b60008160400151156111b357815160405163f1dc3cc960e01b81526004810189905260248101889052604481018790526001600160a01b039091169063f1dc3cc9906064016020604051808303816000875af1158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190613ac7565b9050611235565b8151604051630d2680e960e11b815260048101899052600f88900b6024820152604481018790526001600160a01b0390911690631a4d01d2906064016020604051808303816000875af115801561120e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112329190613ac7565b90505b61127084828460800151898151811061125057611250613ae0565b60200260200101516001600160a01b03166126a49092919063ffffffff16565b979650505050505050565b60008061128786611c3e565b905060008560008151811061129e5761129e613ae0565b60200260200101511115611304576113043330876000815181106112c4576112c4613ae0565b602002602001015184608001516000815181106112e3576112e3613ae0565b60200260200101516001600160a01b0316612707909392919063ffffffff16565b80602001511561152157600060016000836080015160018151811061132b5761132b613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b90950490941615156060850152600181018054845181850281018501909552808552919360808601939092908301828280156113ec57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113ce575b50505050508152505090506000816080015151600161140b9190613b1f565b90508087511461142d5760405162461bcd60e51b8152600401610b7a90613bd3565b600060015b828110156114b357600089828151811061144e5761144e613ae0565b602002602001015111156114a157600191506114a133308b848151811061147757611477613ae0565b602002602001015187608001516001866114919190613b0c565b815181106112e3576112e3613ae0565b806114ab81613b6b565b915050611432565b5080156114f7576114d3836114c9600185613b0c565b60018b600061272e565b886001815181106114e6576114e6613ae0565b602002602001018181525050611519565b60008860018151811061150c5761150c613ae0565b6020026020010181815250505b5050506115be565b608081015151855181146115475760405162461bcd60e51b8152600401610b7a90613bd3565b60015b818110156115bb57600087828151811061156657611566613ae0565b602002602001015111156115a9576115a9333089848151811061158b5761158b613ae0565b6020026020010151866080015185815181106112e3576112e3613ae0565b806115b381613b6b565b91505061154a565b50505b6115d1818260800151516000888861272e565b6040516311f9fbc960e21b81526001600160a01b03858116600483015260248201839052919350908716906347e7ef24906044016020604051808303816000875af1158015611624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116489190613bb8565b5050949350505050565b61165a6129da565b6116646000612a34565b565b61166e6129da565b6116826001600160a01b03831633836126a4565b5050565b60008061169284611baf565b9150508060200151156118645760006001600083608001516001815181106116bc576116bc613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561177d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161175f575b5050505050815250509050806080015151600161179a9190613b1f565b8451146117b95760405162461bcd60e51b8152600401610b7a90613bd3565b600060015b85518110156118045760008682815181106117db576117db613ae0565b602002602001015111156117f25760019150611804565b806117fc81613b6b565b9150506117be565b50801561183b5761181782600187612a84565b8560018151811061182a5761182a613ae0565b60200260200101818152505061185d565b60008560018151811061185057611850613ae0565b6020026020010181815250505b5050611889565b8060800151518351146118895760405162461bcd60e51b8152600401610b7a90613bd3565b610ce481600085612a84565b606060006118a283611baf565b91505080602001516118b8576080015192915050565b60006001600083608001516001815181106118d5576118d5613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561199657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611978575b505050505081525050905080608001515160016119b39190613b1f565b67ffffffffffffffff8111156119cb576119cb6138ce565b6040519080825280602002602001820160405280156119f4578160200160208202803683370190505b5092508160800151600081518110611a0e57611a0e613ae0565b602002602001015183600081518110611a2957611a29613ae0565b6001600160a01b039092166020928302919091019091015260015b8351811015611ab1576080820151611a5d600183613b0c565b81518110611a6d57611a6d613ae0565b6020026020010151848281518110611a8757611a87613ae0565b6001600160a01b039092166020928302919091019091015280611aa981613b6b565b915050611a44565b505050919050565b6001600160a01b038181166000908152600260205260409020541615611b165760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c9959da5cdd195c995960721b6044820152606401610b7a565b61168281611c3e565b611b276129da565b611b318282612d7e565b505050565b611b3e6129da565b6001600160a01b038116611ba35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7a565b611bac81612a34565b50565b6000611bb961361e565b826001600160a01b0316635fcbd2856040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1b9190613c0a565b91506000611c2883612edf565b905082611c3482612f4b565b9250925050915091565b611c4661361e565b6001600160a01b03808316600090815260026020526040902054168015611d2c576001600160a01b03808216600090815260016020818152604092839020835160a0810185528154958616815260ff600160a01b87048116151582850152600160a81b87048116151582870152600160b01b909604909516151560608601529182018054845181840281018401909552808552929360808601939092830182828015611d1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cfd575b505050505081525050915050919050565b826001600160a01b0316635fcbd2856040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8e9190613c0a565b6001600160a01b03808516600090815260026020908152604080832080548587166001600160a01b031990911681179091558352600180835292819020815160a0810183528154958616815260ff600160a01b87048116151582860152600160a81b87048116151582850152600160b01b9096049095161515606086015292830180548251818502810185019093528083529596509394929360808601939192909190830182828015611e6a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e4c575b5050509190925250508151919350506001600160a01b0316611ff3576000836001600160a01b031663476363716040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea9190613ac7565b6040516372361ea760e11b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e46c3d4e906024016040805180830381865afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190613c27565b509050846001600160a01b0316816001600160a01b031614611fdc5760405162461bcd60e51b815260206004820152601860248201527f726563656976657220213d206465706f736974546f6b656e00000000000000006044820152606401610b7a565b611fee611fe884612edf565b84612d7e565b935050505b6120096001600160a01b0382168460001961317c565b8151604080516001600160a01b03808716825290921660208301527fa2678919b4133750817a8e3d194f50c08ef49a9ffef59260767ab68a972e4f72910160405180910390a150919050565b6060600060016000886080015160018151811061207457612074613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561213557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612117575b50505091909252505050608081015151909150612153816001613b1f565b85146121a15760405162461bcd60e51b815260206004820152601c60248201527f496e636f7272656374206d696e52656365697665642e6c656e677468000000006044820152606401610b7a565b60006121ae826001613b1f565b67ffffffffffffffff8111156121c6576121c66138ce565b6040519080825280602002602001820160405280156121ef578160200160208202803683370190505b5090506121fe8960028a613291565b6000896080015160008151811061221757612217613ae0565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561226c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122909190613ac7565b9050888860008181106122a5576122a5613ae0565b905060200201358110156122cb5760405162461bcd60e51b8152600401610b7a90613c5c565b6122df6001600160a01b03831688836126a4565b80836000815181106122f3576122f3613ae0565b6020026020010181815250508a6080015160018151811061231657612316613ae0565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238a9190613ac7565b995061239785858c613291565b60005b848110156124c057856080015181815181106123b8576123b8613ae0565b60209081029190910101516040516370a0823160e01b81523060048201529093506001600160a01b038416906370a0823190602401602060405180830381865afa15801561240a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242e9190613ac7565b9150898961243d836001613b1f565b81811061244c5761244c613ae0565b905060200201358210156124725760405162461bcd60e51b8152600401610b7a90613c5c565b6124866001600160a01b03841689846126a4565b8184612493836001613b1f565b815181106124a3576124a3613ae0565b6020908102919091010152806124b881613b6b565b91505061239a565b50919a9950505050505050505050565b6080850151516060908381146125285760405162461bcd60e51b815260206004820152601c60248201527f496e636f7272656374206d696e52656365697665642e6c656e677468000000006044820152606401610b7a565b60008167ffffffffffffffff811115612543576125436138ce565b60405190808252806020026020018201604052801561256c578160200160208202803683370190505b50905061257a888389613291565b60005b828110156126985760008960800151828151811061259d5761259d613ae0565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156125f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126169190613ac7565b905088888481811061262a5761262a613ae0565b905060200201358110156126505760405162461bcd60e51b8152600401610b7a90613c5c565b6126646001600160a01b03831688836126a4565b8084848151811061267757612677613ae0565b6020026020010181815250505050808061269090613b6b565b91505061257d565b50979650505050505050565b6040516001600160a01b038316602482015260448101829052611b3190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613436565b612728846323b872dd60e01b8585856040516024016126d093929190613b84565b50505050565b60008560600151156127b5578551604051635b96faef60e11b81526001600160a01b039091169063b72df5de9061276b9086908690600401613c7e565b6020604051808303816000875af115801561278a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ae9190613ac7565b9050610e0e565b846002036128415785600001516001600160a01b0316630b4c7e4d60405180604001604052808688815181106127ed576127ed613ae0565b60200260200101518152602001868860016128089190613b1f565b8151811061281857612818613ae0565b6020026020010151815250846040518363ffffffff1660e01b815260040161276b929190613cc3565b846003036128f85785600001516001600160a01b0316634515cef3604051806060016040528086888151811061287957612879613ae0565b60200260200101518152602001868860016128949190613b1f565b815181106128a4576128a4613ae0565b60200260200101518152602001868860026128bf9190613b1f565b815181106128cf576128cf613ae0565b6020026020010151815250846040518363ffffffff1660e01b815260040161276b929190613d01565b846004036100f55785600001516001600160a01b031663029b2f34604051806080016040528086888151811061293057612930613ae0565b602002602001015181526020018688600161294b9190613b1f565b8151811061295b5761295b613ae0565b60200260200101518152602001868860026129769190613b1f565b8151811061298657612986613ae0565b60200260200101518152602001868860036129a19190613b1f565b815181106129b1576129b1613ae0565b6020026020010151815250846040518363ffffffff1660e01b815260040161276b929190613d3f565b6000546001600160a01b031633146116645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60808301515160608401516000919015612aca5784516040516307b60dbb60e31b81526001600160a01b0390911690633db06dd8906104c3908690600190600401613d5a565b80600203612be357846040015115612b5e5784600001516001600160a01b0316638d8ea7276040518060400160405280868881518110612b0c57612b0c613ae0565b6020026020010151815260200186886001612b279190613b1f565b81518110612b3757612b37613ae0565b60200260200101518152506040518263ffffffff1660e01b81526004016104c39190613d7e565b84600001516001600160a01b031663ed8e84f36040518060400160405280868881518110612b8e57612b8e613ae0565b6020026020010151815260200186886001612ba99190613b1f565b81518110612bb957612bb9613ae0565b602002602001015181525060016040518363ffffffff1660e01b81526004016104c3929190613d8c565b80600303612c9b5784600001516001600160a01b0316633883e1196040518060600160405280868881518110612c1b57612c1b613ae0565b6020026020010151815260200186886001612c369190613b1f565b81518110612c4657612c46613ae0565b6020026020010151815260200186886002612c619190613b1f565b81518110612c7157612c71613ae0565b602002602001015181525060016040518363ffffffff1660e01b81526004016104c3929190613da9565b806004036100f55784600001516001600160a01b031663cf701ff76040518060800160405280868881518110612cd357612cd3613ae0565b6020026020010151815260200186886001612cee9190613b1f565b81518110612cfe57612cfe613ae0565b6020026020010151815260200186886002612d199190613b1f565b81518110612d2957612d29613ae0565b6020026020010151815260200186886003612d449190613b1f565b81518110612d5457612d54613ae0565b602002602001015181525060016040518363ffffffff1660e01b81526004016104c3929190613dc6565b612d8661361e565b612d8f83612f4b565b905060005b816080015151811015612df457612de2826000015160001984608001518481518110612dc257612dc2613ae0565b60200260200101516001600160a01b031661317c9092919063ffffffff16565b80612dec81613b6b565b915050612d94565b506001600160a01b0380831660009081526001602081815260409283902085518154838801519588015160608901511515600160b01b0260ff60b01b19911515600160a81b029190911661ffff60a81b19971515600160a01b026001600160a81b0319909316939098169290921717949094169490941792909217835560808401518051859493612e8993850192019061364e565b505081516020830151604080850151608086015191517fc9164a717f6e0d393a454183fde305bc87c2638940bbadf9e6cf65ee5ac9a35f9550612ed194938893909291613de3565b60405180910390a192915050565b6000816001600160a01b031663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612f3b575060408051601f3d908101601f19168201909252612f3891810190613c0a565b60015b612f43575090565b90505b919050565b612f5361361e565b6001600160a01b038216815260408051600480825260a082019092526000916020820160808036833701905050905060005b60048110156130415760405163c661065760e01b8152600481018290526001600160a01b0385169063c661065790602401602060405180830381865afa925050508015612fef575060408051601f3d908101601f19168201909252612fec91810190613c0a565b60015b612ffb57808252613041565b8083838151811061300e5761300e613ae0565b60200260200101906001600160a01b031690816001600160a01b031681525050508061303981613b6b565b915050612f85565b60808301829052600082613056600184613b0c565b8151811061306657613066613ae0565b6020908102919091018101516001600160a01b038082166000908152600190935260409092205490925016801561309f57600160208601525b856001600160a01b031663b13739296040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156130f9575060408051601f3d908101601f191682019092526130f691810190613ac7565b60015b61316a57856001600160a01b031663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613157575060408051601f3d908101601f1916820190925261315491810190613ac7565b60015b156131655750600160608601525b613173565b50600160408601525b50505050919050565b8015806131f65750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156131d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f49190613ac7565b155b6132615760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b7a565b6040516001600160a01b038316602482015260448101829052611b3190849063095ea7b360e01b906064016126d0565b8260600151156133435782516001600160a01b031663d40ddb8c828467ffffffffffffffff8111156132c5576132c56138ce565b6040519080825280602002602001820160405280156132ee578160200160208202803683370190505b506040518363ffffffff1660e01b815260040161330c929190613e1f565b600060405180830381600087803b15801561332657600080fd5b505af115801561333a573d6000803e3d6000fd5b50505050505050565b8160020361338d5782516040805180820182526000808252602082015290516316cd8e2760e21b81526001600160a01b0390921691635b36389c9161330c91859190600401613e38565b816003036133de5782516040805160608101825260008082526020820181905281830152905163ecb586a560e01b81526001600160a01b039092169163ecb586a59161330c91859190600401613e4c565b81600403611b315782516040805160808101825260008082526020820181905281830181905260608201529051637d49d87560e01b81526001600160a01b0390921691637d49d8759161330c91859190600401613e60565b600061348b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661350b9092919063ffffffff16565b90508051600014806134ac5750808060200190518101906134ac9190613bb8565b611b315760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b7a565b6060610ce4848460008585600080866001600160a01b031685876040516135329190613e98565b60006040518083038185875af1925050503d806000811461356f576040519150601f19603f3d011682016040523d82523d6000602084013e613574565b606091505b509150915061127087838387606083156135ef5782516000036135e8576001600160a01b0385163b6135e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b7a565b5081610ce4565b610ce483838151156136045781518083602001fd5b8060405162461bcd60e51b8152600401610b7a9190613eb4565b6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b8280548282559060005260206000209081019282156136a3579160200282015b828111156136a357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061366e565b506136af9291506136b3565b5090565b5b808211156136af57600081556001016136b4565b6001600160a01b0381168114611bac57600080fd5b6000806000606084860312156136f257600080fd5b83356136fd816136c8565b95602085013595506040909401359392505050565b6000806040838503121561372557600080fd5b8235613730816136c8565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561376e57815187529582019590820190600101613752565b509495945050505050565b602081526000610546602083018461373e565b600080600080608085870312156137a257600080fd5b84356137ad816136c8565b935060208501356137bd816136c8565b92506040850135915060608501356137d4816136c8565b939692955090935050565b6000806000806000608086880312156137f757600080fd5b8535613802816136c8565b945060208601359350604086013567ffffffffffffffff8082111561382657600080fd5b818801915088601f83011261383a57600080fd5b81358181111561384957600080fd5b8960208260051b850101111561385e57600080fd5b6020830195508094505050506060860135613878816136c8565b809150509295509295909350565b600080600080600060a0868803121561389e57600080fd5b85356138a9816136c8565b94506020860135935060408601359250606086013591506080860135613878816136c8565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126138f557600080fd5b8135602067ffffffffffffffff80831115613912576139126138ce565b8260051b604051601f19603f83011681018181108482111715613937576139376138ce565b60405293845285810183019383810192508785111561395557600080fd5b83870191505b848210156112705781358352918301919083019061395b565b6000806000806080858703121561398a57600080fd5b8435613995816136c8565b9350602085013567ffffffffffffffff8111156139b157600080fd5b6139bd878288016138e4565b9350506040850135915060608501356137d4816136c8565b600080604083850312156139e857600080fd5b82356139f3816136c8565b9150602083013567ffffffffffffffff811115613a0f57600080fd5b613a1b858286016138e4565b9150509250929050565b600060208284031215613a3757600080fd5b8135610546816136c8565b600081518084526020808501945080840160005b8381101561376e5781516001600160a01b031687529582019590820190600101613a56565b6020815260006105466020830184613a42565b60008060408385031215613aa157600080fd5b8235613aac816136c8565b91506020830135613abc816136c8565b809150509250929050565b600060208284031215613ad957600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610b0057610b00613af6565b80820180821115610b0057610b00613af6565b8082028115828204841417610b0057610b00613af6565b600082613b6657634e487b7160e01b600052601260045260246000fd5b500490565b600060018201613b7d57613b7d613af6565b5060010190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b80518015158114612f4657600080fd5b600060208284031215613bca57600080fd5b61054682613ba8565b60208082526018908201527f496e636f727265637420616d6f756e74732e6c656e6774680000000000000000604082015260600190565b600060208284031215613c1c57600080fd5b8151610546816136c8565b60008060408385031215613c3a57600080fd5b8251613c45816136c8565b9150613c5360208401613ba8565b90509250929050565b602080825260089082015267536c69707061676560c01b604082015260600190565b604081526000613c91604083018561373e565b90508260208301529392505050565b8060005b6002811015612728578151845260209384019390910190600101613ca4565b60608101613cd18285613ca0565b8260408301529392505050565b8060005b6003811015612728578151845260209384019390910190600101613ce2565b60808101613d0f8285613cde565b8260608301529392505050565b8060005b6004811015612728578151845260209384019390910190600101613d20565b60a08101613d4d8285613d1c565b8260808301529392505050565b604081526000613d6d604083018561373e565b905082151560208301529392505050565b60408101610b008284613ca0565b60608101613d9a8285613ca0565b82151560408301529392505050565b60808101613db78285613cde565b82151560608301529392505050565b60a08101613dd48285613d1c565b82151560808301529392505050565b6001600160a01b038681168252851660208201528315156040820152821515606082015260a06080820181905260009061127090830184613a42565b828152604060208201526000610ce4604083018461373e565b828152606081016105466020830184613ca0565b828152608081016105466020830184613cde565b82815260a081016105466020830184613d1c565b60005b83811015613e8f578181015183820152602001613e77565b50506000910152565b60008251613eaa818460208701613e74565b9190910192915050565b6020815260008251806020840152613ed3816040850160208701613e74565b601f01601f1916919091016040019291505056fea264697066735822122033f0fcc7d2033e5662b34e14800d061e6cac5ed24f9b1c216e741668f082095064736f6c6343000813003300000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dcef968d416a41cdac0ed8702fac8128a64241a20000000000000000000000003175df0976dfa876431c2e9ee6bc45b65d3473cc000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c70000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638980f11f11610097578063c093506711610066578063c093506714610211578063e22ff8e014610224578063f2fde38b14610237578063fbfa77cf1461024a57600080fd5b80638980f11f146101a65780638da5cb5b146101b95780639f5203a8146101de578063b752c763146101f157600080fd5b80633cde7449116100d35780633cde7449146101635780636dc9f9d814610176578063703fd9fd14610189578063715018a61461019c57600080fd5b806310ef1d5a146100fa5780631e2b31f11461012057806337b83c9d14610140575b600080fd5b61010d6101083660046136dd565b610271565b6040519081526020015b60405180910390f35b61013361012e366004613712565b61054d565b6040516101179190613779565b61015361014e36600461378c565b610b06565b6040519015158152602001610117565b6101336101713660046137df565b610cec565b61010d610184366004613886565b610e17565b61010d610197366004613974565b61127b565b6101a4611652565b005b6101a46101b4366004613712565b611666565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610117565b61010d6101ec3660046139d5565b611686565b6102046101ff366004613a25565b611895565b6040516101179190613a7b565b6101a461021f366004613a25565b611ab9565b6101a4610232366004613a8e565b611b1f565b6101a4610245366004613a25565b611b36565b6101c67f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c81565b60008061027d85611baf565b9150508215801590610290575080602001515b15610486578060400151156103195780516040516327d8462f60e11b815260048101869052600160248201526001600160a01b0390911690634fb08c5e90604401602060405180830381865afa1580156102ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103129190613ac7565b935061038f565b805160405163cc2b27d760e01b815260048101869052600160248201526001600160a01b039091169063cc2b27d790604401602060405180830381865afa158015610368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038c9190613ac7565b93505b6001600082608001516001815181106103aa576103aa613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561046b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161044d575b50505050508152505090506001836104839190613b0c565b92505b80604001511561050c5780516040516327d8462f60e11b815260048101869052602481018590526001600160a01b0390911690634fb08c5e906044015b602060405180830381865afa1580156104e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105049190613ac7565b915050610546565b805160405163cc2b27d760e01b815260048101869052600f85900b60248201526001600160a01b039091169063cc2b27d7906044016104c3565b9392505050565b606060008061055b85611baf565b9150915080602001511561098b57600060016000836080015160018151811061058657610586613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561064757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610629575b50505091909252505050608081015151909150610665816001613b1f565b67ffffffffffffffff81111561067d5761067d6138ce565b6040519080825280602002602001820160405280156106a6578160200160208202803683370190505b5094506000846001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070d9190613ac7565b8451604051634903b0d160e01b815260006004820152919250829189916001600160a01b031690634903b0d190602401602060405180830381865afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190613ac7565b6107889190613b32565b6107929190613b49565b866000815181106107a5576107a5613ae0565b60209081029190910101528351604051634903b0d160e01b815260016004820152829189916001600160a01b0390911690634903b0d190602401602060405180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190613ac7565b61082a9190613b32565b6108349190613b49565b9650836080015160018151811061084d5761084d613ae0565b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b69190613ac7565b905060005b82811015610980578351604051634903b0d160e01b81526004810183905283918a916001600160a01b0390911690634903b0d190602401602060405180830381865afa15801561090f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109339190613ac7565b61093d9190613b32565b6109479190613b49565b87610953836001613b1f565b8151811061096357610963613ae0565b60209081029190910101528061097881613b6b565b9150506108bb565b505050505050610b00565b6080810151518067ffffffffffffffff8111156109aa576109aa6138ce565b6040519080825280602002602001820160405280156109d3578160200160208202803683370190505b5093506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a9190613ac7565b905060005b82811015610afa578351604051634903b0d160e01b815260048101839052839189916001600160a01b0390911690634903b0d190602401602060405180830381865afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190613ac7565b610ac19190613b32565b610acb9190613b49565b868281518110610add57610add613ae0565b602090810291909101015280610af281613b6b565b915050610a3f565b50505050505b92915050565b600080610b1286611c3e565b5190506000610b2086611c3e565b5190506001600160a01b0382811690821614610b835760405162461bcd60e51b815260206004820152601d60248201527f506f6f6c732075736520646966666572656e74204c5020746f6b656e7300000060448201526064015b60405180910390fd5b6040516323b872dd60e01b81526001600160a01b038816906323b872dd90610bb390339030908a90600401613b84565b6020604051808303816000875af1158015610bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf69190613bb8565b5060405163f3fef3a360e01b8152306004820152602481018690526001600160a01b0388169063f3fef3a3906044016020604051808303816000875af1158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613bb8565b506040516311f9fbc960e21b81526001600160a01b038581166004830152602482018790528716906347e7ef24906044016020604051808303816000875af1158015610cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdc9190613bb8565b506001925050505b949350505050565b60606000610cf987611c3e565b6040516323b872dd60e01b81529091506001600160a01b038816906323b872dd90610d2c90339030908b90600401613b84565b6020604051808303816000875af1158015610d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6f9190613bb8565b5060405163f3fef3a360e01b8152306004820152602481018790526001600160a01b0388169063f3fef3a3906044016020604051808303816000875af1158015610dbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de19190613bb8565b50806020015115610e0157610df98187878787612055565b915050610e0e565b610df981878787876124d0565b95945050505050565b600080610e2387611c3e565b6040516323b872dd60e01b81529091506001600160a01b038816906323b872dd90610e5690339030908b90600401613b84565b6020604051808303816000875af1158015610e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e999190613bb8565b5060405163f3fef3a360e01b8152306004820152602481018790526001600160a01b0388169063f3fef3a3906044016020604051808303816000875af1158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b9190613bb8565b508415801590610f1c575080602001515b1561112457806040015115610fae57805160405163f1dc3cc960e01b81526004810188905260016024820152600060448201526001600160a01b039091169063f1dc3cc9906064016020604051808303816000875af1158015610f83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa79190613ac7565b955061102d565b8051604051630d2680e960e11b81526004810188905260016024820152600060448201526001600160a01b0390911690631a4d01d2906064016020604051808303816000875af1158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a9190613ac7565b95505b60016000826080015160018151811061104857611048613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561110957602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110eb575b50505050508152505090506001856111219190613b0c565b94505b60008160400151156111b357815160405163f1dc3cc960e01b81526004810189905260248101889052604481018790526001600160a01b039091169063f1dc3cc9906064016020604051808303816000875af1158015611188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ac9190613ac7565b9050611235565b8151604051630d2680e960e11b815260048101899052600f88900b6024820152604481018790526001600160a01b0390911690631a4d01d2906064016020604051808303816000875af115801561120e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112329190613ac7565b90505b61127084828460800151898151811061125057611250613ae0565b60200260200101516001600160a01b03166126a49092919063ffffffff16565b979650505050505050565b60008061128786611c3e565b905060008560008151811061129e5761129e613ae0565b60200260200101511115611304576113043330876000815181106112c4576112c4613ae0565b602002602001015184608001516000815181106112e3576112e3613ae0565b60200260200101516001600160a01b0316612707909392919063ffffffff16565b80602001511561152157600060016000836080015160018151811061132b5761132b613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b90950490941615156060850152600181018054845181850281018501909552808552919360808601939092908301828280156113ec57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113ce575b50505050508152505090506000816080015151600161140b9190613b1f565b90508087511461142d5760405162461bcd60e51b8152600401610b7a90613bd3565b600060015b828110156114b357600089828151811061144e5761144e613ae0565b602002602001015111156114a157600191506114a133308b848151811061147757611477613ae0565b602002602001015187608001516001866114919190613b0c565b815181106112e3576112e3613ae0565b806114ab81613b6b565b915050611432565b5080156114f7576114d3836114c9600185613b0c565b60018b600061272e565b886001815181106114e6576114e6613ae0565b602002602001018181525050611519565b60008860018151811061150c5761150c613ae0565b6020026020010181815250505b5050506115be565b608081015151855181146115475760405162461bcd60e51b8152600401610b7a90613bd3565b60015b818110156115bb57600087828151811061156657611566613ae0565b602002602001015111156115a9576115a9333089848151811061158b5761158b613ae0565b6020026020010151866080015185815181106112e3576112e3613ae0565b806115b381613b6b565b91505061154a565b50505b6115d1818260800151516000888861272e565b6040516311f9fbc960e21b81526001600160a01b03858116600483015260248201839052919350908716906347e7ef24906044016020604051808303816000875af1158015611624573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116489190613bb8565b5050949350505050565b61165a6129da565b6116646000612a34565b565b61166e6129da565b6116826001600160a01b03831633836126a4565b5050565b60008061169284611baf565b9150508060200151156118645760006001600083608001516001815181106116bc576116bc613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561177d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161175f575b5050505050815250509050806080015151600161179a9190613b1f565b8451146117b95760405162461bcd60e51b8152600401610b7a90613bd3565b600060015b85518110156118045760008682815181106117db576117db613ae0565b602002602001015111156117f25760019150611804565b806117fc81613b6b565b9150506117be565b50801561183b5761181782600187612a84565b8560018151811061182a5761182a613ae0565b60200260200101818152505061185d565b60008560018151811061185057611850613ae0565b6020026020010181815250505b5050611889565b8060800151518351146118895760405162461bcd60e51b8152600401610b7a90613bd3565b610ce481600085612a84565b606060006118a283611baf565b91505080602001516118b8576080015192915050565b60006001600083608001516001815181106118d5576118d5613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561199657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611978575b505050505081525050905080608001515160016119b39190613b1f565b67ffffffffffffffff8111156119cb576119cb6138ce565b6040519080825280602002602001820160405280156119f4578160200160208202803683370190505b5092508160800151600081518110611a0e57611a0e613ae0565b602002602001015183600081518110611a2957611a29613ae0565b6001600160a01b039092166020928302919091019091015260015b8351811015611ab1576080820151611a5d600183613b0c565b81518110611a6d57611a6d613ae0565b6020026020010151848281518110611a8757611a87613ae0565b6001600160a01b039092166020928302919091019091015280611aa981613b6b565b915050611a44565b505050919050565b6001600160a01b038181166000908152600260205260409020541615611b165760405162461bcd60e51b8152602060048201526012602482015271105b1c9958591e481c9959da5cdd195c995960721b6044820152606401610b7a565b61168281611c3e565b611b276129da565b611b318282612d7e565b505050565b611b3e6129da565b6001600160a01b038116611ba35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7a565b611bac81612a34565b50565b6000611bb961361e565b826001600160a01b0316635fcbd2856040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1b9190613c0a565b91506000611c2883612edf565b905082611c3482612f4b565b9250925050915091565b611c4661361e565b6001600160a01b03808316600090815260026020526040902054168015611d2c576001600160a01b03808216600090815260016020818152604092839020835160a0810185528154958616815260ff600160a01b87048116151582850152600160a81b87048116151582870152600160b01b909604909516151560608601529182018054845181840281018401909552808552929360808601939092830182828015611d1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cfd575b505050505081525050915050919050565b826001600160a01b0316635fcbd2856040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8e9190613c0a565b6001600160a01b03808516600090815260026020908152604080832080548587166001600160a01b031990911681179091558352600180835292819020815160a0810183528154958616815260ff600160a01b87048116151582860152600160a81b87048116151582850152600160b01b9096049095161515606086015292830180548251818502810185019093528083529596509394929360808601939192909190830182828015611e6a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e4c575b5050509190925250508151919350506001600160a01b0316611ff3576000836001600160a01b031663476363716040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea9190613ac7565b6040516372361ea760e11b8152600481018290529091506000906001600160a01b037f00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c169063e46c3d4e906024016040805180830381865afa158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190613c27565b509050846001600160a01b0316816001600160a01b031614611fdc5760405162461bcd60e51b815260206004820152601860248201527f726563656976657220213d206465706f736974546f6b656e00000000000000006044820152606401610b7a565b611fee611fe884612edf565b84612d7e565b935050505b6120096001600160a01b0382168460001961317c565b8151604080516001600160a01b03808716825290921660208301527fa2678919b4133750817a8e3d194f50c08ef49a9ffef59260767ab68a972e4f72910160405180910390a150919050565b6060600060016000886080015160018151811061207457612074613ae0565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600020825160a0810184528154948516815260ff600160a01b86048116151582850152600160a81b86048116151582860152600160b01b909504909416151560608501526001810180548451818502810185019095528085529193608086019390929083018282801561213557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612117575b50505091909252505050608081015151909150612153816001613b1f565b85146121a15760405162461bcd60e51b815260206004820152601c60248201527f496e636f7272656374206d696e52656365697665642e6c656e677468000000006044820152606401610b7a565b60006121ae826001613b1f565b67ffffffffffffffff8111156121c6576121c66138ce565b6040519080825280602002602001820160405280156121ef578160200160208202803683370190505b5090506121fe8960028a613291565b6000896080015160008151811061221757612217613ae0565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561226c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122909190613ac7565b9050888860008181106122a5576122a5613ae0565b905060200201358110156122cb5760405162461bcd60e51b8152600401610b7a90613c5c565b6122df6001600160a01b03831688836126a4565b80836000815181106122f3576122f3613ae0565b6020026020010181815250508a6080015160018151811061231657612316613ae0565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238a9190613ac7565b995061239785858c613291565b60005b848110156124c057856080015181815181106123b8576123b8613ae0565b60209081029190910101516040516370a0823160e01b81523060048201529093506001600160a01b038416906370a0823190602401602060405180830381865afa15801561240a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242e9190613ac7565b9150898961243d836001613b1f565b81811061244c5761244c613ae0565b905060200201358210156124725760405162461bcd60e51b8152600401610b7a90613c5c565b6124866001600160a01b03841689846126a4565b8184612493836001613b1f565b815181106124a3576124a3613ae0565b6020908102919091010152806124b881613b6b565b91505061239a565b50919a9950505050505050505050565b6080850151516060908381146125285760405162461bcd60e51b815260206004820152601c60248201527f496e636f7272656374206d696e52656365697665642e6c656e677468000000006044820152606401610b7a565b60008167ffffffffffffffff811115612543576125436138ce565b60405190808252806020026020018201604052801561256c578160200160208202803683370190505b50905061257a888389613291565b60005b828110156126985760008960800151828151811061259d5761259d613ae0565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156125f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126169190613ac7565b905088888481811061262a5761262a613ae0565b905060200201358110156126505760405162461bcd60e51b8152600401610b7a90613c5c565b6126646001600160a01b03831688836126a4565b8084848151811061267757612677613ae0565b6020026020010181815250505050808061269090613b6b565b91505061257d565b50979650505050505050565b6040516001600160a01b038316602482015260448101829052611b3190849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613436565b612728846323b872dd60e01b8585856040516024016126d093929190613b84565b50505050565b60008560600151156127b5578551604051635b96faef60e11b81526001600160a01b039091169063b72df5de9061276b9086908690600401613c7e565b6020604051808303816000875af115801561278a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ae9190613ac7565b9050610e0e565b846002036128415785600001516001600160a01b0316630b4c7e4d60405180604001604052808688815181106127ed576127ed613ae0565b60200260200101518152602001868860016128089190613b1f565b8151811061281857612818613ae0565b6020026020010151815250846040518363ffffffff1660e01b815260040161276b929190613cc3565b846003036128f85785600001516001600160a01b0316634515cef3604051806060016040528086888151811061287957612879613ae0565b60200260200101518152602001868860016128949190613b1f565b815181106128a4576128a4613ae0565b60200260200101518152602001868860026128bf9190613b1f565b815181106128cf576128cf613ae0565b6020026020010151815250846040518363ffffffff1660e01b815260040161276b929190613d01565b846004036100f55785600001516001600160a01b031663029b2f34604051806080016040528086888151811061293057612930613ae0565b602002602001015181526020018688600161294b9190613b1f565b8151811061295b5761295b613ae0565b60200260200101518152602001868860026129769190613b1f565b8151811061298657612986613ae0565b60200260200101518152602001868860036129a19190613b1f565b815181106129b1576129b1613ae0565b6020026020010151815250846040518363ffffffff1660e01b815260040161276b929190613d3f565b6000546001600160a01b031633146116645760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60808301515160608401516000919015612aca5784516040516307b60dbb60e31b81526001600160a01b0390911690633db06dd8906104c3908690600190600401613d5a565b80600203612be357846040015115612b5e5784600001516001600160a01b0316638d8ea7276040518060400160405280868881518110612b0c57612b0c613ae0565b6020026020010151815260200186886001612b279190613b1f565b81518110612b3757612b37613ae0565b60200260200101518152506040518263ffffffff1660e01b81526004016104c39190613d7e565b84600001516001600160a01b031663ed8e84f36040518060400160405280868881518110612b8e57612b8e613ae0565b6020026020010151815260200186886001612ba99190613b1f565b81518110612bb957612bb9613ae0565b602002602001015181525060016040518363ffffffff1660e01b81526004016104c3929190613d8c565b80600303612c9b5784600001516001600160a01b0316633883e1196040518060600160405280868881518110612c1b57612c1b613ae0565b6020026020010151815260200186886001612c369190613b1f565b81518110612c4657612c46613ae0565b6020026020010151815260200186886002612c619190613b1f565b81518110612c7157612c71613ae0565b602002602001015181525060016040518363ffffffff1660e01b81526004016104c3929190613da9565b806004036100f55784600001516001600160a01b031663cf701ff76040518060800160405280868881518110612cd357612cd3613ae0565b6020026020010151815260200186886001612cee9190613b1f565b81518110612cfe57612cfe613ae0565b6020026020010151815260200186886002612d199190613b1f565b81518110612d2957612d29613ae0565b6020026020010151815260200186886003612d449190613b1f565b81518110612d5457612d54613ae0565b602002602001015181525060016040518363ffffffff1660e01b81526004016104c3929190613dc6565b612d8661361e565b612d8f83612f4b565b905060005b816080015151811015612df457612de2826000015160001984608001518481518110612dc257612dc2613ae0565b60200260200101516001600160a01b031661317c9092919063ffffffff16565b80612dec81613b6b565b915050612d94565b506001600160a01b0380831660009081526001602081815260409283902085518154838801519588015160608901511515600160b01b0260ff60b01b19911515600160a81b029190911661ffff60a81b19971515600160a01b026001600160a81b0319909316939098169290921717949094169490941792909217835560808401518051859493612e8993850192019061364e565b505081516020830151604080850151608086015191517fc9164a717f6e0d393a454183fde305bc87c2638940bbadf9e6cf65ee5ac9a35f9550612ed194938893909291613de3565b60405180910390a192915050565b6000816001600160a01b031663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612f3b575060408051601f3d908101601f19168201909252612f3891810190613c0a565b60015b612f43575090565b90505b919050565b612f5361361e565b6001600160a01b038216815260408051600480825260a082019092526000916020820160808036833701905050905060005b60048110156130415760405163c661065760e01b8152600481018290526001600160a01b0385169063c661065790602401602060405180830381865afa925050508015612fef575060408051601f3d908101601f19168201909252612fec91810190613c0a565b60015b612ffb57808252613041565b8083838151811061300e5761300e613ae0565b60200260200101906001600160a01b031690816001600160a01b031681525050508061303981613b6b565b915050612f85565b60808301829052600082613056600184613b0c565b8151811061306657613066613ae0565b6020908102919091018101516001600160a01b038082166000908152600190935260409092205490925016801561309f57600160208601525b856001600160a01b031663b13739296040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156130f9575060408051601f3d908101601f191682019092526130f691810190613ac7565b60015b61316a57856001600160a01b031663293577506040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613157575060408051601f3d908101601f1916820190925261315491810190613ac7565b60015b156131655750600160608601525b613173565b50600160408601525b50505050919050565b8015806131f65750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156131d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f49190613ac7565b155b6132615760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610b7a565b6040516001600160a01b038316602482015260448101829052611b3190849063095ea7b360e01b906064016126d0565b8260600151156133435782516001600160a01b031663d40ddb8c828467ffffffffffffffff8111156132c5576132c56138ce565b6040519080825280602002602001820160405280156132ee578160200160208202803683370190505b506040518363ffffffff1660e01b815260040161330c929190613e1f565b600060405180830381600087803b15801561332657600080fd5b505af115801561333a573d6000803e3d6000fd5b50505050505050565b8160020361338d5782516040805180820182526000808252602082015290516316cd8e2760e21b81526001600160a01b0390921691635b36389c9161330c91859190600401613e38565b816003036133de5782516040805160608101825260008082526020820181905281830152905163ecb586a560e01b81526001600160a01b039092169163ecb586a59161330c91859190600401613e4c565b81600403611b315782516040805160808101825260008082526020820181905281830181905260608201529051637d49d87560e01b81526001600160a01b0390921691637d49d8759161330c91859190600401613e60565b600061348b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661350b9092919063ffffffff16565b90508051600014806134ac5750808060200190518101906134ac9190613bb8565b611b315760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b7a565b6060610ce4848460008585600080866001600160a01b031685876040516135329190613e98565b60006040518083038185875af1925050503d806000811461356f576040519150601f19603f3d011682016040523d82523d6000602084013e613574565b606091505b509150915061127087838387606083156135ef5782516000036135e8576001600160a01b0385163b6135e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b7a565b5081610ce4565b610ce483838151156136045781518083602001fd5b8060405162461bcd60e51b8152600401610b7a9190613eb4565b6040805160a081018252600080825260208201819052918101829052606080820192909252608081019190915290565b8280548282559060005260206000209081019282156136a3579160200282015b828111156136a357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061366e565b506136af9291506136b3565b5090565b5b808211156136af57600081556001016136b4565b6001600160a01b0381168114611bac57600080fd5b6000806000606084860312156136f257600080fd5b83356136fd816136c8565b95602085013595506040909401359392505050565b6000806040838503121561372557600080fd5b8235613730816136c8565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561376e57815187529582019590820190600101613752565b509495945050505050565b602081526000610546602083018461373e565b600080600080608085870312156137a257600080fd5b84356137ad816136c8565b935060208501356137bd816136c8565b92506040850135915060608501356137d4816136c8565b939692955090935050565b6000806000806000608086880312156137f757600080fd5b8535613802816136c8565b945060208601359350604086013567ffffffffffffffff8082111561382657600080fd5b818801915088601f83011261383a57600080fd5b81358181111561384957600080fd5b8960208260051b850101111561385e57600080fd5b6020830195508094505050506060860135613878816136c8565b809150509295509295909350565b600080600080600060a0868803121561389e57600080fd5b85356138a9816136c8565b94506020860135935060408601359250606086013591506080860135613878816136c8565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126138f557600080fd5b8135602067ffffffffffffffff80831115613912576139126138ce565b8260051b604051601f19603f83011681018181108482111715613937576139376138ce565b60405293845285810183019383810192508785111561395557600080fd5b83870191505b848210156112705781358352918301919083019061395b565b6000806000806080858703121561398a57600080fd5b8435613995816136c8565b9350602085013567ffffffffffffffff8111156139b157600080fd5b6139bd878288016138e4565b9350506040850135915060608501356137d4816136c8565b600080604083850312156139e857600080fd5b82356139f3816136c8565b9150602083013567ffffffffffffffff811115613a0f57600080fd5b613a1b858286016138e4565b9150509250929050565b600060208284031215613a3757600080fd5b8135610546816136c8565b600081518084526020808501945080840160005b8381101561376e5781516001600160a01b031687529582019590820190600101613a56565b6020815260006105466020830184613a42565b60008060408385031215613aa157600080fd5b8235613aac816136c8565b91506020830135613abc816136c8565b809150509250929050565b600060208284031215613ad957600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610b0057610b00613af6565b80820180821115610b0057610b00613af6565b8082028115828204841417610b0057610b00613af6565b600082613b6657634e487b7160e01b600052601260045260246000fd5b500490565b600060018201613b7d57613b7d613af6565b5060010190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b80518015158114612f4657600080fd5b600060208284031215613bca57600080fd5b61054682613ba8565b60208082526018908201527f496e636f727265637420616d6f756e74732e6c656e6774680000000000000000604082015260600190565b600060208284031215613c1c57600080fd5b8151610546816136c8565b60008060408385031215613c3a57600080fd5b8251613c45816136c8565b9150613c5360208401613ba8565b90509250929050565b602080825260089082015267536c69707061676560c01b604082015260600190565b604081526000613c91604083018561373e565b90508260208301529392505050565b8060005b6002811015612728578151845260209384019390910190600101613ca4565b60608101613cd18285613ca0565b8260408301529392505050565b8060005b6003811015612728578151845260209384019390910190600101613ce2565b60808101613d0f8285613cde565b8260608301529392505050565b8060005b6004811015612728578151845260209384019390910190600101613d20565b60a08101613d4d8285613d1c565b8260808301529392505050565b604081526000613d6d604083018561373e565b905082151560208301529392505050565b60408101610b008284613ca0565b60608101613d9a8285613ca0565b82151560408301529392505050565b60808101613db78285613cde565b82151560608301529392505050565b60a08101613dd48285613d1c565b82151560808301529392505050565b6001600160a01b038681168252851660208201528315156040820152821515606082015260a06080820181905260009061127090830184613a42565b828152604060208201526000610ce4604083018461373e565b828152606081016105466020830184613ca0565b828152608081016105466020830184613cde565b82815260a081016105466020830184613d1c565b60005b83811015613e8f578181015183820152602001613e77565b50506000910152565b60008251613eaa818460208701613e74565b9190910192915050565b6020815260008251806020840152613ed3816040850160208701613e74565b601f01601f1916919091016040019291505056fea264697066735822122033f0fcc7d2033e5662b34e14800d061e6cac5ed24f9b1c216e741668f082095064736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000dcef968d416a41cdac0ed8702fac8128a64241a20000000000000000000000003175df0976dfa876431c2e9ee6bc45b65d3473cc000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c70000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490
-----Decoded View---------------
Arg [0] : _vault (address): 0x06bDF212C290473dCACea9793890C5024c7Eb02c
Arg [1] : _basePools (address[2][]): System.Collections.Generic.List`1[System.String],System.Collections.Generic.List`1[System.String]
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000006bdf212c290473dcacea9793890c5024c7eb02c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 000000000000000000000000dcef968d416a41cdac0ed8702fac8128a64241a2
Arg [4] : 0000000000000000000000003175df0976dfa876431c2e9ee6bc45b65d3473cc
Arg [5] : 000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c7
Arg [6] : 0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.