More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Token Loc... | 9685282 | 14 hrs ago | IN | 0 S | 0.01306437 |
Loading...
Loading
Contract Name:
TokenLocker
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 100000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } abstract contract Ownable is Context { address private _owner; error OwnableUnauthorizedAccount(address account); error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } modifier onlyOwner() { _checkOwner(); _; } function owner() public view virtual returns (address) { return _owner; } function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); } interface IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } interface IAlgebraFactory { function poolByPair(address tokenA, address tokenB) external view returns (address pool); } interface INonfungiblePositionManager { function safeTransferFrom(address from, address to, uint256 tokenId) external; function positions(uint256 tokenId) external view returns ( uint88 nonce, address operator, address token0, address token1, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1); function factory() external view returns (address); } abstract contract UtilERC721 { /** * @dev this throws an error on false, instead of returning false, * but can still be used the same way on frontend. */ function isAlgebraNFTPosition_(INonfungiblePositionManager nonfungiblepositionmanager_, uint256 tokenId_) internal view returns (bool) { // this will return true if NFT position is from Algebra try nonfungiblepositionmanager_.positions(tokenId_) // this will return potentially Algebra returns ( uint88, address, address token0, address token1, int24, int24, uint128, uint256, uint256, uint128, uint128 ) { // we now need to see if we can get the factory out of this try nonfungiblepositionmanager_.factory() returns (address factory) { IAlgebraFactory _factory = IAlgebraFactory(factory); // we now need to see if there is a pool try _factory.poolByPair(token0, token1) returns (address pool) { // return true if there is a pool return pool != address(0); } catch (bytes memory /* lowLevelData */) { return false; } } catch (bytes memory /* lowLevelData */) { return false; } } catch (bytes memory /* lowLevelData */) { return false; } } /** * @dev this function will revert the transaction if it's called * on a token that isn't an LP token. so, it's recommended to be * sure that it's being called on an LP token, or expect the error. */ function getLpData_(INonfungiblePositionManager nonfungiblepositionmanager_, uint256 tokenId_) internal view returns ( address token0, address token1, int24 tickLower, int24 tickUpper, uint128 liquidity ) { (,,token0, token1, tickLower, tickUpper, liquidity,,,,) = nonfungiblepositionmanager_.positions(tokenId_); } } contract TokenLocker is Ownable, UtilERC721, IERC721Receiver, ReentrancyGuard { event Extended(uint256 indexed tokenId, uint40 newUnlockTime); event Deposited(uint256 indexed tokenId); event Withdrew(uint256 indexed tokenId); event FeesCollected( address indexed recipient, uint256 indexed tokenId, address token0, uint256 amount0, address token1, uint256 amount1 ); event TokenLockerCreated( uint40 id, uint256 indexed tokenId, address token0, address token1, address createdBy, uint40 unlockTime ); INonfungiblePositionManager public constant NONFUNGIBLE_POSITION_MANAGER = INonfungiblePositionManager(0xd82Fe82244ad01AaD671576202F9b46b76fAdFE2); // SwapX NonfungiblePositionManager uint40 public constant MAX_LOCK_DURATION = 2 * 52 weeks; // max set for 2 years in case the owner makes a mistake and put an infinite timestamp instead struct NFTLock { uint256 _tokenId; address _createdBy; uint40 _createdAt; uint40 _unlockTime; bool _isDeposited; } mapping(uint256 => NFTLock) public nftLocks; uint256[] public nftLockers; constructor() Ownable(msg.sender) {} function createTokenLocker(uint256 tokenId_, uint40 unlockTime_) external onlyOwner nonReentrant { // first let's check if the tokenId_ is from SwapX v3 pool require(isAlgebraNFTPosition_(NONFUNGIBLE_POSITION_MANAGER, tokenId_), "Token is not from SwapX v3 protocol"); // now we need to check if the tokenId already exists require(nftLocks[tokenId_]._createdBy == address(0), "NFT position already exists. Please use the deposit function instead"); // now make sure the unlock time is appropriate require(unlockTime_ > uint40(block.timestamp), "Unlock time must be in the future"); require(unlockTime_ <= uint40(block.timestamp) + MAX_LOCK_DURATION, "Unlock time cannot exceed 2 years"); // transfer the NFT position to the contract NONFUNGIBLE_POSITION_MANAGER.safeTransferFrom(_msgSender(), address(this), tokenId_); nftLocks[tokenId_] = NFTLock({ _tokenId: tokenId_, _createdBy: _msgSender(), _createdAt: uint40(block.timestamp), _unlockTime: unlockTime_, _isDeposited: true }); nftLockers.push(tokenId_); (address token0, address token1,,,) = getLpData_(NONFUNGIBLE_POSITION_MANAGER, tokenId_); emit TokenLockerCreated( uint40(nftLockers.length - 1), tokenId_, token0, token1, _msgSender(), unlockTime_ ); } function getLpData(uint256 tokenId_) external view returns ( address token0, address token1, int24 tickLower, int24 tickUpper, uint128 liquidity ) { (token0, token1, tickLower, tickUpper, liquidity) = getLpData_(NONFUNGIBLE_POSITION_MANAGER, tokenId_); } /** * @dev extend duration */ function extendTime(uint256 tokenId_, uint40 newUnlockTime_) external onlyOwner nonReentrant { _extendTime(tokenId_, newUnlockTime_); } function _extendTime(uint256 tokenId_, uint40 newUnlockTime_) internal { NFTLock storage nftLock = nftLocks[tokenId_]; require(nftLock._isDeposited, "The token ID is no longer active"); require( newUnlockTime_ != 0 && newUnlockTime_ >= nftLock._unlockTime && newUnlockTime_ >= uint40(block.timestamp), "New unlock time must be a future time beyond the previous value" ); require(newUnlockTime_ <= uint40(block.timestamp) + MAX_LOCK_DURATION, "New unlock time cannot exceed 2 years"); nftLock._unlockTime = newUnlockTime_; emit Extended(tokenId_, newUnlockTime_); } /** * @dev deposit the NFT position */ function deposit(uint256 tokenId_, uint40 newUnlockTime_) external onlyOwner nonReentrant { NFTLock storage nftLock = nftLocks[tokenId_]; require(nftLock._createdBy != address(0), "NFT position doesn't exist. Please use the createTokenLocker function instead"); require(!nftLock._isDeposited, "NFT position is deposited already"); nftLock._isDeposited = true; _extendTime(tokenId_, newUnlockTime_); NONFUNGIBLE_POSITION_MANAGER.safeTransferFrom(_msgSender(), address(this), tokenId_); emit Deposited(tokenId_); } /** * @dev collect fees from the deposited NFT position */ function collectFees(uint256 tokenId_, address recipient_) external onlyOwner nonReentrant { require(nftLocks[tokenId_]._isDeposited, "NFT position not yet deposited"); // if sent to address(0), it will be transferred in the owner as a safety measure if (recipient_ == address(0)) { recipient_ = owner(); } (address token0, address token1,,,) = getLpData_(NONFUNGIBLE_POSITION_MANAGER, tokenId_); INonfungiblePositionManager.CollectParams memory params; params = INonfungiblePositionManager.CollectParams({ tokenId: tokenId_, recipient: recipient_, amount0Max: type(uint128).max, amount1Max: type(uint128).max }); (uint256 amount0, uint256 amount1) = NONFUNGIBLE_POSITION_MANAGER.collect(params); emit FeesCollected(recipient_, tokenId_, token0, amount0, token1, amount1); } /** * @dev withdraw all of the deposited token */ function withdraw(uint256 tokenId_) external onlyOwner nonReentrant { require(nftLocks[tokenId_]._isDeposited, "NFT position not yet deposited"); require(uint40(block.timestamp) >= nftLocks[tokenId_]._unlockTime, "Wait until unlockTime to withdraw"); NONFUNGIBLE_POSITION_MANAGER.safeTransferFrom(address(this), owner(), tokenId_); nftLocks[tokenId_]._isDeposited = false; emit Withdrew(tokenId_); } /** * @dev recovery function - * just in case this contract winds up with additional tokens (from dividends, etc). * attempting to withdraw the locked token will revert. */ function withdrawToken(address address_) external onlyOwner nonReentrant { IERC20 token = IERC20(address_); uint256 amount = token.balanceOf(address(this)); require(amount > 0, "No token amount to withdraw"); token.transfer(owner(), amount); } /** * @dev recovery function - * just in case this contract winds up with S in it (from dividends etc) */ function withdrawS() external onlyOwner nonReentrant { address payable receiver = payable(owner()); uint256 amount = address(this).balance; require(amount > 0, "No S to withdraw"); (bool success,) = receiver.call{value: amount}(""); require(success, "Withdraw S failed"); } receive() external payable { // we need this function to receive S, // which might happen from dividend tokens. // use `withdrawS` to remove S from the contract. } /** * @dev Implementation of the {IERC721Receiver} interface. * This function is called by the NFT contract when a token is transferred to this contract. */ function onERC721Received( address, address, uint256, bytes calldata ) external override pure returns (bytes4) { return this.onERC721Received.selector; } function renounceOwnership() public view override onlyOwner { revert("Token Locker must always have an owner"); } }
{ "optimizer": { "enabled": true, "runs": 100000 }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris" }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint40","name":"newUnlockTime","type":"uint40"}],"name":"Extended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"FeesCollected","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":"uint40","name":"id","type":"uint40"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token0","type":"address"},{"indexed":false,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"createdBy","type":"address"},{"indexed":false,"internalType":"uint40","name":"unlockTime","type":"uint40"}],"name":"TokenLockerCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"MAX_LOCK_DURATION","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NONFUNGIBLE_POSITION_MANAGER","outputs":[{"internalType":"contract INonfungiblePositionManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"address","name":"recipient_","type":"address"}],"name":"collectFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint40","name":"unlockTime_","type":"uint40"}],"name":"createTokenLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint40","name":"newUnlockTime_","type":"uint40"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint40","name":"newUnlockTime_","type":"uint40"}],"name":"extendTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLpData","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftLockers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftLocks","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_createdBy","type":"address"},{"internalType":"uint40","name":"_createdAt","type":"uint40"},{"internalType":"uint40","name":"_unlockTime","type":"uint40"},{"internalType":"bool","name":"_isDeposited","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080806040523461007e5733156100685760008054336001600160a01b03198216811783556040519290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360018055611e6c90816100848239f35b631e4fbdf760e01b815260006004820152602490fd5b600080fdfe60406080815260049081361015610020575b5050361561001e57600080fd5b005b600091823560e01c806304b0bf5914611510578063150b7a021461146c5780632e1a7d4d1461124a5780634e967fef146111fd5780634f1bfc9e146111c057806351f3b4bd14610fc057806359650d56146109f1578063715018a614610936578063723d9ddc146108e0578063894760691461070a5780638da5cb5b146106b95780639df0655314610628578063d88e7f4e1461038b578063e4658d1f146102fa578063ecf93fcb146101c25763f2fde38b146100dd5750610011565b346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57610114611586565b9061011d611632565b73ffffffffffffffffffffffffffffffffffffffff80921692831561018f5750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8280fd5b5090346101be57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576101fa611632565b61020261176b565b73ffffffffffffffffffffffffffffffffffffffff8354164790811561029d578480809381935af161023261188d565b501561024057826001805580f35b90602060649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601160248201527f57697468647261772053206661696c65640000000000000000000000000000006044820152fd5b60648460208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601060248201527f4e6f205320746f207769746864726177000000000000000000000000000000006044820152fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be578160a09360ff92358152600260205220916001835493015490805193845273ffffffffffffffffffffffffffffffffffffffff8216602085015264ffffffffff908183871c16908501528160c81c16606084015260f01c1615156080820152f35b50346101be5761039a3661153f565b6103a5939193611632565b6103ad61176b565b8385526002602052600182862001805473ffffffffffffffffffffffffffffffffffffffff81161561057f5760ff8160f01c166104fc577fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179055849291906104379085611b78565b73d82fe82244ad01aad671576202f9b46b76fadfe2803b156104f85781517f42842e0e0000000000000000000000000000000000000000000000000000000081523393810193845230602085015260408401869052928491849182908490829060600103925af19081156104ef57506104d7575b50807f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea91a26001805580f35b6104e0906116cb565b6104eb5781386104ab565b5080fd5b513d84823e3d90fd5b8380fd5b60848560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f4e465420706f736974696f6e206973206465706f736974656420616c7265616460448201527f79000000000000000000000000000000000000000000000000000000000000006064820152fd5b60a48560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604d60248201527f4e465420706f736974696f6e20646f65736e27742065786973742e20506c656160448201527f7365207573652074686520637265617465546f6b656e4c6f636b65722066756e60648201527f6374696f6e20696e7374656164000000000000000000000000000000000000006084820152fd5b5091346106b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506fffffffffffffffffffffffffffffffff61067760a09335611ace565b938692919396519673ffffffffffffffffffffffffffffffffffffffff809216885216602087015260020b9085015260020b6060840152166080820152f35b80fd5b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5090346101be57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f857610745611586565b9261074e611632565b61075661176b565b73ffffffffffffffffffffffffffffffffffffffff809416908251947f70a0823100000000000000000000000000000000000000000000000000000000865230828701528486602481865afa9586156108d65787966108a3575b508515610847578492918760449281541693865198899586947fa9059cbb00000000000000000000000000000000000000000000000000000000865285015260248401525af190811561083e575061080b575b826001805580f35b81813d8311610837575b61081f818361172a565b810103126104eb5751801515036106b6573880610803565b503d610815565b513d85823e3d90fd5b606482868651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601b60248201527f4e6f20746f6b656e20616d6f756e7420746f20776974686472617700000000006044820152fd5b9095508481813d83116108cf575b6108bb818361172a565b810103126108cb575194386107b0565b8680fd5b503d6108b1565b84513d89823e3d90fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be5735916003548310156106b657506109286020926115cc565b90549060031b1c9051908152f35b5082346106b657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506020608492610974611632565b51917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602660248201527f546f6b656e204c6f636b6572206d75737420616c77617973206861766520616e60448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152fd5b50346101be57610a003661153f565b610a0b929192611632565b610a1361176b565b610a1c836118eb565b15610f3d578285526020936002855273ffffffffffffffffffffffffffffffffffffffff6001958187848a20015416610e955764ffffffffff908180421695169480861115610e135782610a6f82611683565b168611610d91578973d82fe82244ad01aad671576202f9b46b76fadfe2803b156104eb5786517f42842e0e00000000000000000000000000000000000000000000000000000000815233818b01908152306020820152604081018c90529091839183919082908490829060600103925af18015610d8757610d6f575b5050845160a0810181811067ffffffffffffffff821117610d415784888d94888e8e96610bde968d528781528c8a820199338b52818301958652606083019687526080830199848b52815260028c522090518155019651167fffffffffffffff0000000000000000000000000000000000000000000000000078ffffffffff00000000000000000000000000000000000000008854935160a01b16921617178555511683907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b5181547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f01b7eff0000000000000000000000000000000000000000000000000000000000001617905560035468010000000000000000811015610d15578089610c5092016003556115cc565b969080549760031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff98898b831b921b1916179055610c8e88611ace565b505050939091600354988901988911610ce95750855197168752831690860152169083015233606083015260808201527f47dfb08cc4fd82397f1edce419ef34b2633cda1cb2c666492fccf3205686a6c69060a090a2805580f35b8b60116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60248a6041897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6041897f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b610d78906116cb565b610d83578938610aeb565b8980fd5b87513d84823e3d90fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d652063616e6e6f74206578636565642032207965617260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d65206d75737420626520696e2074686520667574757260448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b8460a4918451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604460248201527f4e465420706f736974696f6e20616c7265616479206578697374732e20506c6560448201527f6173652075736520746865206465706f7369742066756e6374696f6e20696e7360648201527f74656164000000000000000000000000000000000000000000000000000000006084820152fd5b60848260208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602360248201527f546f6b656e206973206e6f742066726f6d2053776170582076332070726f746f60448201527f636f6c00000000000000000000000000000000000000000000000000000000006064820152fd5b5090346101be57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591610ffb6115a9565b611003611632565b61100b61176b565b8092848652600260205261102a60ff6001838920015460f01c16611dd1565b73ffffffffffffffffffffffffffffffffffffffff809216156111b5575b61105185611ace565b50505087606084959395516110658161170e565b82815282602082015282868201520152818351956110828761170e565b88875281602088019816978881528588016fffffffffffffffffffffffffffffffff93849283835260608b019484865289519b7ffc6f7865000000000000000000000000000000000000000000000000000000008d5251908c0152511660248a0152511660448801525116606486015282856084818b73d82fe82244ad01aad671576202f9b46b76fadfe25af19485156111ab5788908996611166575b50835194831685526020850152169082015260608101919091527ff2fdc3b7ce1325c8dbf3dd640e51e274386fda4f7340d94342f414809428054e90608090a36001805580f35b80939650848093969592503d83116111a4575b611183818361172a565b810103126111a0578151602090920151949293909291608061111f565b8780fd5b503d611179565b83513d8a823e3d90fd5b855482169350611048565b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb57602090516303bfc4008152f35b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb576020905173d82fe82244ad01aad671576202f9b46b76fadfe28152f35b5090346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591611286611632565b61128e61176b565b82845260026020526112ab60ff6001848720015460f01c16611dd1565b828452600260205264ffffffffff806001848720015460c81c16904216106113ea578373ffffffffffffffffffffffffffffffffffffffff8154169173d82fe82244ad01aad671576202f9b46b76fadfe2803b156101be5784517f42842e0e0000000000000000000000000000000000000000000000000000000081523092810192835273ffffffffffffffffffffffffffffffffffffffff909416602083015260408201869052839182908490829060600103925af180156113e0576113cc575b508183526002602052822060010180547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690557fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232518280a26001805580f35b926113d9600192946116cb565b929061136d565b82513d86823e3d90fd5b602060849251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f5761697420756e74696c20756e6c6f636b54696d6520746f207769746864726160448201527f77000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346101be5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576114a4611586565b506114ad6115a9565b506064359067ffffffffffffffff9081831161150c573660238401121561150c578201359081116104f857369101602401116104eb57602090517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b8480fd5b83346106b6576115386115223661153f565b9061152b611632565b61153361176b565b611b78565b6001805580f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112611581576004359060243564ffffffffff811681036115815790565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6003548110156116035760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361165357565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b906303bfc40064ffffffffff8093160191821161169c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81116116df57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176116df57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176116df57604052565b60026001541461177c576002600155565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b519073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b51908160020b820361158157565b51906fffffffffffffffffffffffffffffffff8216820361158157565b90816101609103126115815780516affffffffffffffffffffff811681036115815791611821602083016117a6565b9161182e604082016117a6565b9161183b606083016117a6565b91611848608082016117c7565b9161185560a083016117c7565b9161186260c082016117d5565b9160e0820151916101008101519161188a61014061188361012085016117d5565b93016117d5565b90565b3d156118e6573d9067ffffffffffffffff82116116df57604051916118da60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461172a565b82523d6000602084013e565b606090565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016073d82fe82244ad01aad671576202f9b46b76fadfe28183602481845afa600093849382611a8d575b50506119595750505061195361188d565b50600090565b60405180917fc45a015500000000000000000000000000000000000000000000000000000000825281600460209485935afa60009181611a56575b506119a5575050505061195361188d565b81906044604051809581937fd9a641e100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8099818094166004860152166024840152165afa918291600093611a1d575b5050611a1757505061195361188d565b16151590565b8181949293943d8311611a4f575b611a35818361172a565b810103126106b65750611a47906117a6565b903880611a07565b503d611a2b565b90918382813d8311611a86575b611a6d818361172a565b810103126106b65750611a7f906117a6565b9038611994565b503d611a63565b8091929550611ab2939450903d10611ac7575b611aaa818361172a565b8101906117f2565b50505050505050939250905091923880611942565b503d611aa0565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016090818160248173d82fe82244ad01aad671576202f9b46b76fadfe25afa908115611b6c576000928392849285928692611b3a575b50509091929394565b935093505050611b569250803d10611ac757611aaa818361172a565b5050505092955092909350939291903880611b31565b6040513d6000823e3d90fd5b90816000526020906002825260016040600020019081549160ff8360f01c1615611d745764ffffffffff80831693818515159182611d64575b505080611d58575b15611cd457611bc9814216611683565b168311611c50577f44d655190c46f646e5f7ecadf60b64f5952d49a05efd1c58ffab0b3f3a71aa5f939291611c4791907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b604051908152a2565b608484604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602560248201527f4e657720756e6c6f636b2074696d652063616e6e6f742065786365656420322060448201527f79656172730000000000000000000000000000000000000000000000000000006064820152fd5b608485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152603f60248201527f4e657720756e6c6f636b2074696d65206d75737420626520612066757475726560448201527f2074696d65206265796f6e64207468652070726576696f75732076616c7565006064820152fd5b50804216841015611bb9565b60c81c1685101590508138611bb1565b606484604051907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f54686520746f6b656e204944206973206e6f206c6f6e676572206163746976656044820152fd5b15611dd857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e465420706f736974696f6e206e6f7420796574206465706f736974656400006044820152fdfea2646970667358221220322e818daa7609c288831bd458579e97a41e585a8e5d7754eb8d190e8b201bff64736f6c63430008140033
Deployed Bytecode
0x60406080815260049081361015610020575b5050361561001e57600080fd5b005b600091823560e01c806304b0bf5914611510578063150b7a021461146c5780632e1a7d4d1461124a5780634e967fef146111fd5780634f1bfc9e146111c057806351f3b4bd14610fc057806359650d56146109f1578063715018a614610936578063723d9ddc146108e0578063894760691461070a5780638da5cb5b146106b95780639df0655314610628578063d88e7f4e1461038b578063e4658d1f146102fa578063ecf93fcb146101c25763f2fde38b146100dd5750610011565b346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57610114611586565b9061011d611632565b73ffffffffffffffffffffffffffffffffffffffff80921692831561018f5750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8280fd5b5090346101be57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576101fa611632565b61020261176b565b73ffffffffffffffffffffffffffffffffffffffff8354164790811561029d578480809381935af161023261188d565b501561024057826001805580f35b90602060649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601160248201527f57697468647261772053206661696c65640000000000000000000000000000006044820152fd5b60648460208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601060248201527f4e6f205320746f207769746864726177000000000000000000000000000000006044820152fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be578160a09360ff92358152600260205220916001835493015490805193845273ffffffffffffffffffffffffffffffffffffffff8216602085015264ffffffffff908183871c16908501528160c81c16606084015260f01c1615156080820152f35b50346101be5761039a3661153f565b6103a5939193611632565b6103ad61176b565b8385526002602052600182862001805473ffffffffffffffffffffffffffffffffffffffff81161561057f5760ff8160f01c166104fc577fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179055849291906104379085611b78565b73d82fe82244ad01aad671576202f9b46b76fadfe2803b156104f85781517f42842e0e0000000000000000000000000000000000000000000000000000000081523393810193845230602085015260408401869052928491849182908490829060600103925af19081156104ef57506104d7575b50807f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea91a26001805580f35b6104e0906116cb565b6104eb5781386104ab565b5080fd5b513d84823e3d90fd5b8380fd5b60848560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f4e465420706f736974696f6e206973206465706f736974656420616c7265616460448201527f79000000000000000000000000000000000000000000000000000000000000006064820152fd5b60a48560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604d60248201527f4e465420706f736974696f6e20646f65736e27742065786973742e20506c656160448201527f7365207573652074686520637265617465546f6b656e4c6f636b65722066756e60648201527f6374696f6e20696e7374656164000000000000000000000000000000000000006084820152fd5b5091346106b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506fffffffffffffffffffffffffffffffff61067760a09335611ace565b938692919396519673ffffffffffffffffffffffffffffffffffffffff809216885216602087015260020b9085015260020b6060840152166080820152f35b80fd5b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5090346101be57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f857610745611586565b9261074e611632565b61075661176b565b73ffffffffffffffffffffffffffffffffffffffff809416908251947f70a0823100000000000000000000000000000000000000000000000000000000865230828701528486602481865afa9586156108d65787966108a3575b508515610847578492918760449281541693865198899586947fa9059cbb00000000000000000000000000000000000000000000000000000000865285015260248401525af190811561083e575061080b575b826001805580f35b81813d8311610837575b61081f818361172a565b810103126104eb5751801515036106b6573880610803565b503d610815565b513d85823e3d90fd5b606482868651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601b60248201527f4e6f20746f6b656e20616d6f756e7420746f20776974686472617700000000006044820152fd5b9095508481813d83116108cf575b6108bb818361172a565b810103126108cb575194386107b0565b8680fd5b503d6108b1565b84513d89823e3d90fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be5735916003548310156106b657506109286020926115cc565b90549060031b1c9051908152f35b5082346106b657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506020608492610974611632565b51917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602660248201527f546f6b656e204c6f636b6572206d75737420616c77617973206861766520616e60448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152fd5b50346101be57610a003661153f565b610a0b929192611632565b610a1361176b565b610a1c836118eb565b15610f3d578285526020936002855273ffffffffffffffffffffffffffffffffffffffff6001958187848a20015416610e955764ffffffffff908180421695169480861115610e135782610a6f82611683565b168611610d91578973d82fe82244ad01aad671576202f9b46b76fadfe2803b156104eb5786517f42842e0e00000000000000000000000000000000000000000000000000000000815233818b01908152306020820152604081018c90529091839183919082908490829060600103925af18015610d8757610d6f575b5050845160a0810181811067ffffffffffffffff821117610d415784888d94888e8e96610bde968d528781528c8a820199338b52818301958652606083019687526080830199848b52815260028c522090518155019651167fffffffffffffff0000000000000000000000000000000000000000000000000078ffffffffff00000000000000000000000000000000000000008854935160a01b16921617178555511683907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b5181547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f01b7eff0000000000000000000000000000000000000000000000000000000000001617905560035468010000000000000000811015610d15578089610c5092016003556115cc565b969080549760031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff98898b831b921b1916179055610c8e88611ace565b505050939091600354988901988911610ce95750855197168752831690860152169083015233606083015260808201527f47dfb08cc4fd82397f1edce419ef34b2633cda1cb2c666492fccf3205686a6c69060a090a2805580f35b8b60116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60248a6041897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6041897f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b610d78906116cb565b610d83578938610aeb565b8980fd5b87513d84823e3d90fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d652063616e6e6f74206578636565642032207965617260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d65206d75737420626520696e2074686520667574757260448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b8460a4918451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604460248201527f4e465420706f736974696f6e20616c7265616479206578697374732e20506c6560448201527f6173652075736520746865206465706f7369742066756e6374696f6e20696e7360648201527f74656164000000000000000000000000000000000000000000000000000000006084820152fd5b60848260208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602360248201527f546f6b656e206973206e6f742066726f6d2053776170582076332070726f746f60448201527f636f6c00000000000000000000000000000000000000000000000000000000006064820152fd5b5090346101be57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591610ffb6115a9565b611003611632565b61100b61176b565b8092848652600260205261102a60ff6001838920015460f01c16611dd1565b73ffffffffffffffffffffffffffffffffffffffff809216156111b5575b61105185611ace565b50505087606084959395516110658161170e565b82815282602082015282868201520152818351956110828761170e565b88875281602088019816978881528588016fffffffffffffffffffffffffffffffff93849283835260608b019484865289519b7ffc6f7865000000000000000000000000000000000000000000000000000000008d5251908c0152511660248a0152511660448801525116606486015282856084818b73d82fe82244ad01aad671576202f9b46b76fadfe25af19485156111ab5788908996611166575b50835194831685526020850152169082015260608101919091527ff2fdc3b7ce1325c8dbf3dd640e51e274386fda4f7340d94342f414809428054e90608090a36001805580f35b80939650848093969592503d83116111a4575b611183818361172a565b810103126111a0578151602090920151949293909291608061111f565b8780fd5b503d611179565b83513d8a823e3d90fd5b855482169350611048565b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb57602090516303bfc4008152f35b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb576020905173d82fe82244ad01aad671576202f9b46b76fadfe28152f35b5090346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591611286611632565b61128e61176b565b82845260026020526112ab60ff6001848720015460f01c16611dd1565b828452600260205264ffffffffff806001848720015460c81c16904216106113ea578373ffffffffffffffffffffffffffffffffffffffff8154169173d82fe82244ad01aad671576202f9b46b76fadfe2803b156101be5784517f42842e0e0000000000000000000000000000000000000000000000000000000081523092810192835273ffffffffffffffffffffffffffffffffffffffff909416602083015260408201869052839182908490829060600103925af180156113e0576113cc575b508183526002602052822060010180547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690557fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232518280a26001805580f35b926113d9600192946116cb565b929061136d565b82513d86823e3d90fd5b602060849251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f5761697420756e74696c20756e6c6f636b54696d6520746f207769746864726160448201527f77000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346101be5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576114a4611586565b506114ad6115a9565b506064359067ffffffffffffffff9081831161150c573660238401121561150c578201359081116104f857369101602401116104eb57602090517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b8480fd5b83346106b6576115386115223661153f565b9061152b611632565b61153361176b565b611b78565b6001805580f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112611581576004359060243564ffffffffff811681036115815790565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6003548110156116035760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361165357565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b906303bfc40064ffffffffff8093160191821161169c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81116116df57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176116df57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176116df57604052565b60026001541461177c576002600155565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b519073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b51908160020b820361158157565b51906fffffffffffffffffffffffffffffffff8216820361158157565b90816101609103126115815780516affffffffffffffffffffff811681036115815791611821602083016117a6565b9161182e604082016117a6565b9161183b606083016117a6565b91611848608082016117c7565b9161185560a083016117c7565b9161186260c082016117d5565b9160e0820151916101008101519161188a61014061188361012085016117d5565b93016117d5565b90565b3d156118e6573d9067ffffffffffffffff82116116df57604051916118da60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461172a565b82523d6000602084013e565b606090565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016073d82fe82244ad01aad671576202f9b46b76fadfe28183602481845afa600093849382611a8d575b50506119595750505061195361188d565b50600090565b60405180917fc45a015500000000000000000000000000000000000000000000000000000000825281600460209485935afa60009181611a56575b506119a5575050505061195361188d565b81906044604051809581937fd9a641e100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8099818094166004860152166024840152165afa918291600093611a1d575b5050611a1757505061195361188d565b16151590565b8181949293943d8311611a4f575b611a35818361172a565b810103126106b65750611a47906117a6565b903880611a07565b503d611a2b565b90918382813d8311611a86575b611a6d818361172a565b810103126106b65750611a7f906117a6565b9038611994565b503d611a63565b8091929550611ab2939450903d10611ac7575b611aaa818361172a565b8101906117f2565b50505050505050939250905091923880611942565b503d611aa0565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016090818160248173d82fe82244ad01aad671576202f9b46b76fadfe25afa908115611b6c576000928392849285928692611b3a575b50509091929394565b935093505050611b569250803d10611ac757611aaa818361172a565b5050505092955092909350939291903880611b31565b6040513d6000823e3d90fd5b90816000526020906002825260016040600020019081549160ff8360f01c1615611d745764ffffffffff80831693818515159182611d64575b505080611d58575b15611cd457611bc9814216611683565b168311611c50577f44d655190c46f646e5f7ecadf60b64f5952d49a05efd1c58ffab0b3f3a71aa5f939291611c4791907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b604051908152a2565b608484604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602560248201527f4e657720756e6c6f636b2074696d652063616e6e6f742065786365656420322060448201527f79656172730000000000000000000000000000000000000000000000000000006064820152fd5b608485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152603f60248201527f4e657720756e6c6f636b2074696d65206d75737420626520612066757475726560448201527f2074696d65206265796f6e64207468652070726576696f75732076616c7565006064820152fd5b50804216841015611bb9565b60c81c1685101590508138611bb1565b606484604051907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f54686520746f6b656e204944206973206e6f206c6f6e676572206163746976656044820152fd5b15611dd857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e465420706f736974696f6e206e6f7420796574206465706f736974656400006044820152fdfea2646970667358221220322e818daa7609c288831bd458579e97a41e585a8e5d7754eb8d190e8b201bff64736f6c63430008140033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.