Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (54)0.00050026 PUNKCryptoPunks (PUNK)$68.64@137,210.0036.7622768 1INCH1INCH Token (1INCH)$15.75@0.42830.00101591 AAVEAave Token (AAVE)$0.21@202.099.77846577 APEApeCoin (APE)$13.98@1.43205.4695769 ANTAragon Netwo... (ANT)$244.51@1.1929.07707398 AXSAxie Infinit... (AXS)$237.85@8.183.71089419 BADGERBadger (BADGER)$14.36@3.872,685 BRIGHTBright (BRIGHT)$42.10@0.01578.44913887 LINKChainLink To... (LINK)$156.06@18.4726.85209509 CVXConvex Token (CVX)$85.44@3.181799.62783836 DYDXdYdX (DYDX)$165.38@1.661,563.96704051 EULEuler (EUL)$5,990.87@3.830612.70851299 EURAEURA (previo... (EURA)$13.43@1.0571,039.22471057 BANKFloat Bank (BANK)$545.77@0.5252490.99887906 FLOATFloat Protoc... (FLOAT)0.01192498 FRAXFrax (FRAX)$0.01@0.99665,957.33904591 FTX TokenFTT (FTX To...)$14,059.32@2.36502.70621266 GTCGitcoin (GTC)$541.92@1.0784.5414834 GRTGraph Token (GRT)$1.30@0.2852692.58515381 IDLEIdle (IDLE)$352.73@0.5093127.92738795 KP3RKeep3rV1 (KP3R)$2,981.99@23.31137.76122745 LDOLido DAO Tok... (LDO)$249.35@1.810.00949997 MILADYMilady Maker (MILADY)$222.43@23,414.000.08175901 OHMOlympus (OHM)$1.47@18.0330.38417667 oSQTHOpyn Squeeth (oSQTH)$3,522.44@115.9334.88757109 PERPPerpetual (PERP)$33.71@0.9661143.4083371 RAIRai Reflex I... (RAI)$437.40@3.056,357.12619436 RBNRibbon (RBN)$3,060.67@0.4815209,026.79998888 SDLSaddle DAO (SDL)34,273,040.9372988 SHIBSHIBA INU (SHIB)$924.00@0.00127,155.38285103 STGStargateToke... (STG)$51,092.94@0.4018317.88186317 UNIUniswap (UNI)$4,084.78@12.853,041.99943507 UBIUniversal Ba... (UBI)$0.92@0.00030.00013352 YFIyearn.financ... (YFI)$1.06@7,928.6318.12442895 COMPCompound (COMP)$1,297.53@71.590.04370899 cETHCompound Eth... (cETH)$3.24@74.1593,300.92272961 DAIDai Stableco... (DAI)$93,300.92@1.001,077.63991134 ENSEthereum Nam... (ENS)$46,101.44@42.7829.03421049 MATICMatic Token (MATIC)$17.04@0.5877,191.563751 USDCUSDC (USDC)$7,191.56@1.00202.29825577 WETHWrapped Ethe... (WETH)$747,402.34@3,694.556548,000 Earn $TUSD airdrops at https://www.tenorusd.orgERC-20: $ te... (Earn $...)30.08255246 MPLMaple Token$616.99@20.51744.01607757 SAITABITSAITABIT$0.80@0.00118.40946206 FLXFlex Ungovernance Token$27.03@3.21440.00000833 LUSDLUSD Stablecoin$0.00@0.99921,094,446,863.09377 SOSSOS$12.77@0.000.00315315 VEGAVEGA$0.00@0.0122237.34 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]525,235,396 TokenERC-20 TOKEN*[Suspicious]1.7 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]75,539,184.44 TokenERC-20 TOKEN*[Spam]NFT Tokens (42)claim rewards on apyusd.netapyusd.netERC-1155claim rewards on clinkevent.netclinkevent.netERC-1155nft-dai.comDAI Mysterybox NFTERC-1155claim rewards on dydxnetwork.orgdydxnetwork.orgERC-1155claim rewards on ensfoundation.orgensfoundation.orgERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155nft-lido.comLDO Mysterybox NFTERC-1155claim rewards on univ4labs.orguniv4labs.orgERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]
More Info
Private Name Tags
ContractCreator
TokenTracker
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 955 transactions
Transaction Hash MethodBlockFromToClaim And Agree ... 20319033 2024-07-16 12:20:47 136 days ago 1721132447 IN 0 ETH$0.00 0.00172968 10.2662466 Claim And Agree ... 19961760 2024-05-27 14:19:47 186 days ago 1716819587 IN 0 ETH$0.00 0.00379523 22.52059107 Claim And Agree ... 19811821 2024-05-06 15:05:23 207 days ago 1715007923 IN 0 ETH$0.00 0.0034146 13.98558009 Claim And Agree ... 19786710 2024-05-03 2:48:47 211 days ago 1714704527 IN 0 ETH$0.00 0.00075495 6.11291533 Claim And Agree ... 19759811 2024-04-29 8:34:47 215 days ago 1714379687 IN 0 ETH$0.00 0.00086286 8.06496473 Claim And Agree ... 19611384 2024-04-08 13:55:35 235 days ago 1712584535 IN 0 ETH$0.00 0.00865492 30.24114609 Claim And Agree ... 19556288 2024-03-31 20:38:11 243 days ago 1711917491 IN 0 ETH$0.00 0.00492128 26.51194629 Claim And Agree ... 19556112 2024-03-31 20:02:47 243 days ago 1711915367 IN 0 ETH$0.00 0.00445184 23.98428121 Claim And Agree ... 19552361 2024-03-31 7:21:23 244 days ago 1711869683 IN 0 ETH$0.00 0.00368471 19.85245264 Claim And Agree ... 19439738 2024-03-15 10:25:47 259 days ago 1710498347 IN 0 ETH$0.00 0.00542084 38.54765243 Claim And Agree ... 19386552 2024-03-07 23:23:23 267 days ago 1709853803 IN 0 ETH$0.00 0.01040125 56.04338318 Claim And Agree ... 19378313 2024-03-06 19:46:35 268 days ago 1709754395 IN 0 ETH$0.00 0.01436484 77.39223105 Claim And Agree ... 19378299 2024-03-06 19:43:47 268 days ago 1709754227 IN 0 ETH$0.00 0.01705081 75.94849566 Claim And Agree ... 19364602 2024-03-04 21:51:11 270 days ago 1709589071 IN 0 ETH$0.00 0.01966547 95.7418659 Claim And Agree ... 19330016 2024-02-29 1:51:11 275 days ago 1709171471 IN 0 ETH$0.00 0.00936657 50.47163508 Claim And Agree ... 19313552 2024-02-26 18:34:23 277 days ago 1708972463 IN 0 ETH$0.00 0.005825 54.45103049 Claim And Agree ... 19308743 2024-02-26 2:23:35 278 days ago 1708914215 IN 0 ETH$0.00 0.0049006 29.08181514 Claim And Agree ... 19302324 2024-02-25 4:50:47 279 days ago 1708836647 IN 0 ETH$0.00 0.00432124 23.28245089 Claim And Agree ... 19260819 2024-02-19 9:13:23 285 days ago 1708334003 IN 0 ETH$0.00 0.0058162 30.56959959 Claim And Agree ... 19250751 2024-02-17 23:09:47 286 days ago 1708211387 IN 0 ETH$0.00 0.00269089 17.77563317 Claim And Agree ... 19230949 2024-02-15 4:28:35 289 days ago 1707971315 IN 0 ETH$0.00 0.0025898 15.37075735 Claim And Agree ... 19162816 2024-02-05 14:59:23 298 days ago 1707145163 IN 0 ETH$0.00 0.00391951 25.88555805 Claim And Agree ... 19134239 2024-02-01 14:41:23 302 days ago 1706798483 IN 0 ETH$0.00 0.0038825 23.04446129 Claim And Agree ... 19128297 2024-01-31 18:38:59 303 days ago 1706726339 IN 0 ETH$0.00 0.00423353 25.129438 Claim And Agree ... 19128290 2024-01-31 18:37:35 303 days ago 1706726255 IN 0 ETH$0.00 0.00480058 28.49165948 View more zero value Internal Transactions in Advanced View mode
Advanced mode:Loading...LoadingContract Name:EulerClaims
Compiler Versionv0.8.18+commit.87f61d96
Optimization Enabled:No with 200 runs
Other Settings:default evmVersionContract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity 0.8.18; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; /********** By clicking "I agree to the terms to claim redemption" on the euler.finance web interface or executing the EulerClaims smart contract and accepting the redemption, I hereby irrevocably and unconditionally release all claims I (or my company or other separate legal entity) may have against Euler Labs, Ltd., the Euler Foundation, the Euler Decentralized Autonomous Organization, members of the Euler Decentralized Autonomous Organization, and any of their agents, affiliates, officers, employees, or principals related to this matter, whether such claims are known or unknown at this time and regardless of how such claims arise and the laws governing such claims (which shall include but not be limited to any claims arising out of Euler’s terms of use). This release constitutes an express and voluntary binding waiver and relinquishment to the fullest extent permitted by law. If I am acting for or on behalf of a company (or other such separate entity), by clicking "I agree to the terms to claim redemption" on the euler.finance web interface or executing the EulerClaims smart contract and accepting the redemption and agreement, I confirm that I am duly authorised to enter into this contract on its behalf. This agreement and all disputes relating to or arising under this agreement (including the interpretation, validity or enforcement thereof) will be governed by and subject to the laws of England and Wales and the courts of London, England shall have exclusive jurisdiction to determine any such dispute. To the extent that the terms of this release are inconsistent with any previous agreement and/or Euler’s terms of use, I accept that these terms take priority and, where necessary, replace the previous terms. **********/ contract EulerClaims is ReentrancyGuard { // // The following is a hash of the above terms and conditions. // // By sending a transaction and claiming the redemption tokens, I understand and manifest my assent // and agreement to be bound by the enforceable contract on this page, and agree that all claims or // disputes under this agreement will be resolved exclusively by the courts of London, England in // accordance with the laws of England and Wales. If I am acting for or on behalf of a company (or // other such separate entity), by signing and sending a transaction I confirm that I am duly // authorised to enter into this contract on its behalf. // bytes32 constant private termsAndConditionsHash = 0x427a506ff6e15bd1b7e4e93da52c8ec95f6af1279618a2f076946e83d8294996; string public constant name = "EulerClaims"; address public owner; bytes32 public merkleRoot; mapping(uint => bool) public alreadyClaimed; // index -> yes/no struct TokenAmount { address token; uint amount; } event OwnerChanged(address indexed newOwner); event ClaimedAndAgreed(uint indexed index, address indexed account); event ClaimedByOwner(uint indexed index); event MerkleRootUpdated(bytes32 indexed newMerkleRoot); // Owner functions constructor() { owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner, "unauthorized"); _; } function transferOwnership(address newOwner) external onlyOwner { require(newOwner != address(0), "owner is zero"); owner = newOwner; emit OwnerChanged(newOwner); } function updateMerkleRoot(bytes32 newMerkleRoot) external onlyOwner { merkleRoot = newMerkleRoot; emit MerkleRootUpdated(newMerkleRoot); } function recoverTokens(uint[] calldata indexList, TokenAmount[] calldata tokenAmounts) external onlyOwner nonReentrant { for (uint i = 0; i < indexList.length; ++i) { uint index = indexList[i]; require(!alreadyClaimed[index], "already claimed"); alreadyClaimed[index] = true; emit ClaimedByOwner(index); } for (uint i = 0; i < tokenAmounts.length; ++i) { SafeERC20.safeTransfer(IERC20(tokenAmounts[i].token), owner, tokenAmounts[i].amount); } } function recoverEth(uint amount) external onlyOwner nonReentrant { (bool success,) = owner.call{value: amount}(""); require(success, "send eth failed"); } // Public functions /// @notice Claim tokens from Euler Redemption /// @param acceptanceToken Custom token demonstrating the caller's agreement with the Terms and Conditions of the claim (see contract source code) /// @param index Index of distribution being claimed in the merkle tree /// @param tokenAmounts List of (token, amount) pairs for this claim /// @param proof Merkle proof that validates this claim function claimAndAgreeToTerms(bytes32 acceptanceToken, uint index, TokenAmount[] calldata tokenAmounts, bytes32[] calldata proof) external nonReentrant { require(acceptanceToken == keccak256(abi.encodePacked(msg.sender, termsAndConditionsHash)), "please read the terms and conditions"); require(MerkleProof.verify(proof, merkleRoot, keccak256(abi.encode(index, msg.sender, tokenAmounts))), "proof invalid"); require(!alreadyClaimed[index], "already claimed"); alreadyClaimed[index] = true; emit ClaimedAndAgreed(index, msg.sender); for (uint i = 0; i < tokenAmounts.length; ++i) { SafeERC20.safeTransfer(IERC20(tokenAmounts[i].token), msg.sender, tokenAmounts[i].amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @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 rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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 for 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) { 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 rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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 for 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) { 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) } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ClaimedAndAgreed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"ClaimedByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"MerkleRootUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alreadyClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"acceptanceToken","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct EulerClaims.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimAndAgreeToTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexList","type":"uint256[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct EulerClaims.TokenAmount[]","name":"tokenAmounts","type":"tuple[]"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600160008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611c6e806100696000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80634e25b08b116100665780634e25b08b146101205780638da5cb5b1461013c578063e36e7dfc1461015a578063f017957c14610176578063f2fde38b1461019257610093565b806306fdde031461009857806329da5077146100b65780632eb4a7ab146100e65780634783f0ef14610104575b600080fd5b6100a06101ae565b6040516100ad9190610f76565b60405180910390f35b6100d060048036038101906100cb9190610fd8565b6101e7565b6040516100dd9190611020565b60405180910390f35b6100ee610207565b6040516100fb9190611054565b60405180910390f35b61011e6004803603810190610119919061109b565b61020d565b005b61013a60048036038101906101359190610fd8565b6102d4565b005b610144610446565b6040516101519190611109565b60405180910390f35b610174600480360381019061016f91906111df565b61046c565b005b610190600480360381019061018b91906112dc565b61070c565b005b6101ac60048036038101906101a79190611389565b61093e565b005b6040518060400160405280600b81526020017f45756c6572436c61696d7300000000000000000000000000000000000000000081525081565b60036020528060005260406000206000915054906101000a900460ff1681565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461029d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029490611402565b60405180910390fd5b80600281905550807f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea94160405160405180910390a250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035b90611402565b60405180910390fd5b61036c610ac4565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516103b490611453565b60006040518083038185875af1925050503d80600081146103f1576040519150601f19603f3d011682016040523d82523d6000602084013e6103f6565b606091505b505090508061043a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610431906114b4565b60405180910390fd5b50610443610b13565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610474610ac4565b337f427a506ff6e15bd1b7e4e93da52c8ec95f6af1279618a2f076946e83d829499660001b6040516020016104aa92919061153d565b604051602081830303815290604052805190602001208614610501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f8906115db565b60405180910390fd5b61057b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060025487338888604051602001610560949392919061173d565b60405160208183030381529060405280519060200120610b1d565b6105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b1906117c9565b60405180910390fd5b6003600086815260200190815260200160002060009054906101000a900460ff161561061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290611835565b60405180910390fd5b60016003600087815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16857f5e4f9994b48e694f483e4577ba974f1171f0775b8e677baa34aeb12f8b27161960405160405180910390a360005b848490508110156106fb576106ea8585838181106106af576106ae611855565b5b90506040020160000160208101906106c79190611389565b338787858181106106db576106da611855565b5b90506040020160200135610b34565b806106f4906118b3565b905061068e565b50610704610b13565b505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079390611402565b60405180910390fd5b6107a4610ac4565b60005b8484905081101561089c5760008585838181106107c7576107c6611855565b5b9050602002013590506003600082815260200190815260200160002060009054906101000a900460ff1615610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890611835565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550807f150afe1a4f039206f87a38d65a16f6a7c76f285e29a4b2b5eab4e8a917b40ca160405160405180910390a25080610895906118b3565b90506107a7565b5060005b8282905081101561092f5761091e8383838181106108c1576108c0611855565b5b90506040020160000160208101906108d99190611389565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858581811061090f5761090e611855565b5b90506040020160200135610b34565b80610928906118b3565b90506108a0565b50610938610b13565b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590611402565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3490611947565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3660405160405180910390a250565b600260005403610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b00906119b3565b60405180910390fd5b6002600081905550565b6001600081905550565b600082610b2a8584610bba565b1490509392505050565b610bb58363a9059cbb60e01b8484604051602401610b539291906119d3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c10565b505050565b60008082905060005b8451811015610c0557610bf082868381518110610be357610be2611855565b5b6020026020010151610cd7565b91508080610bfd906118b3565b915050610bc3565b508091505092915050565b6000610c72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d029092919063ffffffff16565b9050600081511115610cd25780806020019051810190610c929190611a28565b610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890611ac7565b60405180910390fd5b5b505050565b6000818310610cef57610cea8284610d1a565b610cfa565b610cf98383610d1a565b5b905092915050565b6060610d118484600085610d31565b90509392505050565b600082600052816020526040600020905092915050565b606082471015610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90611b59565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610d9f9190611bb5565b60006040518083038185875af1925050503d8060008114610ddc576040519150601f19603f3d011682016040523d82523d6000602084013e610de1565b606091505b5091509150610df287838387610dfe565b92505050949350505050565b60608315610e60576000835103610e5857610e1885610e73565b610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90611c18565b60405180910390fd5b5b829050610e6b565b610e6a8383610e96565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115610ea95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd9190610f76565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b83811015610f20578082015181840152602081019050610f05565b60008484015250505050565b6000601f19601f8301169050919050565b6000610f4882610ee6565b610f528185610ef1565b9350610f62818560208601610f02565b610f6b81610f2c565b840191505092915050565b60006020820190508181036000830152610f908184610f3d565b905092915050565b600080fd5b600080fd5b6000819050919050565b610fb581610fa2565b8114610fc057600080fd5b50565b600081359050610fd281610fac565b92915050565b600060208284031215610fee57610fed610f98565b5b6000610ffc84828501610fc3565b91505092915050565b60008115159050919050565b61101a81611005565b82525050565b60006020820190506110356000830184611011565b92915050565b6000819050919050565b61104e8161103b565b82525050565b60006020820190506110696000830184611045565b92915050565b6110788161103b565b811461108357600080fd5b50565b6000813590506110958161106f565b92915050565b6000602082840312156110b1576110b0610f98565b5b60006110bf84828501611086565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110f3826110c8565b9050919050565b611103816110e8565b82525050565b600060208201905061111e60008301846110fa565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261114957611148611124565b5b8235905067ffffffffffffffff81111561116657611165611129565b5b6020830191508360408202830111156111825761118161112e565b5b9250929050565b60008083601f84011261119f5761119e611124565b5b8235905067ffffffffffffffff8111156111bc576111bb611129565b5b6020830191508360208202830111156111d8576111d761112e565b5b9250929050565b600080600080600080608087890312156111fc576111fb610f98565b5b600061120a89828a01611086565b965050602061121b89828a01610fc3565b955050604087013567ffffffffffffffff81111561123c5761123b610f9d565b5b61124889828a01611133565b9450945050606087013567ffffffffffffffff81111561126b5761126a610f9d565b5b61127789828a01611189565b92509250509295509295509295565b60008083601f84011261129c5761129b611124565b5b8235905067ffffffffffffffff8111156112b9576112b8611129565b5b6020830191508360208202830111156112d5576112d461112e565b5b9250929050565b600080600080604085870312156112f6576112f5610f98565b5b600085013567ffffffffffffffff81111561131457611313610f9d565b5b61132087828801611286565b9450945050602085013567ffffffffffffffff81111561134357611342610f9d565b5b61134f87828801611133565b925092505092959194509250565b611366816110e8565b811461137157600080fd5b50565b6000813590506113838161135d565b92915050565b60006020828403121561139f5761139e610f98565b5b60006113ad84828501611374565b91505092915050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006113ec600c83610ef1565b91506113f7826113b6565b602082019050919050565b6000602082019050818103600083015261141b816113df565b9050919050565b600081905092915050565b50565b600061143d600083611422565b91506114488261142d565b600082019050919050565b600061145e82611430565b9150819050919050565b7f73656e6420657468206661696c65640000000000000000000000000000000000600082015250565b600061149e600f83610ef1565b91506114a982611468565b602082019050919050565b600060208201905081810360008301526114cd81611491565b9050919050565b60008160601b9050919050565b60006114ec826114d4565b9050919050565b60006114fe826114e1565b9050919050565b611516611511826110e8565b6114f3565b82525050565b6000819050919050565b6115376115328261103b565b61151c565b82525050565b60006115498285611505565b6014820191506115598284611526565b6020820191508190509392505050565b7f706c65617365207265616420746865207465726d7320616e6420636f6e64697460008201527f696f6e7300000000000000000000000000000000000000000000000000000000602082015250565b60006115c5602483610ef1565b91506115d082611569565b604082019050919050565b600060208201905081810360008301526115f4816115b8565b9050919050565b61160481610fa2565b82525050565b600082825260208201905092915050565b6000819050919050565b60006116346020840184611374565b905092915050565b611645816110e8565b82525050565b600061165a6020840184610fc3565b905092915050565b61166b81610fa2565b82525050565b604082016116826000830183611625565b61168f600085018261163c565b5061169d602083018361164b565b6116aa6020850182611662565b50505050565b60006116bc8383611671565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006116ec838561160a565b93506116f78261161b565b8060005b858110156117305761170d82846116c8565b61171788826116b0565b9750611722836116d3565b9250506001810190506116fb565b5085925050509392505050565b600060608201905061175260008301876115fb565b61175f60208301866110fa565b81810360408301526117728184866116e0565b905095945050505050565b7f70726f6f6620696e76616c696400000000000000000000000000000000000000600082015250565b60006117b3600d83610ef1565b91506117be8261177d565b602082019050919050565b600060208201905081810360008301526117e2816117a6565b9050919050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061181f600f83610ef1565b915061182a826117e9565b602082019050919050565b6000602082019050818103600083015261184e81611812565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118be82610fa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118f0576118ef611884565b5b600182019050919050565b7f6f776e6572206973207a65726f00000000000000000000000000000000000000600082015250565b6000611931600d83610ef1565b915061193c826118fb565b602082019050919050565b6000602082019050818103600083015261196081611924565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061199d601f83610ef1565b91506119a882611967565b602082019050919050565b600060208201905081810360008301526119cc81611990565b9050919050565b60006040820190506119e860008301856110fa565b6119f560208301846115fb565b9392505050565b611a0581611005565b8114611a1057600080fd5b50565b600081519050611a22816119fc565b92915050565b600060208284031215611a3e57611a3d610f98565b5b6000611a4c84828501611a13565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000611ab1602a83610ef1565b9150611abc82611a55565b604082019050919050565b60006020820190508181036000830152611ae081611aa4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000611b43602683610ef1565b9150611b4e82611ae7565b604082019050919050565b60006020820190508181036000830152611b7281611b36565b9050919050565b600081519050919050565b6000611b8f82611b79565b611b998185611422565b9350611ba9818560208601610f02565b80840191505092915050565b6000611bc18284611b84565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000611c02601d83610ef1565b9150611c0d82611bcc565b602082019050919050565b60006020820190508181036000830152611c3181611bf5565b905091905056fea2646970667358221220f4e1120c9e6e1dbf2d85cb314a836f5125182ea5800982c5a3e6976ccc3c6a1b64736f6c63430008120033Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c80634e25b08b116100665780634e25b08b146101205780638da5cb5b1461013c578063e36e7dfc1461015a578063f017957c14610176578063f2fde38b1461019257610093565b806306fdde031461009857806329da5077146100b65780632eb4a7ab146100e65780634783f0ef14610104575b600080fd5b6100a06101ae565b6040516100ad9190610f76565b60405180910390f35b6100d060048036038101906100cb9190610fd8565b6101e7565b6040516100dd9190611020565b60405180910390f35b6100ee610207565b6040516100fb9190611054565b60405180910390f35b61011e6004803603810190610119919061109b565b61020d565b005b61013a60048036038101906101359190610fd8565b6102d4565b005b610144610446565b6040516101519190611109565b60405180910390f35b610174600480360381019061016f91906111df565b61046c565b005b610190600480360381019061018b91906112dc565b61070c565b005b6101ac60048036038101906101a79190611389565b61093e565b005b6040518060400160405280600b81526020017f45756c6572436c61696d7300000000000000000000000000000000000000000081525081565b60036020528060005260406000206000915054906101000a900460ff1681565b60025481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461029d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029490611402565b60405180910390fd5b80600281905550807f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea94160405160405180910390a250565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035b90611402565b60405180910390fd5b61036c610ac4565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516103b490611453565b60006040518083038185875af1925050503d80600081146103f1576040519150601f19603f3d011682016040523d82523d6000602084013e6103f6565b606091505b505090508061043a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610431906114b4565b60405180910390fd5b50610443610b13565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610474610ac4565b337f427a506ff6e15bd1b7e4e93da52c8ec95f6af1279618a2f076946e83d829499660001b6040516020016104aa92919061153d565b604051602081830303815290604052805190602001208614610501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f8906115db565b60405180910390fd5b61057b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060025487338888604051602001610560949392919061173d565b60405160208183030381529060405280519060200120610b1d565b6105ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b1906117c9565b60405180910390fd5b6003600086815260200190815260200160002060009054906101000a900460ff161561061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061290611835565b60405180910390fd5b60016003600087815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16857f5e4f9994b48e694f483e4577ba974f1171f0775b8e677baa34aeb12f8b27161960405160405180910390a360005b848490508110156106fb576106ea8585838181106106af576106ae611855565b5b90506040020160000160208101906106c79190611389565b338787858181106106db576106da611855565b5b90506040020160200135610b34565b806106f4906118b3565b905061068e565b50610704610b13565b505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079390611402565b60405180910390fd5b6107a4610ac4565b60005b8484905081101561089c5760008585838181106107c7576107c6611855565b5b9050602002013590506003600082815260200190815260200160002060009054906101000a900460ff1615610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890611835565b60405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550807f150afe1a4f039206f87a38d65a16f6a7c76f285e29a4b2b5eab4e8a917b40ca160405160405180910390a25080610895906118b3565b90506107a7565b5060005b8282905081101561092f5761091e8383838181106108c1576108c0611855565b5b90506040020160000160208101906108d99190611389565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858581811061090f5761090e611855565b5b90506040020160200135610b34565b80610928906118b3565b90506108a0565b50610938610b13565b50505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590611402565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3490611947565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3660405160405180910390a250565b600260005403610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b00906119b3565b60405180910390fd5b6002600081905550565b6001600081905550565b600082610b2a8584610bba565b1490509392505050565b610bb58363a9059cbb60e01b8484604051602401610b539291906119d3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c10565b505050565b60008082905060005b8451811015610c0557610bf082868381518110610be357610be2611855565b5b6020026020010151610cd7565b91508080610bfd906118b3565b915050610bc3565b508091505092915050565b6000610c72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d029092919063ffffffff16565b9050600081511115610cd25780806020019051810190610c929190611a28565b610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890611ac7565b60405180910390fd5b5b505050565b6000818310610cef57610cea8284610d1a565b610cfa565b610cf98383610d1a565b5b905092915050565b6060610d118484600085610d31565b90509392505050565b600082600052816020526040600020905092915050565b606082471015610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90611b59565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610d9f9190611bb5565b60006040518083038185875af1925050503d8060008114610ddc576040519150601f19603f3d011682016040523d82523d6000602084013e610de1565b606091505b5091509150610df287838387610dfe565b92505050949350505050565b60608315610e60576000835103610e5857610e1885610e73565b610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90611c18565b60405180910390fd5b5b829050610e6b565b610e6a8383610e96565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115610ea95781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd9190610f76565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b83811015610f20578082015181840152602081019050610f05565b60008484015250505050565b6000601f19601f8301169050919050565b6000610f4882610ee6565b610f528185610ef1565b9350610f62818560208601610f02565b610f6b81610f2c565b840191505092915050565b60006020820190508181036000830152610f908184610f3d565b905092915050565b600080fd5b600080fd5b6000819050919050565b610fb581610fa2565b8114610fc057600080fd5b50565b600081359050610fd281610fac565b92915050565b600060208284031215610fee57610fed610f98565b5b6000610ffc84828501610fc3565b91505092915050565b60008115159050919050565b61101a81611005565b82525050565b60006020820190506110356000830184611011565b92915050565b6000819050919050565b61104e8161103b565b82525050565b60006020820190506110696000830184611045565b92915050565b6110788161103b565b811461108357600080fd5b50565b6000813590506110958161106f565b92915050565b6000602082840312156110b1576110b0610f98565b5b60006110bf84828501611086565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110f3826110c8565b9050919050565b611103816110e8565b82525050565b600060208201905061111e60008301846110fa565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261114957611148611124565b5b8235905067ffffffffffffffff81111561116657611165611129565b5b6020830191508360408202830111156111825761118161112e565b5b9250929050565b60008083601f84011261119f5761119e611124565b5b8235905067ffffffffffffffff8111156111bc576111bb611129565b5b6020830191508360208202830111156111d8576111d761112e565b5b9250929050565b600080600080600080608087890312156111fc576111fb610f98565b5b600061120a89828a01611086565b965050602061121b89828a01610fc3565b955050604087013567ffffffffffffffff81111561123c5761123b610f9d565b5b61124889828a01611133565b9450945050606087013567ffffffffffffffff81111561126b5761126a610f9d565b5b61127789828a01611189565b92509250509295509295509295565b60008083601f84011261129c5761129b611124565b5b8235905067ffffffffffffffff8111156112b9576112b8611129565b5b6020830191508360208202830111156112d5576112d461112e565b5b9250929050565b600080600080604085870312156112f6576112f5610f98565b5b600085013567ffffffffffffffff81111561131457611313610f9d565b5b61132087828801611286565b9450945050602085013567ffffffffffffffff81111561134357611342610f9d565b5b61134f87828801611133565b925092505092959194509250565b611366816110e8565b811461137157600080fd5b50565b6000813590506113838161135d565b92915050565b60006020828403121561139f5761139e610f98565b5b60006113ad84828501611374565b91505092915050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b60006113ec600c83610ef1565b91506113f7826113b6565b602082019050919050565b6000602082019050818103600083015261141b816113df565b9050919050565b600081905092915050565b50565b600061143d600083611422565b91506114488261142d565b600082019050919050565b600061145e82611430565b9150819050919050565b7f73656e6420657468206661696c65640000000000000000000000000000000000600082015250565b600061149e600f83610ef1565b91506114a982611468565b602082019050919050565b600060208201905081810360008301526114cd81611491565b9050919050565b60008160601b9050919050565b60006114ec826114d4565b9050919050565b60006114fe826114e1565b9050919050565b611516611511826110e8565b6114f3565b82525050565b6000819050919050565b6115376115328261103b565b61151c565b82525050565b60006115498285611505565b6014820191506115598284611526565b6020820191508190509392505050565b7f706c65617365207265616420746865207465726d7320616e6420636f6e64697460008201527f696f6e7300000000000000000000000000000000000000000000000000000000602082015250565b60006115c5602483610ef1565b91506115d082611569565b604082019050919050565b600060208201905081810360008301526115f4816115b8565b9050919050565b61160481610fa2565b82525050565b600082825260208201905092915050565b6000819050919050565b60006116346020840184611374565b905092915050565b611645816110e8565b82525050565b600061165a6020840184610fc3565b905092915050565b61166b81610fa2565b82525050565b604082016116826000830183611625565b61168f600085018261163c565b5061169d602083018361164b565b6116aa6020850182611662565b50505050565b60006116bc8383611671565b60408301905092915050565b600082905092915050565b6000604082019050919050565b60006116ec838561160a565b93506116f78261161b565b8060005b858110156117305761170d82846116c8565b61171788826116b0565b9750611722836116d3565b9250506001810190506116fb565b5085925050509392505050565b600060608201905061175260008301876115fb565b61175f60208301866110fa565b81810360408301526117728184866116e0565b905095945050505050565b7f70726f6f6620696e76616c696400000000000000000000000000000000000000600082015250565b60006117b3600d83610ef1565b91506117be8261177d565b602082019050919050565b600060208201905081810360008301526117e2816117a6565b9050919050565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b600061181f600f83610ef1565b915061182a826117e9565b602082019050919050565b6000602082019050818103600083015261184e81611812565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118be82610fa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118f0576118ef611884565b5b600182019050919050565b7f6f776e6572206973207a65726f00000000000000000000000000000000000000600082015250565b6000611931600d83610ef1565b915061193c826118fb565b602082019050919050565b6000602082019050818103600083015261196081611924565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061199d601f83610ef1565b91506119a882611967565b602082019050919050565b600060208201905081810360008301526119cc81611990565b9050919050565b60006040820190506119e860008301856110fa565b6119f560208301846115fb565b9392505050565b611a0581611005565b8114611a1057600080fd5b50565b600081519050611a22816119fc565b92915050565b600060208284031215611a3e57611a3d610f98565b5b6000611a4c84828501611a13565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000611ab1602a83610ef1565b9150611abc82611a55565b604082019050919050565b60006020820190508181036000830152611ae081611aa4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000611b43602683610ef1565b9150611b4e82611ae7565b604082019050919050565b60006020820190508181036000830152611b7281611b36565b9050919050565b600081519050919050565b6000611b8f82611b79565b611b998185611422565b9350611ba9818560208601610f02565b80840191505092915050565b6000611bc18284611b84565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000611c02601d83610ef1565b9150611c0d82611bcc565b602082019050919050565b60006020820190508181036000830152611c3181611bf5565b905091905056fea2646970667358221220f4e1120c9e6e1dbf2d85cb314a836f5125182ea5800982c5a3e6976ccc3c6a1b64736f6c63430008120033
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH 75.87% $3,694.56 202.2983 $747,402.34 ETH 9.47% $1 93,300.9227 $93,300.92 ETH 5.19% $0.401815 127,155.3829 $51,092.94 ETH 4.68% $42.78 1,077.6399 $46,101.44 ETH 1.43% $2.36 5,957.339 $14,059.32 ETH 0.73% $1 7,191.5638 $7,191.56 ETH 0.61% $3.83 1,563.967 $5,990.87 ETH 0.41% $12.85 317.8819 $4,084.78 ETH 0.36% $115.93 30.3842 $3,522.44 ETH 0.31% $0.481455 6,357.1262 $3,060.67 ETH 0.30% $23.31 127.9274 $2,981.99 ETH 0.13% $71.59 18.1244 $1,297.53 ETH 0.09% $0.000027 34,273,040.9373 $924 ETH 0.06% $20.51 30.0826 $616.99 ETH 0.06% $0.525172 1,039.2247 $545.77 ETH 0.06% $1.08 502.7062 $541.92 ETH 0.04% $3.05 143.4083 $437.4 ETH 0.04% $0.509294 692.5852 $352.73 ETH 0.03% $1.81 137.7612 $249.35 ETH 0.02% $1.19 205.4696 $244.51 ETH 0.02% $8.18 29.0771 $237.85 ETH 0.02% $23,414 0.00949997 $222.43 ETH 0.02% $1.66 99.6278 $165.38 ETH 0.02% $18.47 8.4491 $156.06 ETH <0.01% $3.18 26.8521 $85.44 ETH <0.01% $137,210 0.00050026 $68.64 ETH <0.01% $0.01568 2,685 $42.1 ETH <0.01% $0.966125 34.8876 $33.71 ETH <0.01% $3.21 8.4095 $27.03 ETH <0.01% $0.586965 29.0342 $17.04 ETH <0.01% $0.428349 36.7623 $15.75 ETH <0.01% $3.87 3.7109 $14.36 ETH <0.01% $1.43 9.7785 $13.98 ETH <0.01% $1.06 12.7085 $13.43 ETH <0.01% <$0.000001 1,094,446,863.0938 $12.77 ETH <0.01% $74.15 0.0437 $3.24 ETH <0.01% $18.03 0.0818 $1.47 ETH <0.01% $0.285188 4.5415 $1.3 ETH <0.01% $7,928.63 0.00013352 $1.06 ETH <0.01% $0.000301 3,041.9994 $0.9164 ETH <0.01% $0.001078 744.0161 $0.8019 ETH <0.01% $202.09 0.00101591 $0.2053 Loading...Loading[ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.