ETH Price: $3,340.38 (+0.03%)
 

Overview

ETH Balance

0.02550358903204681 ETH

Eth Value

$85.19 (@ $3,340.38/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Eth206076852024-08-25 19:26:59128 days ago1724614019IN
0x62ef2818...3b645b73C
0 ETH0.000072351.028684
Claim Eth205942522024-08-23 22:21:47130 days ago1724451707IN
0x62ef2818...3b645b73C
0 ETH0.000129771.84506962
Withdraw ETH205276312024-08-14 15:01:23139 days ago1723647683IN
0x62ef2818...3b645b73C
0 ETH0.000181845.40146424
Withdraw ETH205276212024-08-14 14:59:23139 days ago1723647563IN
0x62ef2818...3b645b73C
0 ETH0.000150724.47708444
Claim Eth205182602024-08-13 7:37:47140 days ago1723534667IN
0x62ef2818...3b645b73C
0 ETH0.000081631.16145364
Claim Eth205082292024-08-11 22:02:59142 days ago1723413779IN
0x62ef2818...3b645b73C
0 ETH0.000101031.43748145
Withdraw ETH204936742024-08-09 21:16:35144 days ago1723238195IN
0x62ef2818...3b645b73C
0 ETH0.0003935911.69143187
Withdraw ETH204936652024-08-09 21:14:47144 days ago1723238087IN
0x62ef2818...3b645b73C
0 ETH0.0004207712.50348401
Withdraw ETH204936552024-08-09 21:12:47144 days ago1723237967IN
0x62ef2818...3b645b73C
0 ETH0.0004194512.45966706
Withdraw ETH204936112024-08-09 21:03:59144 days ago1723237439IN
0x62ef2818...3b645b73C
0 ETH0.000221166.56711793
Withdraw ETH204931262024-08-09 19:26:59144 days ago1723231619IN
0x62ef2818...3b645b73C
0 ETH0.000108773.23097112
Claim Eth204535952024-08-04 7:08:23149 days ago1722755303IN
0x62ef2818...3b645b73C
0 ETH0.000104121.19139338
Claim Eth204268642024-07-31 13:34:35153 days ago1722432875IN
0x62ef2818...3b645b73C
0 ETH0.0012928414.79265083
Claim Eth204172372024-07-30 5:16:35155 days ago1722316595IN
0x62ef2818...3b645b73C
0 ETH0.000147122.09280492
Claim Eth204136682024-07-29 17:18:47155 days ago1722273527IN
0x62ef2818...3b645b73C
0 ETH0.000446836.35739236
Claim Eth204031882024-07-28 6:15:23156 days ago1722147323IN
0x62ef2818...3b645b73C
0 ETH0.000122081.73578813
Claim Eth203992042024-07-27 16:53:23157 days ago1722099203IN
0x62ef2818...3b645b73C
0 ETH0.0009873711.29739964
Claim Eth203991242024-07-27 16:37:11157 days ago1722098231IN
0x62ef2818...3b645b73C
0 ETH0.000300476.46897415
Claim Eth203991232024-07-27 16:36:59157 days ago1722098219IN
0x62ef2818...3b645b73C
0 ETH0.00044316.29996767
Claim Eth203969792024-07-27 9:27:11157 days ago1722072431IN
0x62ef2818...3b645b73C
0 ETH0.000123041.74914539
Claim Eth203964622024-07-27 7:43:23157 days ago1722066203IN
0x62ef2818...3b645b73C
0 ETH0.000098531.40098407
Claim Eth203960672024-07-27 6:23:35157 days ago1722061415IN
0x62ef2818...3b645b73C
0 ETH0.00014471.6545235
Claim Eth203958312024-07-27 5:36:11158 days ago1722058571IN
0x62ef2818...3b645b73C
0 ETH0.000117871.6761614
Claim Eth203932302024-07-26 20:52:35158 days ago1722027155IN
0x62ef2818...3b645b73C
0 ETH0.000175792.49854272
Claim Eth203921632024-07-26 17:18:11158 days ago1722014291IN
0x62ef2818...3b645b73C
0 ETH0.000370034.23219296
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
206076852024-08-25 19:26:59128 days ago1724614019
0x62ef2818...3b645b73C
0.00418509 ETH
205942522024-08-23 22:21:47130 days ago1724451707
0x62ef2818...3b645b73C
0.00343452 ETH
205276312024-08-14 15:01:23139 days ago1723647683
0x62ef2818...3b645b73C
4.3 ETH
205276212024-08-14 14:59:23139 days ago1723647563
0x62ef2818...3b645b73C
1.2 ETH
205182602024-08-13 7:37:47140 days ago1723534667
0x62ef2818...3b645b73C
0.00581517 ETH
205082292024-08-11 22:02:59142 days ago1723413779
0x62ef2818...3b645b73C
0.01705767 ETH
204936742024-08-09 21:16:35144 days ago1723238195
0x62ef2818...3b645b73C
5.75 ETH
204936652024-08-09 21:14:47144 days ago1723238087
0x62ef2818...3b645b73C
3.037115 ETH
204936552024-08-09 21:12:47144 days ago1723237967
0x62ef2818...3b645b73C
0.6 ETH
204936112024-08-09 21:03:59144 days ago1723237439
0x62ef2818...3b645b73C
1.1946 ETH
204931262024-08-09 19:26:59144 days ago1723231619
0x62ef2818...3b645b73C
3.17 ETH
204535952024-08-04 7:08:23149 days ago1722755303
0x62ef2818...3b645b73C
0.03681656 ETH
204268642024-07-31 13:34:35153 days ago1722432875
0x62ef2818...3b645b73C
0.00326428 ETH
204172372024-07-30 5:16:35155 days ago1722316595
0x62ef2818...3b645b73C
0.00391335 ETH
204136682024-07-29 17:18:47155 days ago1722273527
0x62ef2818...3b645b73C
0.0132656 ETH
204031882024-07-28 6:15:23156 days ago1722147323
0x62ef2818...3b645b73C
0.00756931 ETH
203992042024-07-27 16:53:23157 days ago1722099203
0x62ef2818...3b645b73C
0.03591737 ETH
203991232024-07-27 16:36:59157 days ago1722098219
0x62ef2818...3b645b73C
0.00372192 ETH
203969792024-07-27 9:27:11157 days ago1722072431
0x62ef2818...3b645b73C
0.01118537 ETH
203964622024-07-27 7:43:23157 days ago1722066203
0x62ef2818...3b645b73C
0.01016685 ETH
203960672024-07-27 6:23:35157 days ago1722061415
0x62ef2818...3b645b73C
0.15011518 ETH
203958312024-07-27 5:36:11158 days ago1722058571
0x62ef2818...3b645b73C
0.01319825 ETH
203932302024-07-26 20:52:35158 days ago1722027155
0x62ef2818...3b645b73C
0.00924355 ETH
203921632024-07-26 17:18:11158 days ago1722014291
0x62ef2818...3b645b73C
0.38151066 ETH
203918912024-07-26 16:22:47158 days ago1722010967
0x62ef2818...3b645b73C
0.01406594 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DeTensor_RevShare

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : DeTensor_RevShare.sol
/**
    DETENSOR RevShare

    Website  : https://detensor.io/
    DApp     : https://marketplace.detensor.io/
    Twitter  : https://twitter.com/DeTensorIO
    Telegram : https://t.me/DeTensor
*/


// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen - 1 != totalHashes) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen
                ? leaves[leafPos++]
                : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen - 1 != totalHashes) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen
                ? leaves[leafPos++]
                : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint256);
    function symbol() external view returns (uint256);
}

contract DeTensor_RevShare {
    IUniswapV2Router02 public router;

    address public token;

    address public owner;

    bool public claimingEnabled;

    bytes32 public merkleRoot;

    mapping(address => uint256) public amountClaimed;

    uint256 public totalEthForRewards;
    uint256 public lastEthForRewards;
    uint256 public totalClaimedEth;
    uint256 public totalRounds;
    uint256 public lastRewardTime;

    uint256 year = 365;
    uint256 public rewardReplenishFrequency = 7;

    uint256 constant PRECISION = 10**18;

    // Ineligible holders
    address[] private ineligibleHolders;

    error ExceedsClaim();
    error NotInMerkle();
    error ClaimingDisabled();

    constructor() {
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        token = 0xe6f4a40156C9E8c7Addda66848bbb99FDEdeCF84;
        owner = msg.sender;
        addIneligibleHolder(0x000000000000000000000000000000000000dEaD);
        addIneligibleHolder(0xe6f4a40156C9E8c7Addda66848bbb99FDEdeCF84);
        addIneligibleHolder(0xfC9052d6FC41d49a5ffFA8aA151171449D554a57);
        addIneligibleHolder(0x989FC3D2Dc85fe7f14CaD99AcEe99F112BaFE044);
        addIneligibleHolder(0x5D21791Fe514D9df8fF8A6A722BC9Be146893230);
        addIneligibleHolder(0x35Ca6a41252f7e0BCcdc1d7b2d5b6E2e35A7b483);
    }
   

    event Claim(
        address indexed to,
        uint256 amount,
        uint256 amountClaimed
    );

    modifier onlyOwner() {
        require(owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }
    
    function processClaim(
        address to,
        uint256 amount,
        bytes32[] calldata proof,
        uint256 claimAmount
    ) internal {
        // Throw if address tries to claim too many tokens
        if (amountClaimed[to] + claimAmount > amount)
            revert ExceedsClaim();
        if(!claimingEnabled)
            revert ClaimingDisabled();

        // Verify merkle proof, or revert if not in tree
        bytes32 leaf = keccak256(abi.encodePacked(to, amount));
        bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf);
        if (!isValidLeaf) revert NotInMerkle();

        // Track ETH claimed
        amountClaimed[to] += claimAmount;
        totalClaimedEth += claimAmount;
    }

    function claimTokens(
        uint256 amount,
        bytes32[] calldata proof,
        uint256 claimAmount,
        uint256 minAmount
    ) external {

        address to = msg.sender;

        // Check if the claimer is not an ineligible holder
        require(!isIneligibleHolder(to), "Claimer is ineligible.");

        processClaim(to, amount, proof, claimAmount);

        swapEthForTokens(claimAmount, to, minAmount);

        // Emit claim event
        emit Claim(to, amount, claimAmount);
    }

    function claimEth(
        uint256 amount,
        bytes32[] calldata proof,
        uint256 claimAmount
    ) external returns (bool success) {

        address to = msg.sender;

        // Check if the claimer is not an ineligible holder
        require(!isIneligibleHolder(to), "Claimer is ineligible.");

        processClaim(to, amount, proof, claimAmount);

        // Send ETH to address
        (success, ) = to.call{value: claimAmount}("");

        // Emit claim event
        emit Claim(to, amount, claimAmount);
    }

    function swapEthForTokens(uint256 ethAmount, address to, uint256 minAmount) internal {

        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = token;

        // make the swap
        router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: ethAmount
        }(
            minAmount,
            path,
            to,
            block.timestamp
        );
    }

    function getAmountOut(uint256 ethIn) external view returns(uint256){
        (uint256 reserveA, uint256 reserveB,) = IUniswapV2Pair(IUniswapV2Factory(router.factory()).getPair(token, router.WETH())).getReserves();

        return router.getAmountOut(ethIn, reserveB, reserveA);
    }

    function toggleClaiming() external onlyOwner {
        claimingEnabled = !claimingEnabled;
    }

    function transferOwnership(address _newOwner) external onlyOwner {
        owner = _newOwner;
    }

    function newRoot(bytes32 root) public payable onlyOwner {
        require(msg.value > 0, "Must send some ETH with the newRoot function.");

        totalEthForRewards += msg.value;
        lastEthForRewards = msg.value;
        rewardReplenishFrequency = (block.timestamp - lastRewardTime) / (60 * 60 * 24);

        // Check if rewardReplenishFrequency is 0, set it to 1
        if (rewardReplenishFrequency == 0) {
            rewardReplenishFrequency = 1;
        }

        merkleRoot = root;
        lastRewardTime = block.timestamp;
        totalRounds++; // Increment the totalRounds counter
    }

    function withdrawETH(uint256 _amount, address payable _to) external onlyOwner {
        require(_to != address(0), "Zero address is invalid.");
        require(_amount > 0, "Amount must be greater than zero.");
        require(address(this).balance >= _amount, "Not enough ETH!");
        
        // totalEthForRewards -= _amount;

        (bool success, ) = _to.call{value: _amount}("");
        require(success, "Transfer failed!");
    }

    function withdrawToken(uint256 _amount, address _to, address _token) external onlyOwner {
        require(_to != address(0), "Zero address is invalid.");
        require(_amount > 0, "Amount must be greater than zero.");
        require(_amount <= IERC20(_token).balanceOf(address(this)), "Not enough tokens!");

        bool success = IERC20(_token).transfer(msg.sender, _amount);
        require(success, "Transfer failed!");
    }

    // Calculate the adjusted token supply without decimals
    function calculateAdjustedTokenSupply() public view returns (uint256 adjustedSupplyWithNoDecimals) {
        adjustedSupplyWithNoDecimals = IERC20(token).totalSupply();

        // Subtract the token balance of each ineligible holder from the total supply
        for (uint256 i = 0; i < ineligibleHolders.length; i++) {
            uint256 removeFromSupply = IERC20(token).balanceOf(ineligibleHolders[i]);
            adjustedSupplyWithNoDecimals -= removeFromSupply;
        }

        // Adjust for decimals
        adjustedSupplyWithNoDecimals = adjustedSupplyWithNoDecimals / (10**IERC20(token).decimals());

        return adjustedSupplyWithNoDecimals;
    }

    // Calculate the price of 1 token in terms of WETH (output in Wei)
    function calculateTokenPriceInWETH() public view returns (uint256 tokenPriceInWei) {
        address[] memory path = new address[](2);
        path[0] = token;
        path[1] = router.WETH();

        // Get the amounts out for 1 unit of the token in terms of WETH
        uint256[] memory amountsOut = router.getAmountsOut(1e9, path);

        // Ensure that the token is the output token in the path
        require(amountsOut.length > 0 && amountsOut[amountsOut.length - 1] > 0, "Invalid output token");

        tokenPriceInWei = amountsOut[amountsOut.length - 1];
        return (tokenPriceInWei);
    }

    // Calculate the reward of 1 token (without decimals) in terms of WETH (output in Wei)
    function calculateRewardPerTokenInWETH() public view returns (uint256 rewardPerTokenInWei) {

        uint256 adjustedSupply = calculateAdjustedTokenSupply();

        // Get reward of 1 token
        rewardPerTokenInWei = totalEthForRewards / totalRounds / adjustedSupply;

        return (rewardPerTokenInWei);
    }

    // Calculate the rewards in terms of WETH
    // How much ETH will I receive if I hold `tokenAmount` number of tokens?
    function calculateRewardsInWETH(uint256 tokenAmount) public view returns (uint256 rewardsInWei) {
        uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH();

        // Calculate the rewards in WETH (output in Wei) 
        rewardsInWei = rewardPerTokenInWETH * tokenAmount; // tokenAmount with no decimals
    }

    // Calculate the holder rewards in terms of WETH
    function calculateHolderRewardsInWETH(address holderAddress) public view returns (uint256 holderRewardsInWei) {
        uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH();

        // Calculate holder rewards in WETH (output in Wei)
        holderRewardsInWei = rewardPerTokenInWETH * IERC20(token).balanceOf(holderAddress) / (10**IERC20(token).decimals()); // tokenAmount with no decimals
    }

    // Calculate APR and APY
    /* 
        Formula:
            uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH();
            uint256 tokenPriceInWETH = calculateTokenPriceInWETH();
        
            uint256 r = rewardPerTokenInWETH / tokenPriceInWETH;
            uint256 n = year / rewardReplenishFrequency;

            // Calculate APR
            APR = r * n;

            // Calculate APY
            APY = ((1 + (r / n))**n) - 1;
    */
    function calculateRAndN() public view returns (uint256 r, uint256 n) {
        uint256 rewardPerTokenInWETH = calculateRewardPerTokenInWETH();
        uint256 tokenPriceInWETH = calculateTokenPriceInWETH();

        r = (rewardPerTokenInWETH * PRECISION) / tokenPriceInWETH;
        n = year / rewardReplenishFrequency;

        return (r, n);
    }

    function calculateAPYAndAPR() public view returns (uint256 APR, uint256 APY) {
        uint256 r;
        uint256 n;
        (r, n) = calculateRAndN();

        // Calculate APR (precision in Wei, i.e., 18 decimals)
        APR = r * n;

        // Calculate APY iteratively (precision in Wei, i.e., 18 decimals)
        uint256 tempAPY = PRECISION;
        for (uint256 i = 0; i < n; i++) {
            tempAPY = (tempAPY * (r + PRECISION)) / PRECISION;
        }
        APY = tempAPY - PRECISION;
    }

    // Calculate custom volume
    // How much ETH will I receive if I hold `tokenAmount` number of tokens 
    // if `ethReplenishedForRewardsInWei` amount of ETH is added 
    // every `ethReplenishedFrequencyInDays` and what's the APY and APR?
    function calculateCustomVolume(
        uint256 tokenAmount, 
        uint256 ethReplenishedForRewardsInWei, 
        uint256 ethReplenishedFrequencyInDays
        ) public view returns (
        uint256 yourEthRewardsInWei,
        uint256 r,
        uint256 n,
        uint256 APR, 
        uint256 APY
        ) {
        
        uint256 adjustedSupply = calculateAdjustedTokenSupply();
        uint256 tokenPriceInWETH = calculateTokenPriceInWETH();
        uint256 rewardPerTokenInWETH = ethReplenishedForRewardsInWei / adjustedSupply;

        r = (rewardPerTokenInWETH * PRECISION) / tokenPriceInWETH;
        n = year / ethReplenishedFrequencyInDays;

        // Calculate the rewards in terms of WETH (output in Wei)
        yourEthRewardsInWei = rewardPerTokenInWETH * tokenAmount; // tokenAmount with no decimals

        // Calculate APR (precision in Wei, i.e., 18 decimals)
        APR = r * n;

        // Calculate APY iteratively (precision in Wei, i.e., 18 decimals)
        uint256 tempAPY = PRECISION;
        for (uint256 i = 0; i < n; i++) {
            tempAPY = (tempAPY * (r + PRECISION)) / PRECISION;
        }
        APY = tempAPY - PRECISION;
    }

    function updateRewardReplenishFrequency(uint256 _rewardReplenishFrequency) public onlyOwner {
        rewardReplenishFrequency =  _rewardReplenishFrequency;
    }

    function updateTotalRounds(uint256 _totalRounds) public onlyOwner {
        totalRounds =  _totalRounds;
    }

    function updateTotalEthForRewards(uint256 _totalEthForRewards) public onlyOwner {
        totalEthForRewards =  _totalEthForRewards;
    }

    function updateToken(address _token) public onlyOwner {
        token = _token;
    }

    function updateRouter(address _router) public onlyOwner {
        router = IUniswapV2Router02(_router);
    }

    function addIneligibleHolder(address user) public onlyOwner {
      ineligibleHolders.push(user);
    }
    
    function removeIneligibleHolder(address user) public onlyOwner {
      uint256 len = ineligibleHolders.length;
      for(uint i; i < len; i++) {
        if(ineligibleHolders[i] == user) {
          ineligibleHolders[i] = ineligibleHolders[len - 1];
          ineligibleHolders.pop();
          break;
        }
      }
    }

    // Function to check if an address is an ineligible holder
    function isIneligibleHolder(address user) public view returns (bool) {
        for (uint256 i = 0; i < ineligibleHolders.length; i++) {
            if (ineligibleHolders[i] == user) {
                return true;
            }
        }
        return false;
    }

    // Function to allow setting the claimed amount for addresses
    function setAmountClaimed(address _address, uint256 _amount) public onlyOwner {
        require(!isIneligibleHolder(_address), "Address is ineligible");
        amountClaimed[_address] = _amount;
    }

    function setAmountClaimedBatch(address[] calldata addresses, uint256[] calldata amounts) public onlyOwner {
        require(addresses.length == amounts.length, "Arrays must have the same length");

        for (uint256 i = 0; i < addresses.length; i++) {
            address _address = addresses[i];
            uint256 _amount = amounts[i];

            require(!isIneligibleHolder(_address), "Address is ineligible");
            amountClaimed[_address] = _amount;
        }
    }

}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ClaimingDisabled","type":"error"},{"inputs":[],"name":"ExceedsClaim","type":"error"},{"inputs":[],"name":"NotInMerkle","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"name":"Claim","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addIneligibleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateAPYAndAPR","outputs":[{"internalType":"uint256","name":"APR","type":"uint256"},{"internalType":"uint256","name":"APY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateAdjustedTokenSupply","outputs":[{"internalType":"uint256","name":"adjustedSupplyWithNoDecimals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"ethReplenishedForRewardsInWei","type":"uint256"},{"internalType":"uint256","name":"ethReplenishedFrequencyInDays","type":"uint256"}],"name":"calculateCustomVolume","outputs":[{"internalType":"uint256","name":"yourEthRewardsInWei","type":"uint256"},{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"uint256","name":"APR","type":"uint256"},{"internalType":"uint256","name":"APY","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holderAddress","type":"address"}],"name":"calculateHolderRewardsInWETH","outputs":[{"internalType":"uint256","name":"holderRewardsInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateRAndN","outputs":[{"internalType":"uint256","name":"r","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateRewardPerTokenInWETH","outputs":[{"internalType":"uint256","name":"rewardPerTokenInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"calculateRewardsInWETH","outputs":[{"internalType":"uint256","name":"rewardsInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTokenPriceInWETH","outputs":[{"internalType":"uint256","name":"tokenPriceInWei","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"claimAmount","type":"uint256"}],"name":"claimEth","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"claimAmount","type":"uint256"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethIn","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isIneligibleHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEthForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"newRoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeIneligibleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardReplenishFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setAmountClaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setAmountClaimedBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRounds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardReplenishFrequency","type":"uint256"}],"name":"updateRewardReplenishFrequency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalEthForRewards","type":"uint256"}],"name":"updateTotalEthForRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalRounds","type":"uint256"}],"name":"updateTotalRounds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261016d600a556007600b553480156200001b575f80fd5b505f80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560018054821673e6f4a40156c9e8c7addda66848bbb99fdedecf8417905560028054909116331790556200007a61dead6200011b565b6200009973e6f4a40156c9e8c7addda66848bbb99fdedecf846200011b565b620000b873fc9052d6fc41d49a5fffa8aa151171449d554a576200011b565b620000d773989fc3d2dc85fe7f14cad99acee99f112bafe0446200011b565b620000f6735d21791fe514d9df8ff8a6a722bc9be1468932306200011b565b620001157335ca6a41252f7e0bccdc1d7b2d5b6e2e35a7b4836200011b565b620001cb565b6002546001600160a01b031633146200017a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600c80546001810182555f919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b61253b80620001d95f395ff3fe60806040526004361061021d575f3560e01c80638a5682991161011e578063c864096a116100a8578063ddc2d56d1161006d578063ddc2d56d146105eb578063f2fde38b14610632578063f887ea4014610651578063f8c794d21461066f578063fc0c546a1461068e575f80fd5b8063c864096a1461054e578063c9466aee1461056d578063d134a3ec1461058c578063d7e1ea17146105ab578063dd6bff1a146105d6575f80fd5b8063b37b547c116100ee578063b37b547c146104c8578063b5d00973146104dc578063ba0271be146104fb578063c3f0a61a1461051a578063c851cc321461052f575f80fd5b80638a568299146104485780638da5cb5b1461045d5780639231cf74146104945780639ee47dbe146104a9575f80fd5b806336118b52116101aa578063591141881161016f57806359114188146103b85780635c195217146103d75780637391a85f146103f65780637ad3def2146104155780638010fc4514610434575f80fd5b806336118b521461033457806344fb3ceb146103535780634e237c0714610372578063537800cc1461038657806353e8320f14610399575f80fd5b806324f73a15116101f057806324f73a15146102ae578063258898b3146102c257806327fe69a9146102e15780632cf1bfae1461030a5780632eb4a7ab1461031f575f80fd5b8063063cf93c146102215780630e141a9b14610248578063171d0183146102785780632452dede14610299575b5f80fd5b34801561022c575f80fd5b506102356106ad565b6040519081526020015b60405180910390f35b348015610253575f80fd5b5060025461026890600160a01b900460ff1681565b604051901515815260200161023f565b348015610283575f80fd5b50610297610292366004611ea2565b6106da565b005b3480156102a4575f80fd5b5061023560055481565b3480156102b9575f80fd5b50610235610806565b3480156102cd575f80fd5b506102976102dc366004611ebd565b6109bf565b3480156102ec575f80fd5b506102f5610bbb565b6040805192835260208301919091520161023f565b348015610315575f80fd5b5061023560065481565b34801561032a575f80fd5b5061023560035481565b34801561033f575f80fd5b5061029761034e366004611efc565b610c0a565b34801561035e575f80fd5b5061023561036d366004611f2a565b610d78565b34801561037d575f80fd5b50610235610d95565b610297610394366004611f2a565b610faa565b3480156103a4575f80fd5b506102976103b3366004611f41565b6110a0565b3480156103c3575f80fd5b506102976103d2366004611ea2565b611133565b3480156103e2575f80fd5b506102356103f1366004611f2a565b6111ae565b348015610401575f80fd5b50610297610410366004611f2a565b6113fd565b348015610420575f80fd5b5061029761042f366004611ea2565b61142c565b34801561043f575f80fd5b50610297611478565b348015610453575f80fd5b5061023560085481565b348015610468575f80fd5b5060025461047c906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b34801561049f575f80fd5b5061023560095481565b3480156104b4575f80fd5b506102686104c3366004611fb3565b6114c3565b3480156104d3575f80fd5b506102f56115be565b3480156104e7575f80fd5b506102976104f6366004611f2a565b61163b565b348015610506575f80fd5b50610235610515366004611ea2565b61166a565b348015610525575f80fd5b50610235600b5481565b34801561053a575f80fd5b50610297610549366004611ea2565b611775565b348015610559575f80fd5b50610297610568366004612002565b6117c0565b348015610578575f80fd5b50610268610587366004611ea2565b611874565b348015610597575f80fd5b506102976105a6366004611f2a565b6118d0565b3480156105b6575f80fd5b506102356105c5366004611ea2565b60046020525f908152604090205481565b3480156105e1575f80fd5b5061023560075481565b3480156105f6575f80fd5b5061060a61060536600461205b565b6118ff565b604080519586526020860194909452928401919091526060830152608082015260a00161023f565b34801561063d575f80fd5b5061029761064c366004611ea2565b6119d6565b34801561065c575f80fd5b505f5461047c906001600160a01b031681565b34801561067a575f80fd5b50610297610689366004612084565b611a22565b348015610699575f80fd5b5060015461047c906001600160a01b031681565b5f806106b7610806565b9050806008546005546106ca91906120ff565b6106d491906120ff565b91505090565b6002546001600160a01b0316331461070d5760405162461bcd60e51b81526004016107049061211e565b60405180910390fd5b600c545f5b8181101561080157826001600160a01b0316600c828154811061073757610737612153565b5f918252602090912001546001600160a01b0316036107f957600c61075d600184612167565b8154811061076d5761076d612153565b5f91825260209091200154600c80546001600160a01b03909216918390811061079857610798612153565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c8054806107d4576107d461217a565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b600101610712565b505050565b600154604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610871919061218e565b90505f5b600c5481101561093057600154600c80545f926001600160a01b0316916370a0823191859081106108a8576108a8612153565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa1580156108f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610919919061218e565b90506109258184612167565b925050600101610875565b5060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a5919061218e565b6109b090600a612285565b6109ba90826120ff565b905090565b6002546001600160a01b031633146109e95760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038216610a3a5760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8311610a595760405162461bcd60e51b815260040161070490612290565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf919061218e565b831115610b035760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610704565b60405163a9059cbb60e01b8152336004820152602481018490525f906001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610b4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7391906122d1565b905080610bb55760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b50505050565b5f805f610bc66106ad565b90505f610bd1610d95565b905080610be6670de0b6b3a7640000846122f0565b610bf091906120ff565b9350600b54600a54610c0291906120ff565b925050509091565b6002546001600160a01b03163314610c345760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038116610c855760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8211610ca45760405162461bcd60e51b815260040161070490612290565b81471015610ce65760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204554482160881b6044820152606401610704565b5f816001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610d2f576040519150601f19603f3d011682016040523d82523d5f602084013e610d34565b606091505b50509050806108015760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b5f80610d826106ad565b9050610d8e83826122f0565b9392505050565b6040805160028082526060820183525f9283929190602083019080368337505060015482519293506001600160a01b0316918391505f90610dd857610dd8612153565b60200260200101906001600160a01b031690816001600160a01b0316815250505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6a919061231b565b81600181518110610e7d57610e7d612153565b6001600160a01b0392831660209182029290920101525f805460405163d06ca61f60e01b81529192169063d06ca61f90610ec190633b9aca00908690600401612379565b5f60405180830381865afa158015610edb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f029190810190612391565b90505f8151118015610f3957505f8160018351610f1f9190612167565b81518110610f2f57610f2f612153565b6020026020010151115b610f7c5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21037baba383aba103a37b5b2b760611b6044820152606401610704565b8060018251610f8b9190612167565b81518110610f9b57610f9b612153565b60200260200101519250505090565b6002546001600160a01b03163314610fd45760405162461bcd60e51b81526004016107049061211e565b5f34116110395760405162461bcd60e51b815260206004820152602d60248201527f4d7573742073656e6420736f6d6520455448207769746820746865206e65775260448201526c37b7ba10333ab731ba34b7b71760991b6064820152608401610704565b3460055f82825461104a919061244a565b90915550503460065560095462015180906110659042612167565b61106f91906120ff565b600b8190555f03611080576001600b555b60038190554260095560088054905f6110988361245d565b919050555050565b6002546001600160a01b031633146110ca5760405162461bcd60e51b81526004016107049061211e565b6110d382611874565b156111185760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055565b6002546001600160a01b0316331461115d5760405162461bcd60e51b81526004016107049061211e565b600c80546001810182555f919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b5f805f805f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611200573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611224919061231b565b6001545f54604080516315ab88c960e31b815290516001600160a01b039485169463e6a4390594811693169163ad5c46489160048083019260209291908290030181865afa158015611278573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129c919061231b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156112e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611309919061231b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611344573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113689190612490565b505f54604051630153543560e21b8152600481018890526001600160701b0392831660248201819052939092166044830181905294509192506001600160a01b039091169063054d50d490606401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f5919061218e565b949350505050565b6002546001600160a01b031633146114275760405162461bcd60e51b81526004016107049061211e565b600b55565b6002546001600160a01b031633146114565760405162461bcd60e51b81526004016107049061211e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146114a25760405162461bcd60e51b81526004016107049061211e565b6002805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f336114ce81611874565b156115145760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b6115218187878787611b61565b6040516001600160a01b0382169084905f81818185875af1925050503d805f8114611567576040519150601f19603f3d011682016040523d82523d5f602084013e61156c565b606091505b505060408051888152602081018690529193506001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a250949350505050565b5f805f806115ca610bbb565b90925090506115d981836122f0565b9350670de0b6b3a76400005f5b8281101561161f57670de0b6b3a7640000611601818661244a565b61160b90846122f0565b61161591906120ff565b91506001016115e6565b50611632670de0b6b3a764000082612167565b93505050509091565b6002546001600160a01b031633146116655760405162461bcd60e51b81526004016107049061211e565b600855565b5f806116746106ad565b905060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea919061218e565b6116f590600a612285565b6001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa15801561173d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611761919061218e565b61176b90836122f0565b610d8e91906120ff565b6002546001600160a01b0316331461179f5760405162461bcd60e51b81526004016107049061211e565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b336117ca81611874565b156118105760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b61181d8187878787611b61565b611828838284611cbd565b60408051878152602081018590526001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a2505050505050565b5f805b600c548110156118c857826001600160a01b0316600c828154811061189e5761189e612153565b5f918252602090912001546001600160a01b0316036118c05750600192915050565b600101611877565b505f92915050565b6002546001600160a01b031633146118fa5760405162461bcd60e51b81526004016107049061211e565b600555565b5f805f805f8061190d610806565b90505f611918610d95565b90505f611925838b6120ff565b90508161193a670de0b6b3a7640000836122f0565b61194491906120ff565b965088600a5461195491906120ff565b95506119608b826122f0565b975061196c86886122f0565b9450670de0b6b3a76400005f5b878110156119b257670de0b6b3a7640000611994818b61244a565b61199e90846122f0565b6119a891906120ff565b9150600101611979565b506119c5670de0b6b3a764000082612167565b945050505050939792965093509350565b6002546001600160a01b03163314611a005760405162461bcd60e51b81526004016107049061211e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314611a4c5760405162461bcd60e51b81526004016107049061211e565b828114611a9b5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610704565b5f5b83811015611b5a575f858583818110611ab857611ab8612153565b9050602002016020810190611acd9190611ea2565b90505f848484818110611ae257611ae2612153565b905060200201359050611af482611874565b15611b395760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055600101611a9d565b5050505050565b6001600160a01b0385165f908152600460205260409020548490611b8690839061244a565b1115611ba557604051632dc10b5760e21b815260040160405180910390fd5b600254600160a01b900460ff16611bcf57604051633056283560e01b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590525f906054016040516020818303038152906040528051906020012090505f611c508585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506003549150859050611e09565b905080611c705760405163452c2df160e11b815260040160405180910390fd5b6001600160a01b0387165f9081526004602052604081208054859290611c9790849061244a565b925050819055508260075f828254611caf919061244a565b909155505050505050505050565b6040805160028082526060820183525f926020830190803683370190505090505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4f919061231b565b815f81518110611d6157611d61612153565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611d9157611d91612153565b6001600160a01b0392831660209182029290920101525f5460405163b6f9de9560e01b815291169063b6f9de95908690611dd59086908690899042906004016124d1565b5f604051808303818588803b158015611dec575f80fd5b505af1158015611dfe573d5f803e3d5ffd5b505050505050505050565b5f82611e158584611e1e565b14949350505050565b5f81815b8451811015611e5857611e4e82868381518110611e4157611e41612153565b6020026020010151611e62565b9150600101611e22565b5090505b92915050565b5f818310611e7c575f828152602084905260409020610d8e565b505f9182526020526040902090565b6001600160a01b0381168114611e9f575f80fd5b50565b5f60208284031215611eb2575f80fd5b8135610d8e81611e8b565b5f805f60608486031215611ecf575f80fd5b833592506020840135611ee181611e8b565b91506040840135611ef181611e8b565b809150509250925092565b5f8060408385031215611f0d575f80fd5b823591506020830135611f1f81611e8b565b809150509250929050565b5f60208284031215611f3a575f80fd5b5035919050565b5f8060408385031215611f52575f80fd5b8235611f5d81611e8b565b946020939093013593505050565b5f8083601f840112611f7b575f80fd5b50813567ffffffffffffffff811115611f92575f80fd5b6020830191508360208260051b8501011115611fac575f80fd5b9250929050565b5f805f8060608587031215611fc6575f80fd5b84359350602085013567ffffffffffffffff811115611fe3575f80fd5b611fef87828801611f6b565b9598909750949560400135949350505050565b5f805f805f60808688031215612016575f80fd5b85359450602086013567ffffffffffffffff811115612033575f80fd5b61203f88828901611f6b565b9699909850959660408101359660609091013595509350505050565b5f805f6060848603121561206d575f80fd5b505081359360208301359350604090920135919050565b5f805f8060408587031215612097575f80fd5b843567ffffffffffffffff808211156120ae575f80fd5b6120ba88838901611f6b565b909650945060208701359150808211156120d2575f80fd5b506120df87828801611f6b565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b5f8261211957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b81810381811115611e5c57611e5c6120eb565b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561219e575f80fd5b5051919050565b600181815b808511156121df57815f19048211156121c5576121c56120eb565b808516156121d257918102915b93841c93908002906121aa565b509250929050565b5f826121f557506001611e5c565b8161220157505f611e5c565b816001811461221757600281146122215761223d565b6001915050611e5c565b60ff841115612232576122326120eb565b50506001821b611e5c565b5060208310610133831016604e8410600b8410161715612260575081810a611e5c565b61226a83836121a5565b805f190482111561227d5761227d6120eb565b029392505050565b5f610d8e83836121e7565b60208082526021908201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6040820152601760f91b606082015260800190565b5f602082840312156122e1575f80fd5b81518015158114610d8e575f80fd5b8082028115828204841417611e5c57611e5c6120eb565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561232b575f80fd5b8151610d8e81611e8b565b5f815180845260208085019450602084015f5b8381101561236e5781516001600160a01b031687529582019590820190600101612349565b509495945050505050565b828152604060208201525f6113f56040830184612336565b5f60208083850312156123a2575f80fd5b825167ffffffffffffffff808211156123b9575f80fd5b818501915085601f8301126123cc575f80fd5b8151818111156123de576123de612307565b8060051b604051601f19603f8301168101818110858211171561240357612403612307565b604052918252848201925083810185019188831115612420575f80fd5b938501935b8285101561243e57845184529385019392850192612425565b98975050505050505050565b80820180821115611e5c57611e5c6120eb565b5f6001820161246e5761246e6120eb565b5060010190565b80516001600160701b038116811461248b575f80fd5b919050565b5f805f606084860312156124a2575f80fd5b6124ab84612475565b92506124b960208501612475565b9150604084015163ffffffff81168114611ef1575f80fd5b848152608060208201525f6124e96080830186612336565b6001600160a01b0394909416604083015250606001529291505056fea2646970667358221220e598968c4786cfe64026a259ed7372817a6a39230c51648b4ac7e17c2f874b9464736f6c63430008170033

Deployed Bytecode

0x60806040526004361061021d575f3560e01c80638a5682991161011e578063c864096a116100a8578063ddc2d56d1161006d578063ddc2d56d146105eb578063f2fde38b14610632578063f887ea4014610651578063f8c794d21461066f578063fc0c546a1461068e575f80fd5b8063c864096a1461054e578063c9466aee1461056d578063d134a3ec1461058c578063d7e1ea17146105ab578063dd6bff1a146105d6575f80fd5b8063b37b547c116100ee578063b37b547c146104c8578063b5d00973146104dc578063ba0271be146104fb578063c3f0a61a1461051a578063c851cc321461052f575f80fd5b80638a568299146104485780638da5cb5b1461045d5780639231cf74146104945780639ee47dbe146104a9575f80fd5b806336118b52116101aa578063591141881161016f57806359114188146103b85780635c195217146103d75780637391a85f146103f65780637ad3def2146104155780638010fc4514610434575f80fd5b806336118b521461033457806344fb3ceb146103535780634e237c0714610372578063537800cc1461038657806353e8320f14610399575f80fd5b806324f73a15116101f057806324f73a15146102ae578063258898b3146102c257806327fe69a9146102e15780632cf1bfae1461030a5780632eb4a7ab1461031f575f80fd5b8063063cf93c146102215780630e141a9b14610248578063171d0183146102785780632452dede14610299575b5f80fd5b34801561022c575f80fd5b506102356106ad565b6040519081526020015b60405180910390f35b348015610253575f80fd5b5060025461026890600160a01b900460ff1681565b604051901515815260200161023f565b348015610283575f80fd5b50610297610292366004611ea2565b6106da565b005b3480156102a4575f80fd5b5061023560055481565b3480156102b9575f80fd5b50610235610806565b3480156102cd575f80fd5b506102976102dc366004611ebd565b6109bf565b3480156102ec575f80fd5b506102f5610bbb565b6040805192835260208301919091520161023f565b348015610315575f80fd5b5061023560065481565b34801561032a575f80fd5b5061023560035481565b34801561033f575f80fd5b5061029761034e366004611efc565b610c0a565b34801561035e575f80fd5b5061023561036d366004611f2a565b610d78565b34801561037d575f80fd5b50610235610d95565b610297610394366004611f2a565b610faa565b3480156103a4575f80fd5b506102976103b3366004611f41565b6110a0565b3480156103c3575f80fd5b506102976103d2366004611ea2565b611133565b3480156103e2575f80fd5b506102356103f1366004611f2a565b6111ae565b348015610401575f80fd5b50610297610410366004611f2a565b6113fd565b348015610420575f80fd5b5061029761042f366004611ea2565b61142c565b34801561043f575f80fd5b50610297611478565b348015610453575f80fd5b5061023560085481565b348015610468575f80fd5b5060025461047c906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b34801561049f575f80fd5b5061023560095481565b3480156104b4575f80fd5b506102686104c3366004611fb3565b6114c3565b3480156104d3575f80fd5b506102f56115be565b3480156104e7575f80fd5b506102976104f6366004611f2a565b61163b565b348015610506575f80fd5b50610235610515366004611ea2565b61166a565b348015610525575f80fd5b50610235600b5481565b34801561053a575f80fd5b50610297610549366004611ea2565b611775565b348015610559575f80fd5b50610297610568366004612002565b6117c0565b348015610578575f80fd5b50610268610587366004611ea2565b611874565b348015610597575f80fd5b506102976105a6366004611f2a565b6118d0565b3480156105b6575f80fd5b506102356105c5366004611ea2565b60046020525f908152604090205481565b3480156105e1575f80fd5b5061023560075481565b3480156105f6575f80fd5b5061060a61060536600461205b565b6118ff565b604080519586526020860194909452928401919091526060830152608082015260a00161023f565b34801561063d575f80fd5b5061029761064c366004611ea2565b6119d6565b34801561065c575f80fd5b505f5461047c906001600160a01b031681565b34801561067a575f80fd5b50610297610689366004612084565b611a22565b348015610699575f80fd5b5060015461047c906001600160a01b031681565b5f806106b7610806565b9050806008546005546106ca91906120ff565b6106d491906120ff565b91505090565b6002546001600160a01b0316331461070d5760405162461bcd60e51b81526004016107049061211e565b60405180910390fd5b600c545f5b8181101561080157826001600160a01b0316600c828154811061073757610737612153565b5f918252602090912001546001600160a01b0316036107f957600c61075d600184612167565b8154811061076d5761076d612153565b5f91825260209091200154600c80546001600160a01b03909216918390811061079857610798612153565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c8054806107d4576107d461217a565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b600101610712565b505050565b600154604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610871919061218e565b90505f5b600c5481101561093057600154600c80545f926001600160a01b0316916370a0823191859081106108a8576108a8612153565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa1580156108f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610919919061218e565b90506109258184612167565b925050600101610875565b5060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a5919061218e565b6109b090600a612285565b6109ba90826120ff565b905090565b6002546001600160a01b031633146109e95760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038216610a3a5760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8311610a595760405162461bcd60e51b815260040161070490612290565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf919061218e565b831115610b035760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610704565b60405163a9059cbb60e01b8152336004820152602481018490525f906001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610b4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7391906122d1565b905080610bb55760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b50505050565b5f805f610bc66106ad565b90505f610bd1610d95565b905080610be6670de0b6b3a7640000846122f0565b610bf091906120ff565b9350600b54600a54610c0291906120ff565b925050509091565b6002546001600160a01b03163314610c345760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038116610c855760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8211610ca45760405162461bcd60e51b815260040161070490612290565b81471015610ce65760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204554482160881b6044820152606401610704565b5f816001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610d2f576040519150601f19603f3d011682016040523d82523d5f602084013e610d34565b606091505b50509050806108015760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b5f80610d826106ad565b9050610d8e83826122f0565b9392505050565b6040805160028082526060820183525f9283929190602083019080368337505060015482519293506001600160a01b0316918391505f90610dd857610dd8612153565b60200260200101906001600160a01b031690816001600160a01b0316815250505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6a919061231b565b81600181518110610e7d57610e7d612153565b6001600160a01b0392831660209182029290920101525f805460405163d06ca61f60e01b81529192169063d06ca61f90610ec190633b9aca00908690600401612379565b5f60405180830381865afa158015610edb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f029190810190612391565b90505f8151118015610f3957505f8160018351610f1f9190612167565b81518110610f2f57610f2f612153565b6020026020010151115b610f7c5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21037baba383aba103a37b5b2b760611b6044820152606401610704565b8060018251610f8b9190612167565b81518110610f9b57610f9b612153565b60200260200101519250505090565b6002546001600160a01b03163314610fd45760405162461bcd60e51b81526004016107049061211e565b5f34116110395760405162461bcd60e51b815260206004820152602d60248201527f4d7573742073656e6420736f6d6520455448207769746820746865206e65775260448201526c37b7ba10333ab731ba34b7b71760991b6064820152608401610704565b3460055f82825461104a919061244a565b90915550503460065560095462015180906110659042612167565b61106f91906120ff565b600b8190555f03611080576001600b555b60038190554260095560088054905f6110988361245d565b919050555050565b6002546001600160a01b031633146110ca5760405162461bcd60e51b81526004016107049061211e565b6110d382611874565b156111185760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055565b6002546001600160a01b0316331461115d5760405162461bcd60e51b81526004016107049061211e565b600c80546001810182555f919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b5f805f805f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611200573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611224919061231b565b6001545f54604080516315ab88c960e31b815290516001600160a01b039485169463e6a4390594811693169163ad5c46489160048083019260209291908290030181865afa158015611278573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129c919061231b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156112e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611309919061231b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611344573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113689190612490565b505f54604051630153543560e21b8152600481018890526001600160701b0392831660248201819052939092166044830181905294509192506001600160a01b039091169063054d50d490606401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f5919061218e565b949350505050565b6002546001600160a01b031633146114275760405162461bcd60e51b81526004016107049061211e565b600b55565b6002546001600160a01b031633146114565760405162461bcd60e51b81526004016107049061211e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146114a25760405162461bcd60e51b81526004016107049061211e565b6002805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f336114ce81611874565b156115145760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b6115218187878787611b61565b6040516001600160a01b0382169084905f81818185875af1925050503d805f8114611567576040519150601f19603f3d011682016040523d82523d5f602084013e61156c565b606091505b505060408051888152602081018690529193506001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a250949350505050565b5f805f806115ca610bbb565b90925090506115d981836122f0565b9350670de0b6b3a76400005f5b8281101561161f57670de0b6b3a7640000611601818661244a565b61160b90846122f0565b61161591906120ff565b91506001016115e6565b50611632670de0b6b3a764000082612167565b93505050509091565b6002546001600160a01b031633146116655760405162461bcd60e51b81526004016107049061211e565b600855565b5f806116746106ad565b905060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea919061218e565b6116f590600a612285565b6001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa15801561173d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611761919061218e565b61176b90836122f0565b610d8e91906120ff565b6002546001600160a01b0316331461179f5760405162461bcd60e51b81526004016107049061211e565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b336117ca81611874565b156118105760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b61181d8187878787611b61565b611828838284611cbd565b60408051878152602081018590526001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a2505050505050565b5f805b600c548110156118c857826001600160a01b0316600c828154811061189e5761189e612153565b5f918252602090912001546001600160a01b0316036118c05750600192915050565b600101611877565b505f92915050565b6002546001600160a01b031633146118fa5760405162461bcd60e51b81526004016107049061211e565b600555565b5f805f805f8061190d610806565b90505f611918610d95565b90505f611925838b6120ff565b90508161193a670de0b6b3a7640000836122f0565b61194491906120ff565b965088600a5461195491906120ff565b95506119608b826122f0565b975061196c86886122f0565b9450670de0b6b3a76400005f5b878110156119b257670de0b6b3a7640000611994818b61244a565b61199e90846122f0565b6119a891906120ff565b9150600101611979565b506119c5670de0b6b3a764000082612167565b945050505050939792965093509350565b6002546001600160a01b03163314611a005760405162461bcd60e51b81526004016107049061211e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314611a4c5760405162461bcd60e51b81526004016107049061211e565b828114611a9b5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610704565b5f5b83811015611b5a575f858583818110611ab857611ab8612153565b9050602002016020810190611acd9190611ea2565b90505f848484818110611ae257611ae2612153565b905060200201359050611af482611874565b15611b395760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055600101611a9d565b5050505050565b6001600160a01b0385165f908152600460205260409020548490611b8690839061244a565b1115611ba557604051632dc10b5760e21b815260040160405180910390fd5b600254600160a01b900460ff16611bcf57604051633056283560e01b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590525f906054016040516020818303038152906040528051906020012090505f611c508585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506003549150859050611e09565b905080611c705760405163452c2df160e11b815260040160405180910390fd5b6001600160a01b0387165f9081526004602052604081208054859290611c9790849061244a565b925050819055508260075f828254611caf919061244a565b909155505050505050505050565b6040805160028082526060820183525f926020830190803683370190505090505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4f919061231b565b815f81518110611d6157611d61612153565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611d9157611d91612153565b6001600160a01b0392831660209182029290920101525f5460405163b6f9de9560e01b815291169063b6f9de95908690611dd59086908690899042906004016124d1565b5f604051808303818588803b158015611dec575f80fd5b505af1158015611dfe573d5f803e3d5ffd5b505050505050505050565b5f82611e158584611e1e565b14949350505050565b5f81815b8451811015611e5857611e4e82868381518110611e4157611e41612153565b6020026020010151611e62565b9150600101611e22565b5090505b92915050565b5f818310611e7c575f828152602084905260409020610d8e565b505f9182526020526040902090565b6001600160a01b0381168114611e9f575f80fd5b50565b5f60208284031215611eb2575f80fd5b8135610d8e81611e8b565b5f805f60608486031215611ecf575f80fd5b833592506020840135611ee181611e8b565b91506040840135611ef181611e8b565b809150509250925092565b5f8060408385031215611f0d575f80fd5b823591506020830135611f1f81611e8b565b809150509250929050565b5f60208284031215611f3a575f80fd5b5035919050565b5f8060408385031215611f52575f80fd5b8235611f5d81611e8b565b946020939093013593505050565b5f8083601f840112611f7b575f80fd5b50813567ffffffffffffffff811115611f92575f80fd5b6020830191508360208260051b8501011115611fac575f80fd5b9250929050565b5f805f8060608587031215611fc6575f80fd5b84359350602085013567ffffffffffffffff811115611fe3575f80fd5b611fef87828801611f6b565b9598909750949560400135949350505050565b5f805f805f60808688031215612016575f80fd5b85359450602086013567ffffffffffffffff811115612033575f80fd5b61203f88828901611f6b565b9699909850959660408101359660609091013595509350505050565b5f805f6060848603121561206d575f80fd5b505081359360208301359350604090920135919050565b5f805f8060408587031215612097575f80fd5b843567ffffffffffffffff808211156120ae575f80fd5b6120ba88838901611f6b565b909650945060208701359150808211156120d2575f80fd5b506120df87828801611f6b565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b5f8261211957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b81810381811115611e5c57611e5c6120eb565b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561219e575f80fd5b5051919050565b600181815b808511156121df57815f19048211156121c5576121c56120eb565b808516156121d257918102915b93841c93908002906121aa565b509250929050565b5f826121f557506001611e5c565b8161220157505f611e5c565b816001811461221757600281146122215761223d565b6001915050611e5c565b60ff841115612232576122326120eb565b50506001821b611e5c565b5060208310610133831016604e8410600b8410161715612260575081810a611e5c565b61226a83836121a5565b805f190482111561227d5761227d6120eb565b029392505050565b5f610d8e83836121e7565b60208082526021908201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6040820152601760f91b606082015260800190565b5f602082840312156122e1575f80fd5b81518015158114610d8e575f80fd5b8082028115828204841417611e5c57611e5c6120eb565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561232b575f80fd5b8151610d8e81611e8b565b5f815180845260208085019450602084015f5b8381101561236e5781516001600160a01b031687529582019590820190600101612349565b509495945050505050565b828152604060208201525f6113f56040830184612336565b5f60208083850312156123a2575f80fd5b825167ffffffffffffffff808211156123b9575f80fd5b818501915085601f8301126123cc575f80fd5b8151818111156123de576123de612307565b8060051b604051601f19603f8301168101818110858211171561240357612403612307565b604052918252848201925083810185019188831115612420575f80fd5b938501935b8285101561243e57845184529385019392850192612425565b98975050505050505050565b80820180821115611e5c57611e5c6120eb565b5f6001820161246e5761246e6120eb565b5060010190565b80516001600160701b038116811461248b575f80fd5b919050565b5f805f606084860312156124a2575f80fd5b6124ab84612475565b92506124b960208501612475565b9150604084015163ffffffff81168114611ef1575f80fd5b848152608060208201525f6124e96080830186612336565b6001600160a01b0394909416604083015250606001529291505056fea2646970667358221220e598968c4786cfe64026a259ed7372817a6a39230c51648b4ac7e17c2f874b9464736f6c63430008170033

Block Transaction Difficulty 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
Loading...
Loading
[ Download: CSV Export  ]
[ 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.