More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 477 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Eth | 20607685 | 128 days ago | IN | 0 ETH | 0.00007235 | ||||
Claim Eth | 20594252 | 130 days ago | IN | 0 ETH | 0.00012977 | ||||
Withdraw ETH | 20527631 | 139 days ago | IN | 0 ETH | 0.00018184 | ||||
Withdraw ETH | 20527621 | 139 days ago | IN | 0 ETH | 0.00015072 | ||||
Claim Eth | 20518260 | 140 days ago | IN | 0 ETH | 0.00008163 | ||||
Claim Eth | 20508229 | 142 days ago | IN | 0 ETH | 0.00010103 | ||||
Withdraw ETH | 20493674 | 144 days ago | IN | 0 ETH | 0.00039359 | ||||
Withdraw ETH | 20493665 | 144 days ago | IN | 0 ETH | 0.00042077 | ||||
Withdraw ETH | 20493655 | 144 days ago | IN | 0 ETH | 0.00041945 | ||||
Withdraw ETH | 20493611 | 144 days ago | IN | 0 ETH | 0.00022116 | ||||
Withdraw ETH | 20493126 | 144 days ago | IN | 0 ETH | 0.00010877 | ||||
Claim Eth | 20453595 | 149 days ago | IN | 0 ETH | 0.00010412 | ||||
Claim Eth | 20426864 | 153 days ago | IN | 0 ETH | 0.00129284 | ||||
Claim Eth | 20417237 | 155 days ago | IN | 0 ETH | 0.00014712 | ||||
Claim Eth | 20413668 | 155 days ago | IN | 0 ETH | 0.00044683 | ||||
Claim Eth | 20403188 | 156 days ago | IN | 0 ETH | 0.00012208 | ||||
Claim Eth | 20399204 | 157 days ago | IN | 0 ETH | 0.00098737 | ||||
Claim Eth | 20399124 | 157 days ago | IN | 0 ETH | 0.00030047 | ||||
Claim Eth | 20399123 | 157 days ago | IN | 0 ETH | 0.0004431 | ||||
Claim Eth | 20396979 | 157 days ago | IN | 0 ETH | 0.00012304 | ||||
Claim Eth | 20396462 | 157 days ago | IN | 0 ETH | 0.00009853 | ||||
Claim Eth | 20396067 | 157 days ago | IN | 0 ETH | 0.0001447 | ||||
Claim Eth | 20395831 | 158 days ago | IN | 0 ETH | 0.00011787 | ||||
Claim Eth | 20393230 | 158 days ago | IN | 0 ETH | 0.00017579 | ||||
Claim Eth | 20392163 | 158 days ago | IN | 0 ETH | 0.00037003 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20607685 | 128 days ago | 0.00418509 ETH | ||||
20594252 | 130 days ago | 0.00343452 ETH | ||||
20527631 | 139 days ago | 4.3 ETH | ||||
20527621 | 139 days ago | 1.2 ETH | ||||
20518260 | 140 days ago | 0.00581517 ETH | ||||
20508229 | 142 days ago | 0.01705767 ETH | ||||
20493674 | 144 days ago | 5.75 ETH | ||||
20493665 | 144 days ago | 3.037115 ETH | ||||
20493655 | 144 days ago | 0.6 ETH | ||||
20493611 | 144 days ago | 1.1946 ETH | ||||
20493126 | 144 days ago | 3.17 ETH | ||||
20453595 | 149 days ago | 0.03681656 ETH | ||||
20426864 | 153 days ago | 0.00326428 ETH | ||||
20417237 | 155 days ago | 0.00391335 ETH | ||||
20413668 | 155 days ago | 0.0132656 ETH | ||||
20403188 | 156 days ago | 0.00756931 ETH | ||||
20399204 | 157 days ago | 0.03591737 ETH | ||||
20399123 | 157 days ago | 0.00372192 ETH | ||||
20396979 | 157 days ago | 0.01118537 ETH | ||||
20396462 | 157 days ago | 0.01016685 ETH | ||||
20396067 | 157 days ago | 0.15011518 ETH | ||||
20395831 | 158 days ago | 0.01319825 ETH | ||||
20393230 | 158 days ago | 0.00924355 ETH | ||||
20392163 | 158 days ago | 0.38151066 ETH | ||||
20391891 | 158 days ago | 0.01406594 ETH |
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
Contract Source Code (Solidity Standard Json-Input format)
/** 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; } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
608060405261016d600a556007600b553480156200001b575f80fd5b505f80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560018054821673e6f4a40156c9e8c7addda66848bbb99fdedecf8417905560028054909116331790556200007a61dead6200011b565b6200009973e6f4a40156c9e8c7addda66848bbb99fdedecf846200011b565b620000b873fc9052d6fc41d49a5fffa8aa151171449d554a576200011b565b620000d773989fc3d2dc85fe7f14cad99acee99f112bafe0446200011b565b620000f6735d21791fe514d9df8ff8a6a722bc9be1468932306200011b565b620001157335ca6a41252f7e0bccdc1d7b2d5b6e2e35a7b4836200011b565b620001cb565b6002546001600160a01b031633146200017a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600c80546001810182555f919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b61253b80620001d95f395ff3fe60806040526004361061021d575f3560e01c80638a5682991161011e578063c864096a116100a8578063ddc2d56d1161006d578063ddc2d56d146105eb578063f2fde38b14610632578063f887ea4014610651578063f8c794d21461066f578063fc0c546a1461068e575f80fd5b8063c864096a1461054e578063c9466aee1461056d578063d134a3ec1461058c578063d7e1ea17146105ab578063dd6bff1a146105d6575f80fd5b8063b37b547c116100ee578063b37b547c146104c8578063b5d00973146104dc578063ba0271be146104fb578063c3f0a61a1461051a578063c851cc321461052f575f80fd5b80638a568299146104485780638da5cb5b1461045d5780639231cf74146104945780639ee47dbe146104a9575f80fd5b806336118b52116101aa578063591141881161016f57806359114188146103b85780635c195217146103d75780637391a85f146103f65780637ad3def2146104155780638010fc4514610434575f80fd5b806336118b521461033457806344fb3ceb146103535780634e237c0714610372578063537800cc1461038657806353e8320f14610399575f80fd5b806324f73a15116101f057806324f73a15146102ae578063258898b3146102c257806327fe69a9146102e15780632cf1bfae1461030a5780632eb4a7ab1461031f575f80fd5b8063063cf93c146102215780630e141a9b14610248578063171d0183146102785780632452dede14610299575b5f80fd5b34801561022c575f80fd5b506102356106ad565b6040519081526020015b60405180910390f35b348015610253575f80fd5b5060025461026890600160a01b900460ff1681565b604051901515815260200161023f565b348015610283575f80fd5b50610297610292366004611ea2565b6106da565b005b3480156102a4575f80fd5b5061023560055481565b3480156102b9575f80fd5b50610235610806565b3480156102cd575f80fd5b506102976102dc366004611ebd565b6109bf565b3480156102ec575f80fd5b506102f5610bbb565b6040805192835260208301919091520161023f565b348015610315575f80fd5b5061023560065481565b34801561032a575f80fd5b5061023560035481565b34801561033f575f80fd5b5061029761034e366004611efc565b610c0a565b34801561035e575f80fd5b5061023561036d366004611f2a565b610d78565b34801561037d575f80fd5b50610235610d95565b610297610394366004611f2a565b610faa565b3480156103a4575f80fd5b506102976103b3366004611f41565b6110a0565b3480156103c3575f80fd5b506102976103d2366004611ea2565b611133565b3480156103e2575f80fd5b506102356103f1366004611f2a565b6111ae565b348015610401575f80fd5b50610297610410366004611f2a565b6113fd565b348015610420575f80fd5b5061029761042f366004611ea2565b61142c565b34801561043f575f80fd5b50610297611478565b348015610453575f80fd5b5061023560085481565b348015610468575f80fd5b5060025461047c906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b34801561049f575f80fd5b5061023560095481565b3480156104b4575f80fd5b506102686104c3366004611fb3565b6114c3565b3480156104d3575f80fd5b506102f56115be565b3480156104e7575f80fd5b506102976104f6366004611f2a565b61163b565b348015610506575f80fd5b50610235610515366004611ea2565b61166a565b348015610525575f80fd5b50610235600b5481565b34801561053a575f80fd5b50610297610549366004611ea2565b611775565b348015610559575f80fd5b50610297610568366004612002565b6117c0565b348015610578575f80fd5b50610268610587366004611ea2565b611874565b348015610597575f80fd5b506102976105a6366004611f2a565b6118d0565b3480156105b6575f80fd5b506102356105c5366004611ea2565b60046020525f908152604090205481565b3480156105e1575f80fd5b5061023560075481565b3480156105f6575f80fd5b5061060a61060536600461205b565b6118ff565b604080519586526020860194909452928401919091526060830152608082015260a00161023f565b34801561063d575f80fd5b5061029761064c366004611ea2565b6119d6565b34801561065c575f80fd5b505f5461047c906001600160a01b031681565b34801561067a575f80fd5b50610297610689366004612084565b611a22565b348015610699575f80fd5b5060015461047c906001600160a01b031681565b5f806106b7610806565b9050806008546005546106ca91906120ff565b6106d491906120ff565b91505090565b6002546001600160a01b0316331461070d5760405162461bcd60e51b81526004016107049061211e565b60405180910390fd5b600c545f5b8181101561080157826001600160a01b0316600c828154811061073757610737612153565b5f918252602090912001546001600160a01b0316036107f957600c61075d600184612167565b8154811061076d5761076d612153565b5f91825260209091200154600c80546001600160a01b03909216918390811061079857610798612153565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c8054806107d4576107d461217a565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b600101610712565b505050565b600154604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610871919061218e565b90505f5b600c5481101561093057600154600c80545f926001600160a01b0316916370a0823191859081106108a8576108a8612153565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa1580156108f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610919919061218e565b90506109258184612167565b925050600101610875565b5060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a5919061218e565b6109b090600a612285565b6109ba90826120ff565b905090565b6002546001600160a01b031633146109e95760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038216610a3a5760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8311610a595760405162461bcd60e51b815260040161070490612290565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf919061218e565b831115610b035760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610704565b60405163a9059cbb60e01b8152336004820152602481018490525f906001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610b4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7391906122d1565b905080610bb55760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b50505050565b5f805f610bc66106ad565b90505f610bd1610d95565b905080610be6670de0b6b3a7640000846122f0565b610bf091906120ff565b9350600b54600a54610c0291906120ff565b925050509091565b6002546001600160a01b03163314610c345760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038116610c855760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8211610ca45760405162461bcd60e51b815260040161070490612290565b81471015610ce65760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204554482160881b6044820152606401610704565b5f816001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610d2f576040519150601f19603f3d011682016040523d82523d5f602084013e610d34565b606091505b50509050806108015760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b5f80610d826106ad565b9050610d8e83826122f0565b9392505050565b6040805160028082526060820183525f9283929190602083019080368337505060015482519293506001600160a01b0316918391505f90610dd857610dd8612153565b60200260200101906001600160a01b031690816001600160a01b0316815250505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6a919061231b565b81600181518110610e7d57610e7d612153565b6001600160a01b0392831660209182029290920101525f805460405163d06ca61f60e01b81529192169063d06ca61f90610ec190633b9aca00908690600401612379565b5f60405180830381865afa158015610edb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f029190810190612391565b90505f8151118015610f3957505f8160018351610f1f9190612167565b81518110610f2f57610f2f612153565b6020026020010151115b610f7c5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21037baba383aba103a37b5b2b760611b6044820152606401610704565b8060018251610f8b9190612167565b81518110610f9b57610f9b612153565b60200260200101519250505090565b6002546001600160a01b03163314610fd45760405162461bcd60e51b81526004016107049061211e565b5f34116110395760405162461bcd60e51b815260206004820152602d60248201527f4d7573742073656e6420736f6d6520455448207769746820746865206e65775260448201526c37b7ba10333ab731ba34b7b71760991b6064820152608401610704565b3460055f82825461104a919061244a565b90915550503460065560095462015180906110659042612167565b61106f91906120ff565b600b8190555f03611080576001600b555b60038190554260095560088054905f6110988361245d565b919050555050565b6002546001600160a01b031633146110ca5760405162461bcd60e51b81526004016107049061211e565b6110d382611874565b156111185760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055565b6002546001600160a01b0316331461115d5760405162461bcd60e51b81526004016107049061211e565b600c80546001810182555f919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b5f805f805f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611200573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611224919061231b565b6001545f54604080516315ab88c960e31b815290516001600160a01b039485169463e6a4390594811693169163ad5c46489160048083019260209291908290030181865afa158015611278573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129c919061231b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156112e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611309919061231b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611344573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113689190612490565b505f54604051630153543560e21b8152600481018890526001600160701b0392831660248201819052939092166044830181905294509192506001600160a01b039091169063054d50d490606401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f5919061218e565b949350505050565b6002546001600160a01b031633146114275760405162461bcd60e51b81526004016107049061211e565b600b55565b6002546001600160a01b031633146114565760405162461bcd60e51b81526004016107049061211e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146114a25760405162461bcd60e51b81526004016107049061211e565b6002805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f336114ce81611874565b156115145760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b6115218187878787611b61565b6040516001600160a01b0382169084905f81818185875af1925050503d805f8114611567576040519150601f19603f3d011682016040523d82523d5f602084013e61156c565b606091505b505060408051888152602081018690529193506001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a250949350505050565b5f805f806115ca610bbb565b90925090506115d981836122f0565b9350670de0b6b3a76400005f5b8281101561161f57670de0b6b3a7640000611601818661244a565b61160b90846122f0565b61161591906120ff565b91506001016115e6565b50611632670de0b6b3a764000082612167565b93505050509091565b6002546001600160a01b031633146116655760405162461bcd60e51b81526004016107049061211e565b600855565b5f806116746106ad565b905060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea919061218e565b6116f590600a612285565b6001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa15801561173d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611761919061218e565b61176b90836122f0565b610d8e91906120ff565b6002546001600160a01b0316331461179f5760405162461bcd60e51b81526004016107049061211e565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b336117ca81611874565b156118105760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b61181d8187878787611b61565b611828838284611cbd565b60408051878152602081018590526001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a2505050505050565b5f805b600c548110156118c857826001600160a01b0316600c828154811061189e5761189e612153565b5f918252602090912001546001600160a01b0316036118c05750600192915050565b600101611877565b505f92915050565b6002546001600160a01b031633146118fa5760405162461bcd60e51b81526004016107049061211e565b600555565b5f805f805f8061190d610806565b90505f611918610d95565b90505f611925838b6120ff565b90508161193a670de0b6b3a7640000836122f0565b61194491906120ff565b965088600a5461195491906120ff565b95506119608b826122f0565b975061196c86886122f0565b9450670de0b6b3a76400005f5b878110156119b257670de0b6b3a7640000611994818b61244a565b61199e90846122f0565b6119a891906120ff565b9150600101611979565b506119c5670de0b6b3a764000082612167565b945050505050939792965093509350565b6002546001600160a01b03163314611a005760405162461bcd60e51b81526004016107049061211e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314611a4c5760405162461bcd60e51b81526004016107049061211e565b828114611a9b5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610704565b5f5b83811015611b5a575f858583818110611ab857611ab8612153565b9050602002016020810190611acd9190611ea2565b90505f848484818110611ae257611ae2612153565b905060200201359050611af482611874565b15611b395760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055600101611a9d565b5050505050565b6001600160a01b0385165f908152600460205260409020548490611b8690839061244a565b1115611ba557604051632dc10b5760e21b815260040160405180910390fd5b600254600160a01b900460ff16611bcf57604051633056283560e01b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590525f906054016040516020818303038152906040528051906020012090505f611c508585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506003549150859050611e09565b905080611c705760405163452c2df160e11b815260040160405180910390fd5b6001600160a01b0387165f9081526004602052604081208054859290611c9790849061244a565b925050819055508260075f828254611caf919061244a565b909155505050505050505050565b6040805160028082526060820183525f926020830190803683370190505090505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4f919061231b565b815f81518110611d6157611d61612153565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611d9157611d91612153565b6001600160a01b0392831660209182029290920101525f5460405163b6f9de9560e01b815291169063b6f9de95908690611dd59086908690899042906004016124d1565b5f604051808303818588803b158015611dec575f80fd5b505af1158015611dfe573d5f803e3d5ffd5b505050505050505050565b5f82611e158584611e1e565b14949350505050565b5f81815b8451811015611e5857611e4e82868381518110611e4157611e41612153565b6020026020010151611e62565b9150600101611e22565b5090505b92915050565b5f818310611e7c575f828152602084905260409020610d8e565b505f9182526020526040902090565b6001600160a01b0381168114611e9f575f80fd5b50565b5f60208284031215611eb2575f80fd5b8135610d8e81611e8b565b5f805f60608486031215611ecf575f80fd5b833592506020840135611ee181611e8b565b91506040840135611ef181611e8b565b809150509250925092565b5f8060408385031215611f0d575f80fd5b823591506020830135611f1f81611e8b565b809150509250929050565b5f60208284031215611f3a575f80fd5b5035919050565b5f8060408385031215611f52575f80fd5b8235611f5d81611e8b565b946020939093013593505050565b5f8083601f840112611f7b575f80fd5b50813567ffffffffffffffff811115611f92575f80fd5b6020830191508360208260051b8501011115611fac575f80fd5b9250929050565b5f805f8060608587031215611fc6575f80fd5b84359350602085013567ffffffffffffffff811115611fe3575f80fd5b611fef87828801611f6b565b9598909750949560400135949350505050565b5f805f805f60808688031215612016575f80fd5b85359450602086013567ffffffffffffffff811115612033575f80fd5b61203f88828901611f6b565b9699909850959660408101359660609091013595509350505050565b5f805f6060848603121561206d575f80fd5b505081359360208301359350604090920135919050565b5f805f8060408587031215612097575f80fd5b843567ffffffffffffffff808211156120ae575f80fd5b6120ba88838901611f6b565b909650945060208701359150808211156120d2575f80fd5b506120df87828801611f6b565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b5f8261211957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b81810381811115611e5c57611e5c6120eb565b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561219e575f80fd5b5051919050565b600181815b808511156121df57815f19048211156121c5576121c56120eb565b808516156121d257918102915b93841c93908002906121aa565b509250929050565b5f826121f557506001611e5c565b8161220157505f611e5c565b816001811461221757600281146122215761223d565b6001915050611e5c565b60ff841115612232576122326120eb565b50506001821b611e5c565b5060208310610133831016604e8410600b8410161715612260575081810a611e5c565b61226a83836121a5565b805f190482111561227d5761227d6120eb565b029392505050565b5f610d8e83836121e7565b60208082526021908201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6040820152601760f91b606082015260800190565b5f602082840312156122e1575f80fd5b81518015158114610d8e575f80fd5b8082028115828204841417611e5c57611e5c6120eb565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561232b575f80fd5b8151610d8e81611e8b565b5f815180845260208085019450602084015f5b8381101561236e5781516001600160a01b031687529582019590820190600101612349565b509495945050505050565b828152604060208201525f6113f56040830184612336565b5f60208083850312156123a2575f80fd5b825167ffffffffffffffff808211156123b9575f80fd5b818501915085601f8301126123cc575f80fd5b8151818111156123de576123de612307565b8060051b604051601f19603f8301168101818110858211171561240357612403612307565b604052918252848201925083810185019188831115612420575f80fd5b938501935b8285101561243e57845184529385019392850192612425565b98975050505050505050565b80820180821115611e5c57611e5c6120eb565b5f6001820161246e5761246e6120eb565b5060010190565b80516001600160701b038116811461248b575f80fd5b919050565b5f805f606084860312156124a2575f80fd5b6124ab84612475565b92506124b960208501612475565b9150604084015163ffffffff81168114611ef1575f80fd5b848152608060208201525f6124e96080830186612336565b6001600160a01b0394909416604083015250606001529291505056fea2646970667358221220e598968c4786cfe64026a259ed7372817a6a39230c51648b4ac7e17c2f874b9464736f6c63430008170033
Deployed Bytecode
0x60806040526004361061021d575f3560e01c80638a5682991161011e578063c864096a116100a8578063ddc2d56d1161006d578063ddc2d56d146105eb578063f2fde38b14610632578063f887ea4014610651578063f8c794d21461066f578063fc0c546a1461068e575f80fd5b8063c864096a1461054e578063c9466aee1461056d578063d134a3ec1461058c578063d7e1ea17146105ab578063dd6bff1a146105d6575f80fd5b8063b37b547c116100ee578063b37b547c146104c8578063b5d00973146104dc578063ba0271be146104fb578063c3f0a61a1461051a578063c851cc321461052f575f80fd5b80638a568299146104485780638da5cb5b1461045d5780639231cf74146104945780639ee47dbe146104a9575f80fd5b806336118b52116101aa578063591141881161016f57806359114188146103b85780635c195217146103d75780637391a85f146103f65780637ad3def2146104155780638010fc4514610434575f80fd5b806336118b521461033457806344fb3ceb146103535780634e237c0714610372578063537800cc1461038657806353e8320f14610399575f80fd5b806324f73a15116101f057806324f73a15146102ae578063258898b3146102c257806327fe69a9146102e15780632cf1bfae1461030a5780632eb4a7ab1461031f575f80fd5b8063063cf93c146102215780630e141a9b14610248578063171d0183146102785780632452dede14610299575b5f80fd5b34801561022c575f80fd5b506102356106ad565b6040519081526020015b60405180910390f35b348015610253575f80fd5b5060025461026890600160a01b900460ff1681565b604051901515815260200161023f565b348015610283575f80fd5b50610297610292366004611ea2565b6106da565b005b3480156102a4575f80fd5b5061023560055481565b3480156102b9575f80fd5b50610235610806565b3480156102cd575f80fd5b506102976102dc366004611ebd565b6109bf565b3480156102ec575f80fd5b506102f5610bbb565b6040805192835260208301919091520161023f565b348015610315575f80fd5b5061023560065481565b34801561032a575f80fd5b5061023560035481565b34801561033f575f80fd5b5061029761034e366004611efc565b610c0a565b34801561035e575f80fd5b5061023561036d366004611f2a565b610d78565b34801561037d575f80fd5b50610235610d95565b610297610394366004611f2a565b610faa565b3480156103a4575f80fd5b506102976103b3366004611f41565b6110a0565b3480156103c3575f80fd5b506102976103d2366004611ea2565b611133565b3480156103e2575f80fd5b506102356103f1366004611f2a565b6111ae565b348015610401575f80fd5b50610297610410366004611f2a565b6113fd565b348015610420575f80fd5b5061029761042f366004611ea2565b61142c565b34801561043f575f80fd5b50610297611478565b348015610453575f80fd5b5061023560085481565b348015610468575f80fd5b5060025461047c906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b34801561049f575f80fd5b5061023560095481565b3480156104b4575f80fd5b506102686104c3366004611fb3565b6114c3565b3480156104d3575f80fd5b506102f56115be565b3480156104e7575f80fd5b506102976104f6366004611f2a565b61163b565b348015610506575f80fd5b50610235610515366004611ea2565b61166a565b348015610525575f80fd5b50610235600b5481565b34801561053a575f80fd5b50610297610549366004611ea2565b611775565b348015610559575f80fd5b50610297610568366004612002565b6117c0565b348015610578575f80fd5b50610268610587366004611ea2565b611874565b348015610597575f80fd5b506102976105a6366004611f2a565b6118d0565b3480156105b6575f80fd5b506102356105c5366004611ea2565b60046020525f908152604090205481565b3480156105e1575f80fd5b5061023560075481565b3480156105f6575f80fd5b5061060a61060536600461205b565b6118ff565b604080519586526020860194909452928401919091526060830152608082015260a00161023f565b34801561063d575f80fd5b5061029761064c366004611ea2565b6119d6565b34801561065c575f80fd5b505f5461047c906001600160a01b031681565b34801561067a575f80fd5b50610297610689366004612084565b611a22565b348015610699575f80fd5b5060015461047c906001600160a01b031681565b5f806106b7610806565b9050806008546005546106ca91906120ff565b6106d491906120ff565b91505090565b6002546001600160a01b0316331461070d5760405162461bcd60e51b81526004016107049061211e565b60405180910390fd5b600c545f5b8181101561080157826001600160a01b0316600c828154811061073757610737612153565b5f918252602090912001546001600160a01b0316036107f957600c61075d600184612167565b8154811061076d5761076d612153565b5f91825260209091200154600c80546001600160a01b03909216918390811061079857610798612153565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c8054806107d4576107d461217a565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b600101610712565b505050565b600154604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610871919061218e565b90505f5b600c5481101561093057600154600c80545f926001600160a01b0316916370a0823191859081106108a8576108a8612153565b5f9182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401602060405180830381865afa1580156108f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610919919061218e565b90506109258184612167565b925050600101610875565b5060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a5919061218e565b6109b090600a612285565b6109ba90826120ff565b905090565b6002546001600160a01b031633146109e95760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038216610a3a5760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8311610a595760405162461bcd60e51b815260040161070490612290565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf919061218e565b831115610b035760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610704565b60405163a9059cbb60e01b8152336004820152602481018490525f906001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610b4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7391906122d1565b905080610bb55760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b50505050565b5f805f610bc66106ad565b90505f610bd1610d95565b905080610be6670de0b6b3a7640000846122f0565b610bf091906120ff565b9350600b54600a54610c0291906120ff565b925050509091565b6002546001600160a01b03163314610c345760405162461bcd60e51b81526004016107049061211e565b6001600160a01b038116610c855760405162461bcd60e51b81526020600482015260186024820152772d32b9379030b2323932b9b99034b99034b73b30b634b21760411b6044820152606401610704565b5f8211610ca45760405162461bcd60e51b815260040161070490612290565b81471015610ce65760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204554482160881b6044820152606401610704565b5f816001600160a01b0316836040515f6040518083038185875af1925050503d805f8114610d2f576040519150601f19603f3d011682016040523d82523d5f602084013e610d34565b606091505b50509050806108015760405162461bcd60e51b815260206004820152601060248201526f5472616e73666572206661696c65642160801b6044820152606401610704565b5f80610d826106ad565b9050610d8e83826122f0565b9392505050565b6040805160028082526060820183525f9283929190602083019080368337505060015482519293506001600160a01b0316918391505f90610dd857610dd8612153565b60200260200101906001600160a01b031690816001600160a01b0316815250505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6a919061231b565b81600181518110610e7d57610e7d612153565b6001600160a01b0392831660209182029290920101525f805460405163d06ca61f60e01b81529192169063d06ca61f90610ec190633b9aca00908690600401612379565b5f60405180830381865afa158015610edb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f029190810190612391565b90505f8151118015610f3957505f8160018351610f1f9190612167565b81518110610f2f57610f2f612153565b6020026020010151115b610f7c5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21037baba383aba103a37b5b2b760611b6044820152606401610704565b8060018251610f8b9190612167565b81518110610f9b57610f9b612153565b60200260200101519250505090565b6002546001600160a01b03163314610fd45760405162461bcd60e51b81526004016107049061211e565b5f34116110395760405162461bcd60e51b815260206004820152602d60248201527f4d7573742073656e6420736f6d6520455448207769746820746865206e65775260448201526c37b7ba10333ab731ba34b7b71760991b6064820152608401610704565b3460055f82825461104a919061244a565b90915550503460065560095462015180906110659042612167565b61106f91906120ff565b600b8190555f03611080576001600b555b60038190554260095560088054905f6110988361245d565b919050555050565b6002546001600160a01b031633146110ca5760405162461bcd60e51b81526004016107049061211e565b6110d382611874565b156111185760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055565b6002546001600160a01b0316331461115d5760405162461bcd60e51b81526004016107049061211e565b600c80546001810182555f919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b5f805f805f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611200573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611224919061231b565b6001545f54604080516315ab88c960e31b815290516001600160a01b039485169463e6a4390594811693169163ad5c46489160048083019260209291908290030181865afa158015611278573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129c919061231b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156112e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611309919061231b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611344573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113689190612490565b505f54604051630153543560e21b8152600481018890526001600160701b0392831660248201819052939092166044830181905294509192506001600160a01b039091169063054d50d490606401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f5919061218e565b949350505050565b6002546001600160a01b031633146114275760405162461bcd60e51b81526004016107049061211e565b600b55565b6002546001600160a01b031633146114565760405162461bcd60e51b81526004016107049061211e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146114a25760405162461bcd60e51b81526004016107049061211e565b6002805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f336114ce81611874565b156115145760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b6115218187878787611b61565b6040516001600160a01b0382169084905f81818185875af1925050503d805f8114611567576040519150601f19603f3d011682016040523d82523d5f602084013e61156c565b606091505b505060408051888152602081018690529193506001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a250949350505050565b5f805f806115ca610bbb565b90925090506115d981836122f0565b9350670de0b6b3a76400005f5b8281101561161f57670de0b6b3a7640000611601818661244a565b61160b90846122f0565b61161591906120ff565b91506001016115e6565b50611632670de0b6b3a764000082612167565b93505050509091565b6002546001600160a01b031633146116655760405162461bcd60e51b81526004016107049061211e565b600855565b5f806116746106ad565b905060015f9054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea919061218e565b6116f590600a612285565b6001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa15801561173d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611761919061218e565b61176b90836122f0565b610d8e91906120ff565b6002546001600160a01b0316331461179f5760405162461bcd60e51b81526004016107049061211e565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b336117ca81611874565b156118105760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91034b99034b732b634b3b4b136329760511b6044820152606401610704565b61181d8187878787611b61565b611828838284611cbd565b60408051878152602081018590526001600160a01b038316917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7910160405180910390a2505050505050565b5f805b600c548110156118c857826001600160a01b0316600c828154811061189e5761189e612153565b5f918252602090912001546001600160a01b0316036118c05750600192915050565b600101611877565b505f92915050565b6002546001600160a01b031633146118fa5760405162461bcd60e51b81526004016107049061211e565b600555565b5f805f805f8061190d610806565b90505f611918610d95565b90505f611925838b6120ff565b90508161193a670de0b6b3a7640000836122f0565b61194491906120ff565b965088600a5461195491906120ff565b95506119608b826122f0565b975061196c86886122f0565b9450670de0b6b3a76400005f5b878110156119b257670de0b6b3a7640000611994818b61244a565b61199e90846122f0565b6119a891906120ff565b9150600101611979565b506119c5670de0b6b3a764000082612167565b945050505050939792965093509350565b6002546001600160a01b03163314611a005760405162461bcd60e51b81526004016107049061211e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b03163314611a4c5760405162461bcd60e51b81526004016107049061211e565b828114611a9b5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610704565b5f5b83811015611b5a575f858583818110611ab857611ab8612153565b9050602002016020810190611acd9190611ea2565b90505f848484818110611ae257611ae2612153565b905060200201359050611af482611874565b15611b395760405162461bcd60e51b81526020600482015260156024820152744164647265737320697320696e656c696769626c6560581b6044820152606401610704565b6001600160a01b039091165f90815260046020526040902055600101611a9d565b5050505050565b6001600160a01b0385165f908152600460205260409020548490611b8690839061244a565b1115611ba557604051632dc10b5760e21b815260040160405180910390fd5b600254600160a01b900460ff16611bcf57604051633056283560e01b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590525f906054016040516020818303038152906040528051906020012090505f611c508585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506003549150859050611e09565b905080611c705760405163452c2df160e11b815260040160405180910390fd5b6001600160a01b0387165f9081526004602052604081208054859290611c9790849061244a565b925050819055508260075f828254611caf919061244a565b909155505050505050505050565b6040805160028082526060820183525f926020830190803683370190505090505f8054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4f919061231b565b815f81518110611d6157611d61612153565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611d9157611d91612153565b6001600160a01b0392831660209182029290920101525f5460405163b6f9de9560e01b815291169063b6f9de95908690611dd59086908690899042906004016124d1565b5f604051808303818588803b158015611dec575f80fd5b505af1158015611dfe573d5f803e3d5ffd5b505050505050505050565b5f82611e158584611e1e565b14949350505050565b5f81815b8451811015611e5857611e4e82868381518110611e4157611e41612153565b6020026020010151611e62565b9150600101611e22565b5090505b92915050565b5f818310611e7c575f828152602084905260409020610d8e565b505f9182526020526040902090565b6001600160a01b0381168114611e9f575f80fd5b50565b5f60208284031215611eb2575f80fd5b8135610d8e81611e8b565b5f805f60608486031215611ecf575f80fd5b833592506020840135611ee181611e8b565b91506040840135611ef181611e8b565b809150509250925092565b5f8060408385031215611f0d575f80fd5b823591506020830135611f1f81611e8b565b809150509250929050565b5f60208284031215611f3a575f80fd5b5035919050565b5f8060408385031215611f52575f80fd5b8235611f5d81611e8b565b946020939093013593505050565b5f8083601f840112611f7b575f80fd5b50813567ffffffffffffffff811115611f92575f80fd5b6020830191508360208260051b8501011115611fac575f80fd5b9250929050565b5f805f8060608587031215611fc6575f80fd5b84359350602085013567ffffffffffffffff811115611fe3575f80fd5b611fef87828801611f6b565b9598909750949560400135949350505050565b5f805f805f60808688031215612016575f80fd5b85359450602086013567ffffffffffffffff811115612033575f80fd5b61203f88828901611f6b565b9699909850959660408101359660609091013595509350505050565b5f805f6060848603121561206d575f80fd5b505081359360208301359350604090920135919050565b5f805f8060408587031215612097575f80fd5b843567ffffffffffffffff808211156120ae575f80fd5b6120ba88838901611f6b565b909650945060208701359150808211156120d2575f80fd5b506120df87828801611f6b565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b5f8261211957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b81810381811115611e5c57611e5c6120eb565b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561219e575f80fd5b5051919050565b600181815b808511156121df57815f19048211156121c5576121c56120eb565b808516156121d257918102915b93841c93908002906121aa565b509250929050565b5f826121f557506001611e5c565b8161220157505f611e5c565b816001811461221757600281146122215761223d565b6001915050611e5c565b60ff841115612232576122326120eb565b50506001821b611e5c565b5060208310610133831016604e8410600b8410161715612260575081810a611e5c565b61226a83836121a5565b805f190482111561227d5761227d6120eb565b029392505050565b5f610d8e83836121e7565b60208082526021908201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6040820152601760f91b606082015260800190565b5f602082840312156122e1575f80fd5b81518015158114610d8e575f80fd5b8082028115828204841417611e5c57611e5c6120eb565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561232b575f80fd5b8151610d8e81611e8b565b5f815180845260208085019450602084015f5b8381101561236e5781516001600160a01b031687529582019590820190600101612349565b509495945050505050565b828152604060208201525f6113f56040830184612336565b5f60208083850312156123a2575f80fd5b825167ffffffffffffffff808211156123b9575f80fd5b818501915085601f8301126123cc575f80fd5b8151818111156123de576123de612307565b8060051b604051601f19603f8301168101818110858211171561240357612403612307565b604052918252848201925083810185019188831115612420575f80fd5b938501935b8285101561243e57845184529385019392850192612425565b98975050505050505050565b80820180821115611e5c57611e5c6120eb565b5f6001820161246e5761246e6120eb565b5060010190565b80516001600160701b038116811461248b575f80fd5b919050565b5f805f606084860312156124a2575f80fd5b6124ab84612475565b92506124b960208501612475565b9150604084015163ffffffff81168114611ef1575f80fd5b848152608060208201525f6124e96080830186612336565b6001600160a01b0394909416604083015250606001529291505056fea2646970667358221220e598968c4786cfe64026a259ed7372817a6a39230c51648b4ac7e17c2f874b9464736f6c63430008170033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,340.38 | 0.0255 | $85.19 |
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.