S Price: $0.820107 (-3.57%)

Contract

0xcC255BdD6F16A2d7073c804E39c9730847445c06

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Token Loc...96852822025-02-24 0:34:2714 hrs ago1740357267IN
0xcC255BdD...847445c06
0 S0.0130643755

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenLocker

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 100000 runs

Other Settings:
paris EvmVersion
File 1 of 1 : TokenLocker.sol
// 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");
    }

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 100000
  },
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris"
}

Contract Security Audit

Contract ABI

[{"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"}]

6080806040523461007e5733156100685760008054336001600160a01b03198216811783556040519290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360018055611e6c90816100848239f35b631e4fbdf760e01b815260006004820152602490fd5b600080fdfe60406080815260049081361015610020575b5050361561001e57600080fd5b005b600091823560e01c806304b0bf5914611510578063150b7a021461146c5780632e1a7d4d1461124a5780634e967fef146111fd5780634f1bfc9e146111c057806351f3b4bd14610fc057806359650d56146109f1578063715018a614610936578063723d9ddc146108e0578063894760691461070a5780638da5cb5b146106b95780639df0655314610628578063d88e7f4e1461038b578063e4658d1f146102fa578063ecf93fcb146101c25763f2fde38b146100dd5750610011565b346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57610114611586565b9061011d611632565b73ffffffffffffffffffffffffffffffffffffffff80921692831561018f5750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8280fd5b5090346101be57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576101fa611632565b61020261176b565b73ffffffffffffffffffffffffffffffffffffffff8354164790811561029d578480809381935af161023261188d565b501561024057826001805580f35b90602060649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601160248201527f57697468647261772053206661696c65640000000000000000000000000000006044820152fd5b60648460208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601060248201527f4e6f205320746f207769746864726177000000000000000000000000000000006044820152fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be578160a09360ff92358152600260205220916001835493015490805193845273ffffffffffffffffffffffffffffffffffffffff8216602085015264ffffffffff908183871c16908501528160c81c16606084015260f01c1615156080820152f35b50346101be5761039a3661153f565b6103a5939193611632565b6103ad61176b565b8385526002602052600182862001805473ffffffffffffffffffffffffffffffffffffffff81161561057f5760ff8160f01c166104fc577fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179055849291906104379085611b78565b73d82fe82244ad01aad671576202f9b46b76fadfe2803b156104f85781517f42842e0e0000000000000000000000000000000000000000000000000000000081523393810193845230602085015260408401869052928491849182908490829060600103925af19081156104ef57506104d7575b50807f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea91a26001805580f35b6104e0906116cb565b6104eb5781386104ab565b5080fd5b513d84823e3d90fd5b8380fd5b60848560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f4e465420706f736974696f6e206973206465706f736974656420616c7265616460448201527f79000000000000000000000000000000000000000000000000000000000000006064820152fd5b60a48560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604d60248201527f4e465420706f736974696f6e20646f65736e27742065786973742e20506c656160448201527f7365207573652074686520637265617465546f6b656e4c6f636b65722066756e60648201527f6374696f6e20696e7374656164000000000000000000000000000000000000006084820152fd5b5091346106b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506fffffffffffffffffffffffffffffffff61067760a09335611ace565b938692919396519673ffffffffffffffffffffffffffffffffffffffff809216885216602087015260020b9085015260020b6060840152166080820152f35b80fd5b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5090346101be57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f857610745611586565b9261074e611632565b61075661176b565b73ffffffffffffffffffffffffffffffffffffffff809416908251947f70a0823100000000000000000000000000000000000000000000000000000000865230828701528486602481865afa9586156108d65787966108a3575b508515610847578492918760449281541693865198899586947fa9059cbb00000000000000000000000000000000000000000000000000000000865285015260248401525af190811561083e575061080b575b826001805580f35b81813d8311610837575b61081f818361172a565b810103126104eb5751801515036106b6573880610803565b503d610815565b513d85823e3d90fd5b606482868651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601b60248201527f4e6f20746f6b656e20616d6f756e7420746f20776974686472617700000000006044820152fd5b9095508481813d83116108cf575b6108bb818361172a565b810103126108cb575194386107b0565b8680fd5b503d6108b1565b84513d89823e3d90fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be5735916003548310156106b657506109286020926115cc565b90549060031b1c9051908152f35b5082346106b657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506020608492610974611632565b51917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602660248201527f546f6b656e204c6f636b6572206d75737420616c77617973206861766520616e60448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152fd5b50346101be57610a003661153f565b610a0b929192611632565b610a1361176b565b610a1c836118eb565b15610f3d578285526020936002855273ffffffffffffffffffffffffffffffffffffffff6001958187848a20015416610e955764ffffffffff908180421695169480861115610e135782610a6f82611683565b168611610d91578973d82fe82244ad01aad671576202f9b46b76fadfe2803b156104eb5786517f42842e0e00000000000000000000000000000000000000000000000000000000815233818b01908152306020820152604081018c90529091839183919082908490829060600103925af18015610d8757610d6f575b5050845160a0810181811067ffffffffffffffff821117610d415784888d94888e8e96610bde968d528781528c8a820199338b52818301958652606083019687526080830199848b52815260028c522090518155019651167fffffffffffffff0000000000000000000000000000000000000000000000000078ffffffffff00000000000000000000000000000000000000008854935160a01b16921617178555511683907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b5181547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f01b7eff0000000000000000000000000000000000000000000000000000000000001617905560035468010000000000000000811015610d15578089610c5092016003556115cc565b969080549760031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff98898b831b921b1916179055610c8e88611ace565b505050939091600354988901988911610ce95750855197168752831690860152169083015233606083015260808201527f47dfb08cc4fd82397f1edce419ef34b2633cda1cb2c666492fccf3205686a6c69060a090a2805580f35b8b60116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60248a6041897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6041897f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b610d78906116cb565b610d83578938610aeb565b8980fd5b87513d84823e3d90fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d652063616e6e6f74206578636565642032207965617260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d65206d75737420626520696e2074686520667574757260448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b8460a4918451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604460248201527f4e465420706f736974696f6e20616c7265616479206578697374732e20506c6560448201527f6173652075736520746865206465706f7369742066756e6374696f6e20696e7360648201527f74656164000000000000000000000000000000000000000000000000000000006084820152fd5b60848260208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602360248201527f546f6b656e206973206e6f742066726f6d2053776170582076332070726f746f60448201527f636f6c00000000000000000000000000000000000000000000000000000000006064820152fd5b5090346101be57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591610ffb6115a9565b611003611632565b61100b61176b565b8092848652600260205261102a60ff6001838920015460f01c16611dd1565b73ffffffffffffffffffffffffffffffffffffffff809216156111b5575b61105185611ace565b50505087606084959395516110658161170e565b82815282602082015282868201520152818351956110828761170e565b88875281602088019816978881528588016fffffffffffffffffffffffffffffffff93849283835260608b019484865289519b7ffc6f7865000000000000000000000000000000000000000000000000000000008d5251908c0152511660248a0152511660448801525116606486015282856084818b73d82fe82244ad01aad671576202f9b46b76fadfe25af19485156111ab5788908996611166575b50835194831685526020850152169082015260608101919091527ff2fdc3b7ce1325c8dbf3dd640e51e274386fda4f7340d94342f414809428054e90608090a36001805580f35b80939650848093969592503d83116111a4575b611183818361172a565b810103126111a0578151602090920151949293909291608061111f565b8780fd5b503d611179565b83513d8a823e3d90fd5b855482169350611048565b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb57602090516303bfc4008152f35b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb576020905173d82fe82244ad01aad671576202f9b46b76fadfe28152f35b5090346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591611286611632565b61128e61176b565b82845260026020526112ab60ff6001848720015460f01c16611dd1565b828452600260205264ffffffffff806001848720015460c81c16904216106113ea578373ffffffffffffffffffffffffffffffffffffffff8154169173d82fe82244ad01aad671576202f9b46b76fadfe2803b156101be5784517f42842e0e0000000000000000000000000000000000000000000000000000000081523092810192835273ffffffffffffffffffffffffffffffffffffffff909416602083015260408201869052839182908490829060600103925af180156113e0576113cc575b508183526002602052822060010180547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690557fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232518280a26001805580f35b926113d9600192946116cb565b929061136d565b82513d86823e3d90fd5b602060849251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f5761697420756e74696c20756e6c6f636b54696d6520746f207769746864726160448201527f77000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346101be5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576114a4611586565b506114ad6115a9565b506064359067ffffffffffffffff9081831161150c573660238401121561150c578201359081116104f857369101602401116104eb57602090517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b8480fd5b83346106b6576115386115223661153f565b9061152b611632565b61153361176b565b611b78565b6001805580f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112611581576004359060243564ffffffffff811681036115815790565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6003548110156116035760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361165357565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b906303bfc40064ffffffffff8093160191821161169c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81116116df57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176116df57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176116df57604052565b60026001541461177c576002600155565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b519073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b51908160020b820361158157565b51906fffffffffffffffffffffffffffffffff8216820361158157565b90816101609103126115815780516affffffffffffffffffffff811681036115815791611821602083016117a6565b9161182e604082016117a6565b9161183b606083016117a6565b91611848608082016117c7565b9161185560a083016117c7565b9161186260c082016117d5565b9160e0820151916101008101519161188a61014061188361012085016117d5565b93016117d5565b90565b3d156118e6573d9067ffffffffffffffff82116116df57604051916118da60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461172a565b82523d6000602084013e565b606090565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016073d82fe82244ad01aad671576202f9b46b76fadfe28183602481845afa600093849382611a8d575b50506119595750505061195361188d565b50600090565b60405180917fc45a015500000000000000000000000000000000000000000000000000000000825281600460209485935afa60009181611a56575b506119a5575050505061195361188d565b81906044604051809581937fd9a641e100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8099818094166004860152166024840152165afa918291600093611a1d575b5050611a1757505061195361188d565b16151590565b8181949293943d8311611a4f575b611a35818361172a565b810103126106b65750611a47906117a6565b903880611a07565b503d611a2b565b90918382813d8311611a86575b611a6d818361172a565b810103126106b65750611a7f906117a6565b9038611994565b503d611a63565b8091929550611ab2939450903d10611ac7575b611aaa818361172a565b8101906117f2565b50505050505050939250905091923880611942565b503d611aa0565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016090818160248173d82fe82244ad01aad671576202f9b46b76fadfe25afa908115611b6c576000928392849285928692611b3a575b50509091929394565b935093505050611b569250803d10611ac757611aaa818361172a565b5050505092955092909350939291903880611b31565b6040513d6000823e3d90fd5b90816000526020906002825260016040600020019081549160ff8360f01c1615611d745764ffffffffff80831693818515159182611d64575b505080611d58575b15611cd457611bc9814216611683565b168311611c50577f44d655190c46f646e5f7ecadf60b64f5952d49a05efd1c58ffab0b3f3a71aa5f939291611c4791907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b604051908152a2565b608484604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602560248201527f4e657720756e6c6f636b2074696d652063616e6e6f742065786365656420322060448201527f79656172730000000000000000000000000000000000000000000000000000006064820152fd5b608485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152603f60248201527f4e657720756e6c6f636b2074696d65206d75737420626520612066757475726560448201527f2074696d65206265796f6e64207468652070726576696f75732076616c7565006064820152fd5b50804216841015611bb9565b60c81c1685101590508138611bb1565b606484604051907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f54686520746f6b656e204944206973206e6f206c6f6e676572206163746976656044820152fd5b15611dd857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e465420706f736974696f6e206e6f7420796574206465706f736974656400006044820152fdfea2646970667358221220322e818daa7609c288831bd458579e97a41e585a8e5d7754eb8d190e8b201bff64736f6c63430008140033

Deployed Bytecode

0x60406080815260049081361015610020575b5050361561001e57600080fd5b005b600091823560e01c806304b0bf5914611510578063150b7a021461146c5780632e1a7d4d1461124a5780634e967fef146111fd5780634f1bfc9e146111c057806351f3b4bd14610fc057806359650d56146109f1578063715018a614610936578063723d9ddc146108e0578063894760691461070a5780638da5cb5b146106b95780639df0655314610628578063d88e7f4e1461038b578063e4658d1f146102fa578063ecf93fcb146101c25763f2fde38b146100dd5750610011565b346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57610114611586565b9061011d611632565b73ffffffffffffffffffffffffffffffffffffffff80921692831561018f5750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8280fd5b5090346101be57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576101fa611632565b61020261176b565b73ffffffffffffffffffffffffffffffffffffffff8354164790811561029d578480809381935af161023261188d565b501561024057826001805580f35b90602060649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601160248201527f57697468647261772053206661696c65640000000000000000000000000000006044820152fd5b60648460208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601060248201527f4e6f205320746f207769746864726177000000000000000000000000000000006044820152fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be578160a09360ff92358152600260205220916001835493015490805193845273ffffffffffffffffffffffffffffffffffffffff8216602085015264ffffffffff908183871c16908501528160c81c16606084015260f01c1615156080820152f35b50346101be5761039a3661153f565b6103a5939193611632565b6103ad61176b565b8385526002602052600182862001805473ffffffffffffffffffffffffffffffffffffffff81161561057f5760ff8160f01c166104fc577fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179055849291906104379085611b78565b73d82fe82244ad01aad671576202f9b46b76fadfe2803b156104f85781517f42842e0e0000000000000000000000000000000000000000000000000000000081523393810193845230602085015260408401869052928491849182908490829060600103925af19081156104ef57506104d7575b50807f2a89b2e3d580398d6dc2db5e0f336b52602bbaa51afa9bb5cdf59239cf0d2bea91a26001805580f35b6104e0906116cb565b6104eb5781386104ab565b5080fd5b513d84823e3d90fd5b8380fd5b60848560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f4e465420706f736974696f6e206973206465706f736974656420616c7265616460448201527f79000000000000000000000000000000000000000000000000000000000000006064820152fd5b60a48560208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604d60248201527f4e465420706f736974696f6e20646f65736e27742065786973742e20506c656160448201527f7365207573652074686520637265617465546f6b656e4c6f636b65722066756e60648201527f6374696f6e20696e7374656164000000000000000000000000000000000000006084820152fd5b5091346106b65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506fffffffffffffffffffffffffffffffff61067760a09335611ace565b938692919396519673ffffffffffffffffffffffffffffffffffffffff809216885216602087015260020b9085015260020b6060840152166080820152f35b80fd5b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5090346101be57602090817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104f857610745611586565b9261074e611632565b61075661176b565b73ffffffffffffffffffffffffffffffffffffffff809416908251947f70a0823100000000000000000000000000000000000000000000000000000000865230828701528486602481865afa9586156108d65787966108a3575b508515610847578492918760449281541693865198899586947fa9059cbb00000000000000000000000000000000000000000000000000000000865285015260248401525af190811561083e575061080b575b826001805580f35b81813d8311610837575b61081f818361172a565b810103126104eb5751801515036106b6573880610803565b503d610815565b513d85823e3d90fd5b606482868651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601b60248201527f4e6f20746f6b656e20616d6f756e7420746f20776974686472617700000000006044820152fd5b9095508481813d83116108cf575b6108bb818361172a565b810103126108cb575194386107b0565b8680fd5b503d6108b1565b84513d89823e3d90fd5b50346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be5735916003548310156106b657506109286020926115cc565b90549060031b1c9051908152f35b5082346106b657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106b657506020608492610974611632565b51917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602660248201527f546f6b656e204c6f636b6572206d75737420616c77617973206861766520616e60448201527f206f776e657200000000000000000000000000000000000000000000000000006064820152fd5b50346101be57610a003661153f565b610a0b929192611632565b610a1361176b565b610a1c836118eb565b15610f3d578285526020936002855273ffffffffffffffffffffffffffffffffffffffff6001958187848a20015416610e955764ffffffffff908180421695169480861115610e135782610a6f82611683565b168611610d91578973d82fe82244ad01aad671576202f9b46b76fadfe2803b156104eb5786517f42842e0e00000000000000000000000000000000000000000000000000000000815233818b01908152306020820152604081018c90529091839183919082908490829060600103925af18015610d8757610d6f575b5050845160a0810181811067ffffffffffffffff821117610d415784888d94888e8e96610bde968d528781528c8a820199338b52818301958652606083019687526080830199848b52815260028c522090518155019651167fffffffffffffff0000000000000000000000000000000000000000000000000078ffffffffff00000000000000000000000000000000000000008854935160a01b16921617178555511683907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b5181547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f01b7eff0000000000000000000000000000000000000000000000000000000000001617905560035468010000000000000000811015610d15578089610c5092016003556115cc565b969080549760031b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff98898b831b921b1916179055610c8e88611ace565b505050939091600354988901988911610ce95750855197168752831690860152169083015233606083015260808201527f47dfb08cc4fd82397f1edce419ef34b2633cda1cb2c666492fccf3205686a6c69060a090a2805580f35b8b60116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60248a6041897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6041897f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b610d78906116cb565b610d83578938610aeb565b8980fd5b87513d84823e3d90fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d652063616e6e6f74206578636565642032207965617260448201527f73000000000000000000000000000000000000000000000000000000000000006064820152fd5b608487838751917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f556e6c6f636b2074696d65206d75737420626520696e2074686520667574757260448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b8460a4918451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152604460248201527f4e465420706f736974696f6e20616c7265616479206578697374732e20506c6560448201527f6173652075736520746865206465706f7369742066756e6374696f6e20696e7360648201527f74656164000000000000000000000000000000000000000000000000000000006084820152fd5b60848260208651917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602360248201527f546f6b656e206973206e6f742066726f6d2053776170582076332070726f746f60448201527f636f6c00000000000000000000000000000000000000000000000000000000006064820152fd5b5090346101be57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591610ffb6115a9565b611003611632565b61100b61176b565b8092848652600260205261102a60ff6001838920015460f01c16611dd1565b73ffffffffffffffffffffffffffffffffffffffff809216156111b5575b61105185611ace565b50505087606084959395516110658161170e565b82815282602082015282868201520152818351956110828761170e565b88875281602088019816978881528588016fffffffffffffffffffffffffffffffff93849283835260608b019484865289519b7ffc6f7865000000000000000000000000000000000000000000000000000000008d5251908c0152511660248a0152511660448801525116606486015282856084818b73d82fe82244ad01aad671576202f9b46b76fadfe25af19485156111ab5788908996611166575b50835194831685526020850152169082015260608101919091527ff2fdc3b7ce1325c8dbf3dd640e51e274386fda4f7340d94342f414809428054e90608090a36001805580f35b80939650848093969592503d83116111a4575b611183818361172a565b810103126111a0578151602090920151949293909291608061111f565b8780fd5b503d611179565b83513d8a823e3d90fd5b855482169350611048565b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb57602090516303bfc4008152f35b5050346104eb57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104eb576020905173d82fe82244ad01aad671576202f9b46b76fadfe28152f35b5090346101be5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be57813591611286611632565b61128e61176b565b82845260026020526112ab60ff6001848720015460f01c16611dd1565b828452600260205264ffffffffff806001848720015460c81c16904216106113ea578373ffffffffffffffffffffffffffffffffffffffff8154169173d82fe82244ad01aad671576202f9b46b76fadfe2803b156101be5784517f42842e0e0000000000000000000000000000000000000000000000000000000081523092810192835273ffffffffffffffffffffffffffffffffffffffff909416602083015260408201869052839182908490829060600103925af180156113e0576113cc575b508183526002602052822060010180547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690557fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232518280a26001805580f35b926113d9600192946116cb565b929061136d565b82513d86823e3d90fd5b602060849251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152602160248201527f5761697420756e74696c20756e6c6f636b54696d6520746f207769746864726160448201527f77000000000000000000000000000000000000000000000000000000000000006064820152fd5b50346101be5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101be576114a4611586565b506114ad6115a9565b506064359067ffffffffffffffff9081831161150c573660238401121561150c578201359081116104f857369101602401116104eb57602090517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b8480fd5b83346106b6576115386115223661153f565b9061152b611632565b61153361176b565b611b78565b6001805580f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6040910112611581576004359060243564ffffffffff811681036115815790565b600080fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b6003548110156116035760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361165357565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b906303bfc40064ffffffffff8093160191821161169c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81116116df57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6080810190811067ffffffffffffffff8211176116df57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176116df57604052565b60026001541461177c576002600155565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b519073ffffffffffffffffffffffffffffffffffffffff8216820361158157565b51908160020b820361158157565b51906fffffffffffffffffffffffffffffffff8216820361158157565b90816101609103126115815780516affffffffffffffffffffff811681036115815791611821602083016117a6565b9161182e604082016117a6565b9161183b606083016117a6565b91611848608082016117c7565b9161185560a083016117c7565b9161186260c082016117d5565b9160e0820151916101008101519161188a61014061188361012085016117d5565b93016117d5565b90565b3d156118e6573d9067ffffffffffffffff82116116df57604051916118da60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461172a565b82523d6000602084013e565b606090565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016073d82fe82244ad01aad671576202f9b46b76fadfe28183602481845afa600093849382611a8d575b50506119595750505061195361188d565b50600090565b60405180917fc45a015500000000000000000000000000000000000000000000000000000000825281600460209485935afa60009181611a56575b506119a5575050505061195361188d565b81906044604051809581937fd9a641e100000000000000000000000000000000000000000000000000000000835273ffffffffffffffffffffffffffffffffffffffff8099818094166004860152166024840152165afa918291600093611a1d575b5050611a1757505061195361188d565b16151590565b8181949293943d8311611a4f575b611a35818361172a565b810103126106b65750611a47906117a6565b903880611a07565b503d611a2b565b90918382813d8311611a86575b611a6d818361172a565b810103126106b65750611a7f906117a6565b9038611994565b503d611a63565b8091929550611ab2939450903d10611ac7575b611aaa818361172a565b8101906117f2565b50505050505050939250905091923880611942565b503d611aa0565b604051907f99fbab88000000000000000000000000000000000000000000000000000000008252600482015261016090818160248173d82fe82244ad01aad671576202f9b46b76fadfe25afa908115611b6c576000928392849285928692611b3a575b50509091929394565b935093505050611b569250803d10611ac757611aaa818361172a565b5050505092955092909350939291903880611b31565b6040513d6000823e3d90fd5b90816000526020906002825260016040600020019081549160ff8360f01c1615611d745764ffffffffff80831693818515159182611d64575b505080611d58575b15611cd457611bc9814216611683565b168311611c50577f44d655190c46f646e5f7ecadf60b64f5952d49a05efd1c58ffab0b3f3a71aa5f939291611c4791907fffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffffff7dffffffffff0000000000000000000000000000000000000000000000000083549260c81b169116179055565b604051908152a2565b608484604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152602560248201527f4e657720756e6c6f636b2074696d652063616e6e6f742065786365656420322060448201527f79656172730000000000000000000000000000000000000000000000000000006064820152fd5b608485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152603f60248201527f4e657720756e6c6f636b2074696d65206d75737420626520612066757475726560448201527f2074696d65206265796f6e64207468652070726576696f75732076616c7565006064820152fd5b50804216841015611bb9565b60c81c1685101590508138611bb1565b606484604051907f08c379a000000000000000000000000000000000000000000000000000000000825280600483015260248201527f54686520746f6b656e204944206973206e6f206c6f6e676572206163746976656044820152fd5b15611dd857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e465420706f736974696f6e206e6f7420796574206465706f736974656400006044820152fdfea2646970667358221220322e818daa7609c288831bd458579e97a41e585a8e5d7754eb8d190e8b201bff64736f6c63430008140033

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.