Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 19564213 | 94 days ago | IN | 0 ETH | 0.00071617 | ||||
Init Pool | 19564202 | 94 days ago | IN | 0 ETH | 0.01521826 | ||||
Init Pool | 19564194 | 94 days ago | IN | 0 ETH | 0.01502828 | ||||
Init Pool | 19564153 | 94 days ago | IN | 0 ETH | 0.018006 | ||||
Init Pool | 19564147 | 94 days ago | IN | 0 ETH | 0.01544397 | ||||
Init Pool | 19564144 | 94 days ago | IN | 0 ETH | 0.01839196 | ||||
Init Pool | 19564140 | 94 days ago | IN | 0 ETH | 0.01640344 | ||||
Init Pool | 19564137 | 94 days ago | IN | 0 ETH | 0.01638909 | ||||
Init Pool | 19564134 | 94 days ago | IN | 0 ETH | 0.01846051 | ||||
Init Pool | 19564131 | 94 days ago | IN | 0 ETH | 0.01785993 | ||||
Init Pool | 19564128 | 94 days ago | IN | 0 ETH | 0.0158632 | ||||
Init Pool | 19564123 | 94 days ago | IN | 0 ETH | 0.01608669 | ||||
Init Pool | 19564117 | 94 days ago | IN | 0 ETH | 0.072673 | ||||
0x60806040 | 19564075 | 94 days ago | IN | Create: CurveRegistryCache | 0 ETH | 0.05405868 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurveRegistryCache
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "contracts/access/Ownable.sol"; import "libraries/CurvePoolUtils.sol"; import "libraries/ArrayExtensions.sol"; import "interfaces/ICurveRegistryCache.sol"; import "interfaces/vendor/ICurveMetaRegistry.sol"; import "interfaces/vendor/ICurvePoolV0.sol"; import "interfaces/vendor/ICurvePoolV1.sol"; contract CurveRegistryCache is ICurveRegistryCache, Ownable { using ArrayExtensions for address[]; address internal constant _ETH = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); address internal constant _WETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); ICurveMetaRegistry public constant CURVE_REGISTRY = ICurveMetaRegistry(0xF98B45FA17DE75FB1aD0e7aFD971b0ca00e379fC); IBooster public constant BOOSTER = IBooster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); modifier onlyInitialized(address pool) { require(_isRegistered[pool], "CurveRegistryCache: pool not initialized"); _; } mapping(address => bool) internal _isRegistered; mapping(address => address) internal _lpToken; mapping(address => mapping(address => bool)) internal _hasCoinDirectly; mapping(address => mapping(address => bool)) internal _hasCoinAnywhere; mapping(address => address) internal _basePool; mapping(address => mapping(address => int128)) internal _coinIndex; mapping(address => uint256) internal _nCoins; mapping(address => address[]) internal _coins; mapping(address => uint256[]) internal _decimals; mapping(address => address) internal _poolFromLpToken; mapping(address => CurvePoolUtils.AssetType) internal _assetType; mapping(address => uint256) internal _interfaceVersion; /// Information needed for staking Curve LP tokens on Convex mapping(address => uint256) internal _convexPid; mapping(address => address) internal _convexRewardPool; // curve pool => CRV rewards pool (convex) function initPool(address pool_) external override { _initPool(pool_, false, 0); } function initPool(address pool_, uint256 pid_) external override { _initPool(pool_, true, pid_); } function initPool(address pool_, Types.PoolInfo memory poolInfo_) external override onlyOwner { _initUnregisteredPool(pool_, false, 0, poolInfo_); } function initPool( address pool_, uint256 pid_, Types.PoolInfo memory poolInfo_ ) external override onlyOwner { _initUnregisteredPool(pool_, true, pid_, poolInfo_); } function _initUnregisteredPool( address pool_, bool setPid_, uint256 pid_, Types.PoolInfo memory poolInfo_ ) internal { if (_isRegistered[pool_]) return; require(!_isCurvePool(pool_), "CurveRegistryCache: curve pool supported by metaregistry"); _initPool(pool_, setPid_, pid_, poolInfo_); } function _initPool(address pool_, bool setPid_, uint256 pid_) internal { if (_isRegistered[pool_]) return; require(_isCurvePool(pool_), "CurveRegistryCache: invalid curve pool"); Types.PoolInfo memory poolInfo_ = Types.PoolInfo({ lpToken: CURVE_REGISTRY.get_lp_token(pool_), basePool: CURVE_REGISTRY.get_base_pool(pool_), assetType: CURVE_REGISTRY.get_pool_asset_type(pool_) }); _initPool(pool_, setPid_, pid_, poolInfo_); } function _initPool( address pool_, bool setPid_, uint256 pid_, Types.PoolInfo memory poolInfo_ ) internal { address curveLpToken_ = poolInfo_.lpToken; address basePool_ = poolInfo_.basePool; _isRegistered[pool_] = true; _lpToken[pool_] = curveLpToken_; if (setPid_) { _setConvexPid(pool_, curveLpToken_, pid_); } else { pid_ = _setConvexPid(pool_, curveLpToken_); } _poolFromLpToken[curveLpToken_] = pool_; _basePool[pool_] = basePool_; if (basePool_ != address(0)) { _initPool(basePool_, false, 0); address[] memory basePoolCoins_ = _coins[basePool_]; for (uint256 i; i < basePoolCoins_.length; i++) { address coin_ = basePoolCoins_[i]; _hasCoinAnywhere[pool_][coin_] = true; } } _assetType[pool_] = CurvePoolUtils.AssetType(poolInfo_.assetType); uint256 interfaceVersion_ = _getInterfaceVersion(pool_); address[] memory coins_ = _getCoins(pool_, interfaceVersion_); for (uint256 i; i < coins_.length; i++) { address coin_ = coins_[i]; require(coin_ != address(0), "CurveRegistryCache: invalid coin"); _hasCoinDirectly[pool_][coin_] = true; _hasCoinAnywhere[pool_][coin_] = true; _coinIndex[pool_][coin_] = int128(uint128(i)); if (coin_ == _ETH) { coin_ = _WETH; coins_[i] = coin_; _hasCoinDirectly[pool_][coin_] = true; _hasCoinAnywhere[pool_][coin_] = true; _coinIndex[pool_][coin_] = int128(uint128(i)); } _decimals[pool_].push(IERC20Metadata(coin_).decimals()); } _nCoins[pool_] = coins_.length; _coins[pool_] = coins_; _interfaceVersion[pool_] = interfaceVersion_; emit PoolInitialized(pool_, pid_); } function _setConvexPid(address pool_, address lpToken_) internal returns (uint256 pid_) { uint256 length = BOOSTER.poolLength(); address rewardPool; for (uint256 i; i < length; i++) { (address curveToken, , , address rewardPool_, , bool _isShutdown) = BOOSTER.poolInfo(i); if (lpToken_ != curveToken || _isShutdown) continue; rewardPool = rewardPool_; pid_ = i; _convexPid[pool_] = i; break; } /// Only Curve pools that have a valid Convex PID can be added to the cache require(rewardPool != address(0), "no convex pid found"); _convexRewardPool[pool_] = rewardPool; } function _setConvexPid(address pool_, address lpToken_, uint256 pid_) internal { (address curveToken, , , address rewardPool_, , bool _isShutdown) = BOOSTER.poolInfo(pid_); require(lpToken_ == curveToken, "invalid lp token for curve pool"); require(!_isShutdown, "convex pool is shut down"); require(rewardPool_ != address(0), "no convex pid found"); _convexRewardPool[pool_] = rewardPool_; _convexPid[pool_] = pid_; } function isRegistered(address pool_) external view override returns (bool) { return _isRegistered[pool_]; } function lpToken( address pool_ ) external view override onlyInitialized(pool_) returns (address) { return _lpToken[pool_]; } function assetType( address pool_ ) external view override onlyInitialized(pool_) returns (CurvePoolUtils.AssetType) { return _assetType[pool_]; } function hasCoinDirectly( address pool_, address coin_ ) external view override onlyInitialized(pool_) returns (bool) { return _hasCoinDirectly[pool_][coin_]; } function hasCoinAnywhere( address pool_, address coin_ ) external view override onlyInitialized(pool_) returns (bool) { return _hasCoinAnywhere[pool_][coin_]; } function basePool( address pool_ ) external view override onlyInitialized(pool_) returns (address) { return _basePool[pool_]; } function coinIndex( address pool_, address coin_ ) external view override onlyInitialized(pool_) returns (int128) { return _coinIndex[pool_][coin_]; } function nCoins(address pool_) external view override onlyInitialized(pool_) returns (uint256) { return _nCoins[pool_]; } function getAllUnderlyingCoins(address pool) public view returns (address[] memory) { address base = _basePool[pool]; if (base == address(0)) return _coins[pool]; address[] memory result = new address[](_nCoins[pool] - 1); for ((uint256 i, uint256 j) = (0, 0); i < _nCoins[pool]; i++) { address coin = _coins[pool][i]; if (_poolFromLpToken[coin] != base) { result[j++] = coin; } } return result.concat(getAllUnderlyingCoins(base)); } function coinIndices( address pool_, address from_, address to_ ) external view override onlyInitialized(pool_) returns (int128, int128, bool) { return ( _coinIndex[pool_][from_], _coinIndex[pool_][to_], _hasCoinDirectly[pool_][from_] && _hasCoinDirectly[pool_][to_] ); } function decimals( address pool_ ) external view override onlyInitialized(pool_) returns (uint256[] memory) { return _decimals[pool_]; } /// @notice Returns the Curve interface version for a given pool /// @dev Version 0 uses `int128` for `coins` and `balances`, and `int128` for `get_dy` /// Version 1 uses `uint256` for `coins` and `balances`, and `int128` for `get_dy` /// Version 2 uses `uint256` for `coins` and `balances`, and `uint256` for `get_dy` /// They correspond with which interface the pool implements: ICurvePoolV0, ICurvePoolV1, ICurvePoolV2 function interfaceVersion( address pool_ ) external view override onlyInitialized(pool_) returns (uint256) { return _interfaceVersion[pool_]; } function poolFromLpToken(address lpToken_) external view override returns (address) { return _poolFromLpToken[lpToken_]; } function coins( address pool_ ) external view override onlyInitialized(pool_) returns (address[] memory) { return _coins[pool_]; } function getPid(address pool_) external view override onlyInitialized(pool_) returns (uint256) { require(_convexRewardPool[pool_] != address(0), "pid not found"); return _convexPid[pool_]; } function getRewardPool( address pool_ ) external view override onlyInitialized(pool_) returns (address) { return _convexRewardPool[pool_]; } function isShutdownPid(uint256 pid_) external view override returns (bool) { (, , , , , bool _isShutdown) = BOOSTER.poolInfo(pid_); return _isShutdown; } function _isCurvePool(address pool_) internal view returns (bool) { try CURVE_REGISTRY.is_registered(pool_) returns (bool registered_) { return registered_; } catch { return false; } } function _getCoins( address pool_, uint256 interfaceVersion_ ) internal view returns (address[] memory) { uint256 count_; address[] memory coins_ = new address[](8); for (uint256 i; i < 8; i++) { if (interfaceVersion_ == 0) { try ICurvePoolV0(pool_).coins(int128(int256(i))) returns (address coin) { coins_[i] = coin; count_++; } catch { break; } } else { try ICurvePoolV1(pool_).coins(i) returns (address coin) { coins_[i] = coin; count_++; } catch { break; } } } return coins_.trim(count_); } function _getInterfaceVersion(address pool_) internal view returns (uint256) { if (_assetType[pool_] == CurvePoolUtils.AssetType.CRYPTO) return 2; try ICurvePoolV1(pool_).balances(uint256(0)) returns (uint256) { return 1; } catch { return 0; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "contracts/token/ERC20/IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// 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) (access/Ownable.sol) pragma solidity ^0.8.0; import "contracts/utils/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: GPL-3.0-or-later pragma solidity 0.8.17; import "interfaces/vendor/ICurvePoolV2.sol"; import "interfaces/vendor/ICurvePoolV1.sol"; import "libraries/ScaledMath.sol"; library CurvePoolUtils { using ScaledMath for uint256; error NotWithinThreshold(address pool, uint256 assetA, uint256 assetB); /// @dev by default, allow for 30 bps deviation regardless of pool fees uint256 internal constant _DEFAULT_IMBALANCE_BUFFER = 30e14; /// @dev Curve scales the `fee` by 1e10 uint8 internal constant _CURVE_POOL_FEE_DECIMALS = 10; /// @dev allow imbalance to be buffer + 3x the fee, e.g. if fee is 3.6 bps and buffer is 30 bps, allow 40.8 bps uint256 internal constant _FEE_IMBALANCE_MULTIPLIER = 3; enum AssetType { USD, ETH, BTC, OTHER, CRYPTO } struct PoolMeta { address pool; uint256 numberOfCoins; AssetType assetType; uint256[] decimals; uint256[] prices; uint256[] imbalanceBuffers; } function ensurePoolBalanced(PoolMeta memory poolMeta) internal view { uint256 poolFee = ICurvePoolV1(poolMeta.pool).fee().convertScale( _CURVE_POOL_FEE_DECIMALS, 18 ); for (uint256 i = 0; i < poolMeta.numberOfCoins - 1; i++) { uint256 fromDecimals = poolMeta.decimals[i]; uint256 fromBalance = 10 ** fromDecimals; uint256 fromPrice = poolMeta.prices[i]; for (uint256 j = i + 1; j < poolMeta.numberOfCoins; j++) { uint256 toDecimals = poolMeta.decimals[j]; uint256 toPrice = poolMeta.prices[j]; uint256 toExpectedUnscaled = (fromBalance * fromPrice) / toPrice; uint256 toExpected = toExpectedUnscaled.convertScale( uint8(fromDecimals), uint8(toDecimals) ); uint256 toActual; if (poolMeta.assetType == AssetType.CRYPTO) { // Handling crypto pools toActual = ICurvePoolV2(poolMeta.pool).get_dy(i, j, fromBalance); } else { // Handling other pools toActual = ICurvePoolV1(poolMeta.pool).get_dy( int128(uint128(i)), int128(uint128(j)), fromBalance ); } uint256 _maxImbalanceBuffer = poolMeta.imbalanceBuffers[i].max( poolMeta.imbalanceBuffers[j] ); if (!_isWithinThreshold(toExpected, toActual, poolFee, _maxImbalanceBuffer)) revert NotWithinThreshold(poolMeta.pool, i, j); } } } function _isWithinThreshold( uint256 a, uint256 b, uint256 poolFee, uint256 imbalanceBuffer ) internal pure returns (bool) { if (imbalanceBuffer == 0) imbalanceBuffer = _DEFAULT_IMBALANCE_BUFFER; uint256 imbalanceTreshold = imbalanceBuffer + poolFee * _FEE_IMBALANCE_MULTIPLIER; if (a > b) return (a - b).divDown(a) <= imbalanceTreshold; return (b - a).divDown(b) <= imbalanceTreshold; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface ICurvePoolV2 { function token() external view returns (address); function coins(uint256 i) external view returns (address); function factory() external view returns (address); function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool use_eth, address receiver ) external returns (uint256); function exchange_underlying( uint256 i, uint256 j, uint256 dx, uint256 min_dy, address receiver ) external returns (uint256); function add_liquidity( uint256[2] memory amounts, uint256 min_mint_amount, bool use_eth, address receiver ) external returns (uint256); function add_liquidity( uint256[2] memory amounts, uint256 min_mint_amount ) external returns (uint256); function add_liquidity( uint256[3] memory amounts, uint256 min_mint_amount, bool use_eth, address receiver ) external returns (uint256); function add_liquidity( uint256[3] memory amounts, uint256 min_mint_amount ) external returns (uint256); function remove_liquidity( uint256 _amount, uint256[2] memory min_amounts, bool use_eth, address receiver ) external; function remove_liquidity(uint256 _amount, uint256[2] memory min_amounts) external; function remove_liquidity( uint256 _amount, uint256[3] memory min_amounts, bool use_eth, address receiver ) external; function remove_liquidity(uint256 _amount, uint256[3] memory min_amounts) external; function remove_liquidity_one_coin( uint256 token_amount, uint256 i, uint256 min_amount, bool use_eth, address receiver ) external returns (uint256); function get_dy(uint256 i, uint256 j, uint256 dx) external view returns (uint256); function calc_token_amount(uint256[] memory amounts) external view returns (uint256); function calc_withdraw_one_coin( uint256 token_amount, uint256 i ) external view returns (uint256); function get_virtual_price() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface ICurvePoolV1 { function get_virtual_price() external view returns (uint256); function add_liquidity(uint256[8] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[7] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[6] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[5] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; function remove_liquidity_imbalance( uint256[4] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity_imbalance( uint256[3] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity_imbalance( uint256[2] calldata amounts, uint256 max_burn_amount ) external; function lp_token() external view returns (address); function A_PRECISION() external view returns (uint256); function A_precise() external view returns (uint256); function remove_liquidity(uint256 _amount, uint256[3] calldata min_amounts) external; function exchange( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function coins(uint256 i) external view returns (address); function balances(uint256 i) external view returns (uint256); function get_dy(int128 i, int128 j, uint256 _dx) external view returns (uint256); function calc_token_amount( uint256[4] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( uint256[3] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( uint256[2] calldata amounts, bool deposit ) external view returns (uint256); function calc_withdraw_one_coin( uint256 _token_amount, int128 i ) external view returns (uint256); function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; function fee() external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; library ScaledMath { uint256 internal constant DECIMALS = 18; uint256 internal constant ONE = 10 ** DECIMALS; function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { return (a * b) / ONE; } function mulDown(uint256 a, uint256 b, uint256 decimals) internal pure returns (uint256) { return (a * b) / (10 ** decimals); } function divDown(uint256 a, uint256 b) internal pure returns (uint256) { return (a * ONE) / b; } function divDown(uint256 a, uint256 b, uint256 decimals) internal pure returns (uint256) { return (a * 10 ** decimals) / b; } function divUp(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } return ((a * ONE) - 1) / b + 1; } function mulDown(int256 a, int256 b) internal pure returns (int256) { return (a * b) / int256(ONE); } function mulDownUint128(uint128 a, uint128 b) internal pure returns (uint128) { return (a * b) / uint128(ONE); } function mulDown(int256 a, int256 b, uint256 decimals) internal pure returns (int256) { return (a * b) / int256(10 ** decimals); } function divDown(int256 a, int256 b) internal pure returns (int256) { return (a * int256(ONE)) / b; } function divDownUint128(uint128 a, uint128 b) internal pure returns (uint128) { return (a * uint128(ONE)) / b; } function divDown(int256 a, int256 b, uint256 decimals) internal pure returns (int256) { return (a * int256(10 ** decimals)) / b; } function convertScale( uint256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (uint256) { if (fromDecimals == toDecimals) return a; if (fromDecimals > toDecimals) return downscale(a, fromDecimals, toDecimals); return upscale(a, fromDecimals, toDecimals); } function convertScale( int256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (int256) { if (fromDecimals == toDecimals) return a; if (fromDecimals > toDecimals) return downscale(a, fromDecimals, toDecimals); return upscale(a, fromDecimals, toDecimals); } function upscale( uint256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (uint256) { return a * (10 ** (toDecimals - fromDecimals)); } function downscale( uint256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (uint256) { return a / (10 ** (fromDecimals - toDecimals)); } function upscale( int256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (int256) { return a * int256(10 ** (toDecimals - fromDecimals)); } function downscale( int256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (int256) { return a / int256(10 ** (fromDecimals - toDecimals)); } function intPow(uint256 a, uint256 n) internal pure returns (uint256) { uint256 result = ONE; for (uint256 i; i < n; ) { result = mulDown(result, a); unchecked { ++i; } } return result; } function absSub(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a >= b ? a - b : b - a; } } function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a <= b ? a : b; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; library ArrayExtensions { function copy(uint256[] memory array) internal pure returns (uint256[] memory) { uint256[] memory copy_ = new uint256[](array.length); for (uint256 i = 0; i < array.length; i++) { copy_[i] = array[i]; } return copy_; } function concat( address[] memory a, address[] memory b ) internal pure returns (address[] memory result) { result = new address[](a.length + b.length); for (uint256 i; i < a.length; i++) result[i] = a[i]; for (uint256 i; i < b.length; i++) result[i + a.length] = b[i]; } function includes(address[] memory array, address element) internal pure returns (bool) { return _includes(array, element, array.length); } function _includes( address[] memory array, address element, uint256 until ) internal pure returns (bool) { for (uint256 i; i < until; i++) { if (array[i] == element) return true; } return false; } function removeDuplicates(address[] memory array) internal pure returns (address[] memory) { address[] memory unique = new address[](array.length); uint256 j; for (uint256 i; i < array.length; i++) { if (!_includes(unique, array[i], j)) { unique[j++] = array[i]; } } return trim(unique, j); } function trim( address[] memory array, uint256 length ) internal pure returns (address[] memory trimmed) { trimmed = new address[](length); for (uint256 i; i < length; i++) trimmed[i] = array[i]; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "interfaces/vendor/IBooster.sol"; import "libraries/CurvePoolUtils.sol"; import "libraries/Types.sol"; interface ICurveRegistryCache { event PoolInitialized(address indexed pool, uint256 indexed pid); function BOOSTER() external view returns (IBooster); function initPool(address pool_) external; function initPool(address pool_, uint256 pid_) external; function initPool(address pool_, Types.PoolInfo memory poolInfo_) external; function initPool(address pool_, uint256 pid_, Types.PoolInfo memory poolInfo_) external; function lpToken(address pool_) external view returns (address); function assetType(address pool_) external view returns (CurvePoolUtils.AssetType); function isRegistered(address pool_) external view returns (bool); function hasCoinDirectly(address pool_, address coin_) external view returns (bool); function hasCoinAnywhere(address pool_, address coin_) external view returns (bool); function basePool(address pool_) external view returns (address); function coinIndex(address pool_, address coin_) external view returns (int128); function nCoins(address pool_) external view returns (uint256); function coinIndices( address pool_, address from_, address to_ ) external view returns (int128, int128, bool); function decimals(address pool_) external view returns (uint256[] memory); function interfaceVersion(address pool_) external view returns (uint256); function poolFromLpToken(address lpToken_) external view returns (address); function coins(address pool_) external view returns (address[] memory); function getPid(address _pool) external view returns (uint256); function getRewardPool(address _pool) external view returns (address); function isShutdownPid(uint256 pid_) external view returns (bool); /// @notice this returns the underlying coins of a pool, including the underlying of the base pool /// if the given pool is a meta pool /// This does not return the LP token of the base pool as an underlying /// e.g. if the pool is 3CrvFrax, this will return FRAX, DAI, USDC, USDT function getAllUnderlyingCoins(address pool) external view returns (address[] memory); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface IBooster { function poolInfo( uint256 pid ) external view returns ( address lpToken, address token, address gauge, address crvRewards, address stash, bool shutdown ); function poolLength() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns (bool); function withdraw(uint256 _pid, uint256 _amount) external returns (bool); function withdrawAll(uint256 _pid) external returns (bool); function depositAll(uint256 _pid, bool _stake) external returns (bool); function earmarkRewards(uint256 _pid) external returns (bool); function isShutdown() external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; library Types { struct Coin { address coinAddress; uint8 decimals; } struct CliffInfo { uint256 currentCliff; bool withinThreshold; } struct PoolInfo { address lpToken; address basePool; uint256 assetType; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface ICurveMetaRegistry { event CommitNewAdmin(uint256 indexed deadline, address indexed admin); event NewAdmin(address indexed admin); function add_registry_handler(address _registry_handler) external; function update_registry_handler(uint256 _index, address _registry_handler) external; function get_registry_handlers_from_pool( address _pool ) external view returns (address[10] memory); function get_base_registry(address registry_handler) external view returns (address); function find_pool_for_coins(address _from, address _to) external view returns (address); function find_pool_for_coins( address _from, address _to, uint256 i ) external view returns (address); function find_pools_for_coins( address _from, address _to ) external view returns (address[] memory); function get_admin_balances(address _pool) external view returns (uint256[8] memory); function get_admin_balances( address _pool, uint256 _handler_id ) external view returns (uint256[8] memory); function get_balances(address _pool) external view returns (uint256[8] memory); function get_balances( address _pool, uint256 _handler_id ) external view returns (uint256[8] memory); function get_base_pool(address _pool) external view returns (address); function get_base_pool(address _pool, uint256 _handler_id) external view returns (address); function get_coin_indices( address _pool, address _from, address _to ) external view returns (int128, int128, bool); function get_coin_indices( address _pool, address _from, address _to, uint256 _handler_id ) external view returns (int128, int128, bool); function get_coins(address _pool) external view returns (address[8] memory); function get_coins( address _pool, uint256 _handler_id ) external view returns (address[8] memory); function get_decimals(address _pool) external view returns (uint256[8] memory); function get_decimals( address _pool, uint256 _handler_id ) external view returns (uint256[8] memory); function get_fees(address _pool) external view returns (uint256[10] memory); function get_fees( address _pool, uint256 _handler_id ) external view returns (uint256[10] memory); function get_gauge(address _pool) external view returns (address); function get_gauge(address _pool, uint256 gauge_idx) external view returns (address); function get_gauge( address _pool, uint256 gauge_idx, uint256 _handler_id ) external view returns (address); function get_gauge_type(address _pool) external view returns (int128); function get_gauge_type(address _pool, uint256 gauge_idx) external view returns (int128); function get_gauge_type( address _pool, uint256 gauge_idx, uint256 _handler_id ) external view returns (int128); function get_lp_token(address _pool) external view returns (address); function get_lp_token(address _pool, uint256 _handler_id) external view returns (address); function get_n_coins(address _pool) external view returns (uint256); function get_n_coins(address _pool, uint256 _handler_id) external view returns (uint256); function get_n_underlying_coins(address _pool) external view returns (uint256); function get_n_underlying_coins( address _pool, uint256 _handler_id ) external view returns (uint256); function get_pool_asset_type(address _pool) external view returns (uint256); function get_pool_asset_type( address _pool, uint256 _handler_id ) external view returns (uint256); function get_pool_from_lp_token(address _token) external view returns (address); function get_pool_from_lp_token( address _token, uint256 _handler_id ) external view returns (address); function get_pool_params(address _pool) external view returns (uint256[20] memory); function get_pool_params( address _pool, uint256 _handler_id ) external view returns (uint256[20] memory); function get_pool_name(address _pool) external view returns (string memory); function get_pool_name( address _pool, uint256 _handler_id ) external view returns (string memory); function get_underlying_balances(address _pool) external view returns (uint256[8] memory); function get_underlying_balances( address _pool, uint256 _handler_id ) external view returns (uint256[8] memory); function get_underlying_coins(address _pool) external view returns (address[8] memory); function get_underlying_coins( address _pool, uint256 _handler_id ) external view returns (address[8] memory); function get_underlying_decimals(address _pool) external view returns (uint256[8] memory); function get_underlying_decimals( address _pool, uint256 _handler_id ) external view returns (uint256[8] memory); function get_virtual_price_from_lp_token(address _token) external view returns (uint256); function get_virtual_price_from_lp_token( address _token, uint256 _handler_id ) external view returns (uint256); function is_meta(address _pool) external view returns (bool); function is_meta(address _pool, uint256 _handler_id) external view returns (bool); function is_registered(address _pool) external view returns (bool); function is_registered(address _pool, uint256 _handler_id) external view returns (bool); function pool_count() external view returns (uint256); function pool_list(uint256 _index) external view returns (address); function address_provider() external view returns (address); function owner() external view returns (address); function get_registry(uint256 arg0) external view returns (address); function registry_length() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface ICurvePoolV0 { function get_virtual_price() external view returns (uint256); function add_liquidity(uint256[8] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[7] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[6] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[5] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; function remove_liquidity_imbalance( uint256[4] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity_imbalance( uint256[3] calldata amounts, uint256 max_burn_amount ) external; function remove_liquidity_imbalance( uint256[2] calldata amounts, uint256 max_burn_amount ) external; function lp_token() external view returns (address); function A_PRECISION() external view returns (uint256); function A_precise() external view returns (uint256); function remove_liquidity(uint256 _amount, uint256[2] calldata min_amounts) external; function remove_liquidity(uint256 _amount, uint256[3] calldata min_amounts) external; function remove_liquidity(uint256 _amount, uint256[4] calldata min_amounts) external; function remove_liquidity(uint256 _amount, uint256[5] calldata min_amounts) external; function remove_liquidity(uint256 _amount, uint256[6] calldata min_amounts) external; function remove_liquidity(uint256 _amount, uint256[7] calldata min_amounts) external; function remove_liquidity(uint256 _amount, uint256[8] calldata min_amounts) external; function exchange( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function coins(int128 i) external view returns (address); function balances(int128 i) external view returns (uint256); function get_dy(int128 i, int128 j, uint256 _dx) external view returns (uint256); function calc_token_amount( uint256[4] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( uint256[3] calldata amounts, bool deposit ) external view returns (uint256); function calc_token_amount( uint256[2] calldata amounts, bool deposit ) external view returns (uint256); function calc_withdraw_one_coin( uint256 _token_amount, int128 i ) external view returns (uint256); }
{ "evmVersion": "london", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "CurveRegistryCache.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"PoolInitialized","type":"event"},{"inputs":[],"name":"BOOSTER","outputs":[{"internalType":"contract IBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_REGISTRY","outputs":[{"internalType":"contract ICurveMetaRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"assetType","outputs":[{"internalType":"enum CurvePoolUtils.AssetType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"basePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"address","name":"coin_","type":"address"}],"name":"coinIndex","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"}],"name":"coinIndices","outputs":[{"internalType":"int128","name":"","type":"int128"},{"internalType":"int128","name":"","type":"int128"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"coins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"decimals","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getAllUnderlyingCoins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"getPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"getRewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"address","name":"coin_","type":"address"}],"name":"hasCoinAnywhere","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"address","name":"coin_","type":"address"}],"name":"hasCoinDirectly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"uint256","name":"pid_","type":"uint256"},{"components":[{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"address","name":"basePool","type":"address"},{"internalType":"uint256","name":"assetType","type":"uint256"}],"internalType":"struct Types.PoolInfo","name":"poolInfo_","type":"tuple"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"internalType":"uint256","name":"pid_","type":"uint256"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"},{"components":[{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"address","name":"basePool","type":"address"},{"internalType":"uint256","name":"assetType","type":"uint256"}],"internalType":"struct Types.PoolInfo","name":"poolInfo_","type":"tuple"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"initPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"interfaceVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid_","type":"uint256"}],"name":"isShutdownPid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"lpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool_","type":"address"}],"name":"nCoins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken_","type":"address"}],"name":"poolFromLpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61242d8061007e6000396000f3fe608060405234801561001057600080fd5b506004361061018c5760003560e01c806376a562a4116100de578063c3c5a54711610097578063effd708111610071578063effd708114610408578063f0d9fb931461041b578063f2fde38b1461042e578063f7d372f11461044157600080fd5b8063c3c5a5471461039c578063d449a832146103c8578063e40ad8ca146103e857600080fd5b806376a562a4146103245780637d0f7a88146103375780638da5cb5b1461034a578063b677560f1461035b578063b942717b1461036e578063bf25d02a1461038957600080fd5b806343b55f351161014b578063715018a611610125578063715018a6146102db57806373282128146102e357806373a2d446146102f657806375b0ffd11461030957600080fd5b806343b55f351461027d578063514a9009146102905780635fd5590a146102a357600080fd5b80622708db14610191578062eb8ba4146101ba5780631760eb5e146101e05780632aa8fdd21461020157806339d8d3ca146102165780634060c02514610239575b600080fd5b6101a461019f366004611f89565b610454565b6040516101b19190611fad565b60405180910390f35b6101cd6101c8366004611ffa565b610646565b604051600f9190910b81526020016101b1565b6101f36101ee366004611f89565b6106bc565b6040519081526020016101b1565b61021461020f3660046120c3565b610713565b005b610229610224366004612102565b61072d565b60405190151581526020016101b1565b610265610247366004611f89565b6001600160a01b039081166000908152600a60205260409020541690565b6040516001600160a01b0390911681526020016101b1565b6101f361028b366004611f89565b6107b2565b61026561029e366004611f89565b610860565b6102b66102b136600461211b565b6108ba565b60408051600f94850b81529290930b60208301521515918101919091526060016101b1565b61021461098c565b6102146102f1366004612166565b6109a0565b610265610304366004611f89565b6109b0565b61026573f403c135812408bfbe8713b5a23a04b3d48aae3181565b610265610332366004611f89565b610a0a565b6101a4610345366004611f89565b610a64565b6000546001600160a01b0316610265565b610229610369366004611ffa565b610b14565b61026573f98b45fa17de75fb1ad0e7afd971b0ca00e379fc81565b6101f3610397366004611f89565b610b7e565b6102296103aa366004611f89565b6001600160a01b031660009081526001602052604090205460ff1690565b6103db6103d6366004611f89565b610bd5565b6040516101b19190612192565b6103fb6103f6366004611f89565b610c7c565b6040516101b191906121e0565b610229610416366004611ffa565b610cd6565b610214610429366004612208565b610d40565b61021461043c366004611f89565b610d55565b61021461044f366004611f89565b610dce565b6001600160a01b0380821660009081526005602052604090205460609116806104ec576001600160a01b038316600090815260086020908152604091829020805483518184028101840190945280845290918301828280156104df57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104c1575b5050505050915050919050565b6001600160a01b03831660009081526007602052604081205461051190600190612254565b67ffffffffffffffff81111561052957610529612033565b604051908082528060200260200182016040528015610552578160200160208202803683370190505b5090506000805b6001600160a01b038616600090815260076020526040902054821015610629576001600160a01b03861660009081526008602052604081208054849081106105a3576105a3612267565b60009182526020808320909101546001600160a01b03908116808452600a909252604090922054909250811690861614610616578084836105e38161227d565b9450815181106105f5576105f5612267565b60200260200101906001600160a01b031690816001600160a01b0316815250505b50816106218161227d565b925050610559565b505061063e61063783610454565b8290610dda565b949350505050565b6001600160a01b038216600090815260016020526040812054839060ff166106895760405162461bcd60e51b815260040161068090612296565b60405180910390fd5b6001600160a01b03808516600090815260066020908152604080832093871683529290522054600f0b91505b5092915050565b6001600160a01b038116600090815260016020526040812054829060ff166106f65760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03166000908152600c602052604090205490565b61071b610eff565b6107288360018484610f59565b505050565b604051631526fe2760e01b815260048101829052600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a691906122ee565b98975050505050505050565b6001600160a01b038116600090815260016020526040812054829060ff166107ec5760405162461bcd60e51b815260040161068090612296565b6001600160a01b038381166000908152600e6020526040902054166108435760405162461bcd60e51b815260206004820152600d60248201526c1c1a59081b9bdd08199bdd5b99609a1b6044820152606401610680565b50506001600160a01b03166000908152600d602052604090205490565b6001600160a01b038116600090815260016020526040812054829060ff1661089a5760405162461bcd60e51b815260040161068090612296565b50506001600160a01b039081166000908152600e60205260409020541690565b6001600160a01b03831660009081526001602052604081205481908190869060ff166108f85760405162461bcd60e51b815260040161068090612296565b6001600160a01b0387811660008181526006602090815260408083208b861680855290835281842054958b1684528184205494845260038352818420908452909152902054600f92830b929190910b9060ff16801561097c57506001600160a01b03808a166000908152600360209081526040808320938b168352929052205460ff165b9350935093505093509350939050565b610994610eff565b61099e6000611007565b565b6109ac82600183611057565b5050565b6001600160a01b038116600090815260016020526040812054829060ff166109ea5760405162461bcd60e51b815260040161068090612296565b50506001600160a01b039081166000908152600560205260409020541690565b6001600160a01b038116600090815260016020526040812054829060ff16610a445760405162461bcd60e51b815260040161068090612296565b50506001600160a01b039081166000908152600260205260409020541690565b6001600160a01b038116600090815260016020526040902054606090829060ff16610aa15760405162461bcd60e51b815260040161068090612296565b6001600160a01b038316600090815260086020908152604091829020805483518184028101840190945280845290918301828280156104df576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104c1575050505050915050919050565b6001600160a01b038216600090815260016020526040812054839060ff16610b4e5760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6001600160a01b038116600090815260016020526040812054829060ff16610bb85760405162461bcd60e51b815260040161068090612296565b50506001600160a01b031660009081526007602052604090205490565b6001600160a01b038116600090815260016020526040902054606090829060ff16610c125760405162461bcd60e51b815260040161068090612296565b6001600160a01b038316600090815260096020908152604091829020805483518184028101840190945280845290918301828280156104df57602002820191906000526020600020905b815481526020019060010190808311610c5c575050505050915050919050565b6001600160a01b038116600090815260016020526040812054829060ff16610cb65760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03166000908152600b602052604090205460ff1690565b6001600160a01b038216600090815260016020526040812054839060ff16610d105760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b610d48610eff565b6109ac8260008084610f59565b610d5d610eff565b6001600160a01b038116610dc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610680565b610dcb81611007565b50565b610dcb81600080611057565b606081518351610dea9190612370565b67ffffffffffffffff811115610e0257610e02612033565b604051908082528060200260200182016040528015610e2b578160200160208202803683370190505b50905060005b8351811015610e9057838181518110610e4c57610e4c612267565b6020026020010151828281518110610e6657610e66612267565b6001600160a01b039092166020928302919091019091015280610e888161227d565b915050610e31565b5060005b82518110156106b557828181518110610eaf57610eaf612267565b602002602001015182855183610ec59190612370565b81518110610ed557610ed5612267565b6001600160a01b039092166020928302919091019091015280610ef78161227d565b915050610e94565b6000546001600160a01b0316331461099e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610680565b6001600160a01b03841660009081526001602052604090205460ff1661100157610f828461128a565b15610ff55760405162461bcd60e51b815260206004820152603860248201527f4375727665526567697374727943616368653a20637572766520706f6f6c207360448201527f7570706f72746564206279206d657461726567697374727900000000000000006064820152608401610680565b61100184848484611318565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03831660009081526001602052604090205460ff161561107d57505050565b6110868361128a565b6110e15760405162461bcd60e51b815260206004820152602660248201527f4375727665526567697374727943616368653a20696e76616c6964206375727660448201526519481c1bdbdb60d21b6064820152608401610680565b604080516060810191829052633795104960e01b9091526001600160a01b03841660648201526000908073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc633795104960848301602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612383565b6001600160a01b039081168252604051636f20d6dd60e01b8152908716600482015260209091019073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc90636f20d6dd90602401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190612383565b6001600160a01b0390811682526040516319b4e59b60e21b8152908716600482015260209091019073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc906366d3966c90602401602060405180830381865afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a91906123a0565b9052905061100184848484611318565b6040516330cf540360e11b81526001600160a01b038216600482015260009073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc9063619ea80690602401602060405180830381865afa925050508015611301575060408051601f3d908101601f191682019092526112fe918101906123b9565b60015b61130d57506000919050565b92915050565b919050565b80516020808301516001600160a01b03878116600090815260018085526040808320805460ff191690921790915560029094529290922080546001600160a01b03191692841692909217909155841561137b57611376868386611841565b611388565b6113858683611a01565b93505b6001600160a01b038083166000908152600a602090815260408083208054858c166001600160a01b03199182168117909255908452600590925290912080549284169290911682179055156114c4576113e381600080611057565b6001600160a01b03811660009081526008602090815260408083208054825181850281018501909352808352919290919083018282801561144d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161142f575b5050505050905060005b81518110156114c157600082828151811061147457611474612267565b6020908102919091018101516001600160a01b03808c16600090815260048452604080822092909316815292529020805460ff1916600117905550806114b98161227d565b915050611457565b50505b826040015160048111156114da576114da6121ca565b6001600160a01b0387166000908152600b60205260409020805460ff1916600183600481111561150c5761150c6121ca565b0217905550600061151c87611bf3565b9050600061152a8883611ca7565b905060005b81518110156117bc57600082828151811061154c5761154c612267565b6020026020010151905060006001600160a01b0316816001600160a01b0316036115b85760405162461bcd60e51b815260206004820181905260248201527f4375727665526567697374727943616368653a20696e76616c696420636f696e6044820152606401610680565b6001600160a01b038a811660008181526003602090815260408083209486168084529482528083208054600160ff199182168117909255858552600484528285208786528452828520805490911690911790559282526006815282822084835290522080546001600160801b0319166001600160801b03851617905573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed19016117085773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290508083838151811061167957611679612267565b6001600160a01b039283166020918202929092018101919091528b821660008181526003835260408082209486168083529484528082208054600160ff199182168117909255848452600486528284208785528652828420805490911690911790559181526006835281812093815292909152902080546001600160801b0319166001600160801b0384161790555b600960008b6001600160a01b03166001600160a01b03168152602001908152602001600020816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561176b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178f91906123d4565b81546001810183556000928352602090922060ff90911691015550806117b48161227d565b91505061152f565b5080516001600160a01b0389166000908152600760209081526040808320939093556008815291902082516117f392840190611efa565b506001600160a01b0388166000818152600c6020526040808220859055518892917f865db32d629b778510d2a2bd16751d214bd4a78253e6670dcebb9d1e5e3d632791a35050505050505050565b604051631526fe2760e01b8152600481018290526000908190819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc91906122ee565b955050945050509250826001600160a01b0316856001600160a01b0316146119265760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206c7020746f6b656e20666f7220637572766520706f6f6c006044820152606401610680565b80156119745760405162461bcd60e51b815260206004820152601860248201527f636f6e76657820706f6f6c206973207368757420646f776e00000000000000006044820152606401610680565b6001600160a01b0382166119c05760405162461bcd60e51b81526020600482015260136024820152721b9bc818dbdb9d995e081c1a5908199bdd5b99606a1b6044820152606401610680565b506001600160a01b039485166000908152600e6020908152604080832080546001600160a01b0319169490981693909317909655600d909552909320555050565b60008073f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b031663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a91906123a0565b90506000805b82811015611b7357604051631526fe2760e01b8152600481018290526000908190819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0391906122ee565b955050945050509250826001600160a01b0316886001600160a01b0316141580611b2a5750805b15611b3757505050611b61565b506001600160a01b0388166000908152600d60205260409020839055919450909150839050611b73565b80611b6b8161227d565b915050611a80565b506001600160a01b038116611bc05760405162461bcd60e51b81526020600482015260136024820152721b9bc818dbdb9d995e081c1a5908199bdd5b99606a1b6044820152606401610680565b6001600160a01b039485166000908152600e6020526040902080546001600160a01b031916919095161790935592915050565b600060046001600160a01b0383166000908152600b602052604090205460ff166004811115611c2457611c246121ca565b03611c3157506002919050565b604051634903b0d160e01b8152600060048201526001600160a01b03831690634903b0d190602401602060405180830381865afa925050508015611c92575060408051601f3d908101601f19168201909252611c8f918101906123a0565b60015b611c9e57506000919050565b50600192915050565b60408051600880825261012082019092526060916000918291602082016101008036833701905050905060005b6008811015611e3e5784600003611d8c5760405163046e8dd760e31b8152600f82900b60048201526001600160a01b038716906323746eb890602401602060405180830381865afa925050508015611d49575060408051601f3d908101601f19168201909252611d4691810190612383565b60015b15611e3e5780838381518110611d6157611d61612267565b6001600160a01b039092166020928302919091019091015283611d838161227d565b94505050611e2c565b60405163c661065760e01b8152600481018290526001600160a01b0387169063c661065790602401602060405180830381865afa925050508015611ded575060408051601f3d908101601f19168201909252611dea91810190612383565b60015b15611e3e5780838381518110611e0557611e05612267565b6001600160a01b039092166020928302919091019091015283611e278161227d565b945050505b80611e368161227d565b915050611cd4565b50611e498183611e52565b95945050505050565b60608167ffffffffffffffff811115611e6d57611e6d612033565b604051908082528060200260200182016040528015611e96578160200160208202803683370190505b50905060005b828110156106b557838181518110611eb657611eb6612267565b6020026020010151828281518110611ed057611ed0612267565b6001600160a01b039092166020928302919091019091015280611ef28161227d565b915050611e9c565b828054828255906000526020600020908101928215611f4f579160200282015b82811115611f4f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611f1a565b50611f5b929150611f5f565b5090565b5b80821115611f5b5760008155600101611f60565b6001600160a01b0381168114610dcb57600080fd5b600060208284031215611f9b57600080fd5b8135611fa681611f74565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015611fee5783516001600160a01b031683529284019291840191600101611fc9565b50909695505050505050565b6000806040838503121561200d57600080fd5b823561201881611f74565b9150602083013561202881611f74565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006060828403121561205b57600080fd5b6040516060810181811067ffffffffffffffff8211171561208c57634e487b7160e01b600052604160045260246000fd5b604052905080823561209d81611f74565b815260208301356120ad81611f74565b6020820152604092830135920191909152919050565b600080600060a084860312156120d857600080fd5b83356120e381611f74565b9250602084013591506120f98560408601612049565b90509250925092565b60006020828403121561211457600080fd5b5035919050565b60008060006060848603121561213057600080fd5b833561213b81611f74565b9250602084013561214b81611f74565b9150604084013561215b81611f74565b809150509250925092565b6000806040838503121561217957600080fd5b823561218481611f74565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015611fee578351835292840192918401916001016121ae565b634e487b7160e01b600052602160045260246000fd5b602081016005831061220257634e487b7160e01b600052602160045260246000fd5b91905290565b6000806080838503121561221b57600080fd5b823561222681611f74565b91506122358460208501612049565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561130d5761130d61223e565b634e487b7160e01b600052603260045260246000fd5b60006001820161228f5761228f61223e565b5060010190565b60208082526028908201527f4375727665526567697374727943616368653a20706f6f6c206e6f7420696e696040820152671d1a585b1a5e995960c21b606082015260800190565b8051801515811461131357600080fd5b60008060008060008060c0878903121561230757600080fd5b865161231281611f74565b602088015190965061232381611f74565b604088015190955061233481611f74565b606088015190945061234581611f74565b608088015190935061235681611f74565b915061236460a088016122de565b90509295509295509295565b8082018082111561130d5761130d61223e565b60006020828403121561239557600080fd5b8151611fa681611f74565b6000602082840312156123b257600080fd5b5051919050565b6000602082840312156123cb57600080fd5b611fa6826122de565b6000602082840312156123e657600080fd5b815160ff81168114611fa657600080fdfea2646970667358221220e44ecfe9d8a4a7329809cba5feae7e5f525799ed56484deb77107719e456d00664736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018c5760003560e01c806376a562a4116100de578063c3c5a54711610097578063effd708111610071578063effd708114610408578063f0d9fb931461041b578063f2fde38b1461042e578063f7d372f11461044157600080fd5b8063c3c5a5471461039c578063d449a832146103c8578063e40ad8ca146103e857600080fd5b806376a562a4146103245780637d0f7a88146103375780638da5cb5b1461034a578063b677560f1461035b578063b942717b1461036e578063bf25d02a1461038957600080fd5b806343b55f351161014b578063715018a611610125578063715018a6146102db57806373282128146102e357806373a2d446146102f657806375b0ffd11461030957600080fd5b806343b55f351461027d578063514a9009146102905780635fd5590a146102a357600080fd5b80622708db14610191578062eb8ba4146101ba5780631760eb5e146101e05780632aa8fdd21461020157806339d8d3ca146102165780634060c02514610239575b600080fd5b6101a461019f366004611f89565b610454565b6040516101b19190611fad565b60405180910390f35b6101cd6101c8366004611ffa565b610646565b604051600f9190910b81526020016101b1565b6101f36101ee366004611f89565b6106bc565b6040519081526020016101b1565b61021461020f3660046120c3565b610713565b005b610229610224366004612102565b61072d565b60405190151581526020016101b1565b610265610247366004611f89565b6001600160a01b039081166000908152600a60205260409020541690565b6040516001600160a01b0390911681526020016101b1565b6101f361028b366004611f89565b6107b2565b61026561029e366004611f89565b610860565b6102b66102b136600461211b565b6108ba565b60408051600f94850b81529290930b60208301521515918101919091526060016101b1565b61021461098c565b6102146102f1366004612166565b6109a0565b610265610304366004611f89565b6109b0565b61026573f403c135812408bfbe8713b5a23a04b3d48aae3181565b610265610332366004611f89565b610a0a565b6101a4610345366004611f89565b610a64565b6000546001600160a01b0316610265565b610229610369366004611ffa565b610b14565b61026573f98b45fa17de75fb1ad0e7afd971b0ca00e379fc81565b6101f3610397366004611f89565b610b7e565b6102296103aa366004611f89565b6001600160a01b031660009081526001602052604090205460ff1690565b6103db6103d6366004611f89565b610bd5565b6040516101b19190612192565b6103fb6103f6366004611f89565b610c7c565b6040516101b191906121e0565b610229610416366004611ffa565b610cd6565b610214610429366004612208565b610d40565b61021461043c366004611f89565b610d55565b61021461044f366004611f89565b610dce565b6001600160a01b0380821660009081526005602052604090205460609116806104ec576001600160a01b038316600090815260086020908152604091829020805483518184028101840190945280845290918301828280156104df57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104c1575b5050505050915050919050565b6001600160a01b03831660009081526007602052604081205461051190600190612254565b67ffffffffffffffff81111561052957610529612033565b604051908082528060200260200182016040528015610552578160200160208202803683370190505b5090506000805b6001600160a01b038616600090815260076020526040902054821015610629576001600160a01b03861660009081526008602052604081208054849081106105a3576105a3612267565b60009182526020808320909101546001600160a01b03908116808452600a909252604090922054909250811690861614610616578084836105e38161227d565b9450815181106105f5576105f5612267565b60200260200101906001600160a01b031690816001600160a01b0316815250505b50816106218161227d565b925050610559565b505061063e61063783610454565b8290610dda565b949350505050565b6001600160a01b038216600090815260016020526040812054839060ff166106895760405162461bcd60e51b815260040161068090612296565b60405180910390fd5b6001600160a01b03808516600090815260066020908152604080832093871683529290522054600f0b91505b5092915050565b6001600160a01b038116600090815260016020526040812054829060ff166106f65760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03166000908152600c602052604090205490565b61071b610eff565b6107288360018484610f59565b505050565b604051631526fe2760e01b815260048101829052600090819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a691906122ee565b98975050505050505050565b6001600160a01b038116600090815260016020526040812054829060ff166107ec5760405162461bcd60e51b815260040161068090612296565b6001600160a01b038381166000908152600e6020526040902054166108435760405162461bcd60e51b815260206004820152600d60248201526c1c1a59081b9bdd08199bdd5b99609a1b6044820152606401610680565b50506001600160a01b03166000908152600d602052604090205490565b6001600160a01b038116600090815260016020526040812054829060ff1661089a5760405162461bcd60e51b815260040161068090612296565b50506001600160a01b039081166000908152600e60205260409020541690565b6001600160a01b03831660009081526001602052604081205481908190869060ff166108f85760405162461bcd60e51b815260040161068090612296565b6001600160a01b0387811660008181526006602090815260408083208b861680855290835281842054958b1684528184205494845260038352818420908452909152902054600f92830b929190910b9060ff16801561097c57506001600160a01b03808a166000908152600360209081526040808320938b168352929052205460ff165b9350935093505093509350939050565b610994610eff565b61099e6000611007565b565b6109ac82600183611057565b5050565b6001600160a01b038116600090815260016020526040812054829060ff166109ea5760405162461bcd60e51b815260040161068090612296565b50506001600160a01b039081166000908152600560205260409020541690565b6001600160a01b038116600090815260016020526040812054829060ff16610a445760405162461bcd60e51b815260040161068090612296565b50506001600160a01b039081166000908152600260205260409020541690565b6001600160a01b038116600090815260016020526040902054606090829060ff16610aa15760405162461bcd60e51b815260040161068090612296565b6001600160a01b038316600090815260086020908152604091829020805483518184028101840190945280845290918301828280156104df576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116104c1575050505050915050919050565b6001600160a01b038216600090815260016020526040812054839060ff16610b4e5760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6001600160a01b038116600090815260016020526040812054829060ff16610bb85760405162461bcd60e51b815260040161068090612296565b50506001600160a01b031660009081526007602052604090205490565b6001600160a01b038116600090815260016020526040902054606090829060ff16610c125760405162461bcd60e51b815260040161068090612296565b6001600160a01b038316600090815260096020908152604091829020805483518184028101840190945280845290918301828280156104df57602002820191906000526020600020905b815481526020019060010190808311610c5c575050505050915050919050565b6001600160a01b038116600090815260016020526040812054829060ff16610cb65760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03166000908152600b602052604090205460ff1690565b6001600160a01b038216600090815260016020526040812054839060ff16610d105760405162461bcd60e51b815260040161068090612296565b50506001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b610d48610eff565b6109ac8260008084610f59565b610d5d610eff565b6001600160a01b038116610dc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610680565b610dcb81611007565b50565b610dcb81600080611057565b606081518351610dea9190612370565b67ffffffffffffffff811115610e0257610e02612033565b604051908082528060200260200182016040528015610e2b578160200160208202803683370190505b50905060005b8351811015610e9057838181518110610e4c57610e4c612267565b6020026020010151828281518110610e6657610e66612267565b6001600160a01b039092166020928302919091019091015280610e888161227d565b915050610e31565b5060005b82518110156106b557828181518110610eaf57610eaf612267565b602002602001015182855183610ec59190612370565b81518110610ed557610ed5612267565b6001600160a01b039092166020928302919091019091015280610ef78161227d565b915050610e94565b6000546001600160a01b0316331461099e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610680565b6001600160a01b03841660009081526001602052604090205460ff1661100157610f828461128a565b15610ff55760405162461bcd60e51b815260206004820152603860248201527f4375727665526567697374727943616368653a20637572766520706f6f6c207360448201527f7570706f72746564206279206d657461726567697374727900000000000000006064820152608401610680565b61100184848484611318565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03831660009081526001602052604090205460ff161561107d57505050565b6110868361128a565b6110e15760405162461bcd60e51b815260206004820152602660248201527f4375727665526567697374727943616368653a20696e76616c6964206375727660448201526519481c1bdbdb60d21b6064820152608401610680565b604080516060810191829052633795104960e01b9091526001600160a01b03841660648201526000908073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc633795104960848301602060405180830381865afa158015611146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116a9190612383565b6001600160a01b039081168252604051636f20d6dd60e01b8152908716600482015260209091019073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc90636f20d6dd90602401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190612383565b6001600160a01b0390811682526040516319b4e59b60e21b8152908716600482015260209091019073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc906366d3966c90602401602060405180830381865afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a91906123a0565b9052905061100184848484611318565b6040516330cf540360e11b81526001600160a01b038216600482015260009073f98b45fa17de75fb1ad0e7afd971b0ca00e379fc9063619ea80690602401602060405180830381865afa925050508015611301575060408051601f3d908101601f191682019092526112fe918101906123b9565b60015b61130d57506000919050565b92915050565b919050565b80516020808301516001600160a01b03878116600090815260018085526040808320805460ff191690921790915560029094529290922080546001600160a01b03191692841692909217909155841561137b57611376868386611841565b611388565b6113858683611a01565b93505b6001600160a01b038083166000908152600a602090815260408083208054858c166001600160a01b03199182168117909255908452600590925290912080549284169290911682179055156114c4576113e381600080611057565b6001600160a01b03811660009081526008602090815260408083208054825181850281018501909352808352919290919083018282801561144d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161142f575b5050505050905060005b81518110156114c157600082828151811061147457611474612267565b6020908102919091018101516001600160a01b03808c16600090815260048452604080822092909316815292529020805460ff1916600117905550806114b98161227d565b915050611457565b50505b826040015160048111156114da576114da6121ca565b6001600160a01b0387166000908152600b60205260409020805460ff1916600183600481111561150c5761150c6121ca565b0217905550600061151c87611bf3565b9050600061152a8883611ca7565b905060005b81518110156117bc57600082828151811061154c5761154c612267565b6020026020010151905060006001600160a01b0316816001600160a01b0316036115b85760405162461bcd60e51b815260206004820181905260248201527f4375727665526567697374727943616368653a20696e76616c696420636f696e6044820152606401610680565b6001600160a01b038a811660008181526003602090815260408083209486168084529482528083208054600160ff199182168117909255858552600484528285208786528452828520805490911690911790559282526006815282822084835290522080546001600160801b0319166001600160801b03851617905573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed19016117085773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290508083838151811061167957611679612267565b6001600160a01b039283166020918202929092018101919091528b821660008181526003835260408082209486168083529484528082208054600160ff199182168117909255848452600486528284208785528652828420805490911690911790559181526006835281812093815292909152902080546001600160801b0319166001600160801b0384161790555b600960008b6001600160a01b03166001600160a01b03168152602001908152602001600020816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561176b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178f91906123d4565b81546001810183556000928352602090922060ff90911691015550806117b48161227d565b91505061152f565b5080516001600160a01b0389166000908152600760209081526040808320939093556008815291902082516117f392840190611efa565b506001600160a01b0388166000818152600c6020526040808220859055518892917f865db32d629b778510d2a2bd16751d214bd4a78253e6670dcebb9d1e5e3d632791a35050505050505050565b604051631526fe2760e01b8152600481018290526000908190819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc91906122ee565b955050945050509250826001600160a01b0316856001600160a01b0316146119265760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206c7020746f6b656e20666f7220637572766520706f6f6c006044820152606401610680565b80156119745760405162461bcd60e51b815260206004820152601860248201527f636f6e76657820706f6f6c206973207368757420646f776e00000000000000006044820152606401610680565b6001600160a01b0382166119c05760405162461bcd60e51b81526020600482015260136024820152721b9bc818dbdb9d995e081c1a5908199bdd5b99606a1b6044820152606401610680565b506001600160a01b039485166000908152600e6020908152604080832080546001600160a01b0319169490981693909317909655600d909552909320555050565b60008073f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b031663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7a91906123a0565b90506000805b82811015611b7357604051631526fe2760e01b8152600481018290526000908190819073f403c135812408bfbe8713b5a23a04b3d48aae3190631526fe279060240160c060405180830381865afa158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0391906122ee565b955050945050509250826001600160a01b0316886001600160a01b0316141580611b2a5750805b15611b3757505050611b61565b506001600160a01b0388166000908152600d60205260409020839055919450909150839050611b73565b80611b6b8161227d565b915050611a80565b506001600160a01b038116611bc05760405162461bcd60e51b81526020600482015260136024820152721b9bc818dbdb9d995e081c1a5908199bdd5b99606a1b6044820152606401610680565b6001600160a01b039485166000908152600e6020526040902080546001600160a01b031916919095161790935592915050565b600060046001600160a01b0383166000908152600b602052604090205460ff166004811115611c2457611c246121ca565b03611c3157506002919050565b604051634903b0d160e01b8152600060048201526001600160a01b03831690634903b0d190602401602060405180830381865afa925050508015611c92575060408051601f3d908101601f19168201909252611c8f918101906123a0565b60015b611c9e57506000919050565b50600192915050565b60408051600880825261012082019092526060916000918291602082016101008036833701905050905060005b6008811015611e3e5784600003611d8c5760405163046e8dd760e31b8152600f82900b60048201526001600160a01b038716906323746eb890602401602060405180830381865afa925050508015611d49575060408051601f3d908101601f19168201909252611d4691810190612383565b60015b15611e3e5780838381518110611d6157611d61612267565b6001600160a01b039092166020928302919091019091015283611d838161227d565b94505050611e2c565b60405163c661065760e01b8152600481018290526001600160a01b0387169063c661065790602401602060405180830381865afa925050508015611ded575060408051601f3d908101601f19168201909252611dea91810190612383565b60015b15611e3e5780838381518110611e0557611e05612267565b6001600160a01b039092166020928302919091019091015283611e278161227d565b945050505b80611e368161227d565b915050611cd4565b50611e498183611e52565b95945050505050565b60608167ffffffffffffffff811115611e6d57611e6d612033565b604051908082528060200260200182016040528015611e96578160200160208202803683370190505b50905060005b828110156106b557838181518110611eb657611eb6612267565b6020026020010151828281518110611ed057611ed0612267565b6001600160a01b039092166020928302919091019091015280611ef28161227d565b915050611e9c565b828054828255906000526020600020908101928215611f4f579160200282015b82811115611f4f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611f1a565b50611f5b929150611f5f565b5090565b5b80821115611f5b5760008155600101611f60565b6001600160a01b0381168114610dcb57600080fd5b600060208284031215611f9b57600080fd5b8135611fa681611f74565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015611fee5783516001600160a01b031683529284019291840191600101611fc9565b50909695505050505050565b6000806040838503121561200d57600080fd5b823561201881611f74565b9150602083013561202881611f74565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006060828403121561205b57600080fd5b6040516060810181811067ffffffffffffffff8211171561208c57634e487b7160e01b600052604160045260246000fd5b604052905080823561209d81611f74565b815260208301356120ad81611f74565b6020820152604092830135920191909152919050565b600080600060a084860312156120d857600080fd5b83356120e381611f74565b9250602084013591506120f98560408601612049565b90509250925092565b60006020828403121561211457600080fd5b5035919050565b60008060006060848603121561213057600080fd5b833561213b81611f74565b9250602084013561214b81611f74565b9150604084013561215b81611f74565b809150509250925092565b6000806040838503121561217957600080fd5b823561218481611f74565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015611fee578351835292840192918401916001016121ae565b634e487b7160e01b600052602160045260246000fd5b602081016005831061220257634e487b7160e01b600052602160045260246000fd5b91905290565b6000806080838503121561221b57600080fd5b823561222681611f74565b91506122358460208501612049565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561130d5761130d61223e565b634e487b7160e01b600052603260045260246000fd5b60006001820161228f5761228f61223e565b5060010190565b60208082526028908201527f4375727665526567697374727943616368653a20706f6f6c206e6f7420696e696040820152671d1a585b1a5e995960c21b606082015260800190565b8051801515811461131357600080fd5b60008060008060008060c0878903121561230757600080fd5b865161231281611f74565b602088015190965061232381611f74565b604088015190955061233481611f74565b606088015190945061234581611f74565b608088015190935061235681611f74565b915061236460a088016122de565b90509295509295509295565b8082018082111561130d5761130d61223e565b60006020828403121561239557600080fd5b8151611fa681611f74565b6000602082840312156123b257600080fd5b5051919050565b6000602082840312156123cb57600080fd5b611fa6826122de565b6000602082840312156123e657600080fd5b815160ff81168114611fa657600080fdfea2646970667358221220e44ecfe9d8a4a7329809cba5feae7e5f525799ed56484deb77107719e456d00664736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.