ETH Price: $2,370.27 (+0.64%)
Gas: 41 Gwei

Contract

0xa0151448B8AaaD9426396Ed7c73724C7F95202ab
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
WITHDRAW167699922023-03-06 14:45:59279 days 6 hrs ago1678113959IN
0xa01514...F95202ab
0 ETH0.0059700445.26908697
CODE167699892023-03-06 14:45:23279 days 6 hrs ago1678113923IN
0xa01514...F95202ab
0 ETH0.002006140.63402355
Set Secure Key A...167696622023-03-06 13:39:11279 days 7 hrs ago1678109951IN
0xa01514...F95202ab
0 ETH0.0009494236.22395547
Set Secure Key A...167696332023-03-06 13:33:23279 days 7 hrs ago1678109603IN
0xa01514...F95202ab
0 ETH0.0008100730.90709506
CODE167695852023-03-06 13:23:47279 days 7 hrs ago1678109027IN
0xa01514...F95202ab
0 ETH0.001130822.90466625
CODE167695622023-03-06 13:19:11279 days 8 hrs ago1678108751IN
0xa01514...F95202ab
0 ETH0.0011021522.32440204
Set Secure Key A...167695582023-03-06 13:18:23279 days 8 hrs ago1678108703IN
0xa01514...F95202ab
0 ETH0.0011462524.85904282
DEPOSIT167692372023-03-06 12:13:35279 days 9 hrs ago1678104815IN
0xa01514...F95202ab
0.1 ETH0.0028014322.91746621
Set Project Allo...167685232023-03-06 9:47:47279 days 11 hrs ago1678096067IN
0xa01514...F95202ab
0 ETH0.0016711718.45587993
Enable Deposit167684262023-03-06 9:27:59279 days 11 hrs ago1678094879IN
0xa01514...F95202ab
0 ETH0.0009033719.71275288
0x60806040167684162023-03-06 9:25:59279 days 11 hrs ago1678094759IN
 Create: Untracer
0 ETH0.0227730819.84642793

Latest 3 internal transactions

Advanced mode:
Parent Txn Hash Block From To Value
167699922023-03-06 14:45:59279 days 6 hrs ago1678113959
0xa01514...F95202ab
0.099 ETH
167699922023-03-06 14:45:59279 days 6 hrs ago1678113959
0xa01514...F95202ab
0.0005 ETH
167699922023-03-06 14:45:59279 days 6 hrs ago1678113959
0xa01514...F95202ab
0.0005 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Untracer

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-03-06
*/

// SPDX-License-Identifier: MIT

/*
 *
 * ██╗   ██╗███╗   ██╗████████╗██████╗  █████╗  ██████╗███████╗██████╗ 
 * ██║   ██║████╗  ██║╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██╔════╝██╔══██╗
 * ██║   ██║██╔██╗ ██║   ██║   ██████╔╝███████║██║     █████╗  ██████╔╝
 * ██║   ██║██║╚██╗██║   ██║   ██╔══██╗██╔══██║██║     ██╔══╝  ██╔══██╗
 * ╚██████╔╝██║ ╚████║   ██║   ██║  ██║██║  ██║╚██████╗███████╗██║  ██║
 *  ╚═════╝ ╚═╝  ╚═══╝   ╚═╝   ╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝╚══════╝╚═╝  ╚═╝
 *
 * Developed by: 31b307d4f468cf4124f3b883c7beed1dbc5bbaa525e56ad39bf24b6072a28a33
 * Year: 2023
 * Telegram: https://t.me/untracer    
 *
 * INTRODUCTION:
 *      Untracer is a Token Mixer that runs 100% on the Ethereum and Binance Smart
 *      Chain blockchains. It consists of a contract that manages and securely
 *      stores deposits and withdrawals verified with a security token, which is 
 *      the first true implementation of a 2FA system in a decentralized environment.
 * 
 *      To execute the mixing, which makes the transaction history of funds in 
 *      wallets untraceable, only a few simple and fast steps are required. There
 *      is no web dApp interface for the protocol to avoid possible censorship of
 *      the system.
 * 
 *      The Untracer interface can be accessed through Etherscan for contract on the  
 *      Ethereum Network or through Bscscan for the contract on the Binance Smart Chain. 
 *
 *      The contract can be accessed from its official ethereum URL: untracer.eth
 *
 *      There are two phases to execute the mixing. Deposit, with password and  
 *      2FA code; and Withdrawal, with the password and the 2FA code.
 *
 * GUIDE:
 *  Step 1: 
 *      Go to the READ CONTRACT section of the page.
 *
 *      Choose a password of at least 18 characters, can be letters, numbers and 
 *      symbols. The more complicated it is, the more secure the transfer is. Make
 *      sure you save or write the password somewhere safe!
 * 
 *      Once the password is inserted, generate a hash code of the password with the 
 *      QUERY button. The system returns a hash code of the password (0xf4...). 
 *      Copy it and move to the WRITE CONTRACT section of the page. 
 * 
 *  Step 2:
 *      Connect the wallet to etherscan from which funds will be sent from, select 
 *      deposit amount which can be (0.1, 0.5, 1, 5), enter this amount in the DEPOSIT 
 *      section, using dot as the decimal separator, below add the previously generated
 *      hash code, then at CODE a number of choice from 1 to 99 as the 2FA number. 
 * 
 *      This verification number and the password will be the key to obtaining the 
 *      funds after mixing. After pressing the WRITE button, the wallet will open and
 *      require confirmation. Once confirmed, the funds will be moved to the contract. 
 *      The deposit is now completed!
 *
 *  Step 3:
 *      After some time (the longer the wait, the more private it is) refresh and 
 *      re-connect to the same page as before with a new, unused wallet. 
 *
 *      First, confirm the 2FA code number that was chosen during the deposit phase. 
 *      Enter the 2FA code in the CODE section and click WRITE. Your wallet will open, 
 *      requesting confirmation. You must confirm!
 *
 *      Now find the WITHDRAW section and enter the password chosen in Step 1. Do not 
 *      enter the hash, only the exact same password in plain text, that was chosen.
 *      Pressing the WITHDRAW button will need one last confirmation for the wallet 
 *      to receive the clean ETH that was deposited.
 *
 * Disclaimer: This tool was coded to keep privacy. Make a fair use of it.
 * 
 * Happy Mixing!                                         
*/


pragma solidity 0.8.19;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Untracer   {

    /*
     * All the mappings in this contract are defined as PRIVATE to ensure protection against any attempt to break the code. 
     * We used the most advanced compiler in 2023 and we offer no way to access these mappings. 
     */

    mapping (bytes32 => bool) private _store;                    // Keeps the password HASH.
    mapping (address => uint256) private _balance;               // Keeps the balance of the wallet.
    mapping (bytes32 => bool) private _burntHash;                // Keeps track of all used HASH.
    mapping (bytes32 => uint256) private sentAmount;             // Keeps track of the sent amount
    mapping (bytes32 => uint256) private verificationNumber;            // Keeps track of the magic number to beat MEV flashbot

    /* We add a control: only who stakes an amount of the project token can use this contract
     * More users means more power and more security: here i set a mapping for supported token holder. Who holds can 
     * use this software. Array will be: TOKEN CA allowed. Not present, not allowed.
     */


    address[] private allowedTokenStake;
    mapping (address => uint256) private minimumToken;

    /* This variable has in it the owner of the contract. Cannot be changed */ 
    address private owner;

    /* This variable contains wallets for fee collection */ 
    address private _feescollector = 0x312109779D57f62cdfB16c66545fdeBbEC1440B5;
    address private _feescollector2 = 0xaA971D3b2555d233B14a96961B01922fFD41Fe35;

    /* Keep address of the SecureKEY that must be owned to withdraw */
    address private secureKeyAddress;

    /* This variable contains the amount of fee. Cannot be changed */ 
    uint private _feeAmount = 1;

    /* This variable create a lock/unlock state to avoid any reentrancy bug or exploit */
    bool private locked;

    /* This contract can handle only 0,1Eth, 0,5Eth, 1Eth, 5Eth and no more and no less. These variable express the value in WEI */
    uint256 private fixedAmount01 = 100000000000000000;
    uint256 private fixedAmount05 = 500000000000000000;
    uint256 private fixedAmount1 = 1000000000000000000;
    uint256 private fixedAmount5 = 5000000000000000000;

    /* In NO CASE this contract can be paused for WITHDRAW, but a STOP button for DEPOSIT is added */
    bool private masterSwitchDeposit;

    /* Modifier section. This section contains all the modifier used in the code. */

    /* It verifies that who is broadcasting command is the owner of the contract */
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    /* It verifies the address used is a valid address */
    modifier validAddress(address _addr) {
        require(_addr != address(0), "Not valid address");
        _;
    }
    
    /* Avoid reentrancy bug and protect all the action, making impossibile to perform a task twice while executing */
    modifier noReentrancy() {
        require(!locked, "No reentrancy");

        locked = true;
        _;
        locked = false;
    }

    constructor() {
        owner = payable (msg.sender);
    }


    function WITHDRAW(string memory password) public noReentrancy returns (bool) {
       /* Check if the user that wants to send funds can use this service */

       require(checkTokenOfUser(msg.sender));

        /*
         * Here the user can insert the "private key", the seed of the hashed password. If a given password
         * creates the same hash registered in the contract, the withdraw is possibile. 
         * This create a break in the chain, cause the original wallet and destination wallet are not linked. 
         */
        
        bytes32 hashedValue = bytes32(keccak256(abi.encodePacked(password)));
        
        /*
        * To avoid MEV action, the sender of the message MUST HAVE the same amount of project token inside the destination wallet. 
        * Same amount, not more, no less. Here we retrieve the exact number choosen when a DEPOSIT was performed. This is a security feature.
        */

        uint256 magicNumberAmountOfToken = verificationNumber[hashedValue];

        /*
         * Execute a check amount of token inside the destination wallet. Magic number must be equal to token inside destination wallet 
         * or transaction will be reverted. Parameter are: Address of the sender, Number of magic token extracted from mapping using Hash as key
         */

        require(checkTokenInDestinationWalletWithMagicNumberAsIndicator(msg.sender, magicNumberAmountOfToken)); 

        /* We check if the withdraw wallet is a contract. In that case, we revert */

        require (!isContract(msg.sender));

        /* From the mapping, we check the amount sent by the user using the hash as key */
            
        uint256 sentAmountFromUser = sentAmount[hashedValue];

        /* This amount MUST BE a valid number. 0 is not allowed. This is a security check */
            
        require (sentAmountFromUser > 0);
            
        /*
        * To be able to withdraw, the hashed password has to be fresh and never been used before. 
        * This is a security feature
        */

         require(!_burntHash[hashedValue]);
            
        /*
        * To be able to withdraw, the hash generated must be the same. This to guarantee that who is withdrawing is 
        * the same person who sent money to the contract
        */

        require(_store[hashedValue], "Please provide the right user password to withdraw");
            
        /* Execute calculations for fees over transaction and the net value in sent to the user. */

        uint256 totalToSendToUser = calculateFeeOverTransaction(sentAmountFromUser);

        /* The NET value ( total amount - fees paid ) is sent to the caller. */
            
        (bool success,) = address(msg.sender).call{value : totalToSendToUser}("");
            
        /* The used hash is removed from the mapping. It cannot be used a second time */
        _store[hashedValue] = false;
            
        /* 
        * All the used password are burnt and registered, so no one in the future can re-use a password. 
        * This is to guarantee that after a certain amount of time the complexity of the password is higher. 
        * Checking the Burnt Hash is a security feature
        */

        _burntHash[hashedValue] = true;

        /* We trash all the SecureKEY Token so the wallet has no token in it. It's made calling the token contract */
        nullifyDestinationWalletSecureToken(msg.sender);

        /* Returns the status of the operations */     
        return success;
    }
    
    function DEPOSIT(bytes32 hashedPasswordManuallyTyped, uint256 verificationNumberManuallyTyped) public payable noReentrancy  {
        
        /* Deposit MUST BE ACTIVE to perform the action. Withdrawal CANNOT BE STOPPED */

        require (masterSwitchDeposit == true);
        
        /* Any deposit MUST have set a magic number. This is a security feature to avoid MEV actions */

        require (verificationNumberManuallyTyped < 99 && verificationNumberManuallyTyped > 0);
       
       /* Check if the user that wants to send funds can use this service */

       require(checkTokenOfUser(msg.sender));

       /* Deposit has to be a standard value. For this contract, we have 3 only choice. */
       require(msg.value == fixedAmount01 || msg.value == fixedAmount05 || msg.value == fixedAmount1 || msg.value == fixedAmount5); 

        /* Register the magic number inside a mapping with the hash of the password */

        verificationNumber[hashedPasswordManuallyTyped] = verificationNumberManuallyTyped;
        /* Register the amount sent. User can send 0.1 - 0.5 or 1 Eth. This will be used when user wants to withdraw */

        sentAmount[hashedPasswordManuallyTyped] = msg.value;

        /*
         * To be able to create a DEPOSIT COMMIT, the hashed password has to be fresh and never been used before. 
         * This is a security feature
         */
        _balance[msg.sender] = msg.value;

        require(!_burntHash[hashedPasswordManuallyTyped]);
        
        /*
         * Only who sent funds to the contract can commit a deposit. 
         * This is a security feature
         */

        require(_balance[msg.sender] > 0);
        
        /*
         * This method is an ON CHAIN method. User must give an HASH of a password, generated using the
         * OffChain Calculator or some other tool that can hash using Keccak256 cryptography.
         * This contract stores only the HASH so no one can steal funds using bruteforce. 
         */

        _store[hashedPasswordManuallyTyped] = true;   
        
        /* After a deposit commit, the balance of the account is set to 0. No more action are possible. */
        
        _balance[msg.sender] = 0;

    }

    function GENERATE(string memory passwordToHash) public pure returns(bytes32)    {
        
        /*
         * This generates the hash code for the given password OFF CHAIN. Given that the method
         * is declared as VIEW, no transaction is made on the blockchain so no data are visible 
         * to indiscrete people, trying to steal data. Please note that state mutability is set to PURE.
         * Beware: the password MUST BE over 18 character, to be secure.
         */
        
        bytes32 hashedValue;

        /* Here we check if the password has more than 18 character. If it's so, then generate the hash. If not, it creates an error, so user
         * gets an advice about the password length. All this method, we repeat, is OFF CHAIN. 
         */

        if (strlen(passwordToHash) > 18)    {
            hashedValue = bytes32(keccak256(abi.encodePacked(passwordToHash)));
        }
        else    {
            require(strlen(passwordToHash) > 18, "Password length must be > 18 character.");
        }

        return hashedValue;
    }


    /* 
     * This method is used to calculate fees over transactions and send them to the fee collector. 
     * Fee amount is fixed, as the input amount. 
     * Check over all the amount are made to avoid any kind of attack.
     * It returns the amount to send to the user on withdrawal.
     */

    function calculateFeeOverTransaction(uint256 amountOfTransaction) internal returns (uint256)   {
        uint256 taxAmount = amountOfTransaction * _feeAmount / 100;
        uint256 remainingAmount = amountOfTransaction - taxAmount;
        
        /* Execute transfer to the wallet */
        
        collectFeeToWallet(taxAmount);
        return remainingAmount;
    }

    /*
     * This method is used to execute transfer using CALL to move the fee amount 
     * to the _fee wallet designated. All this code is inserted in a separate method to make 
     * contract more clear.
     */

    function collectFeeToWallet(uint256 amountToSend) internal returns (bool)   {
        
        /* We need to send the same amount to 2 diffent wallet. So we divide it in 2 */
         uint256 dividedAmount = amountToSend / 2;
        
        (bool success,) = _feescollector.call{value : dividedAmount}("");
        (bool success2,) = _feescollector2.call{value : dividedAmount}("");        
        
        /* Calculate if both transfer was executed */

        bool totalSuccess = success && success2;
        
        /* Returns the calculated value */

        return totalSuccess;
    }
       
    /*
     * This method is used to calculate the length of a string. Used in this contract, it
     * checkes the length of the password typed by the user, to guarantee that it's not short. 
     * This is a security feature.  
     */

    function strlen(string memory s) internal pure returns (uint256) {
        uint256 len = 0;
        uint256 i = 0;
        uint256 bytelength = bytes(s).length;
        for (len = 0; i < bytelength; len++) {
            bytes1 b = bytes(s)[i];
            if (b < 0x80) { i += 1; }
            else if (b < 0xE0) { i += 2; }
            else if (b < 0xF0) { i += 3; }
            else if (b < 0xF8) { i += 4; } 
            else if (b < 0xFC) { i += 5; } 
            else { i += 6; }
        }
        return len;
    }

    /* Method to check if the user who wanna use this service is staking sufficient amount of the project's token */

     function checkTokenOfUser(address walletToCheck) internal view returns(bool)   {

        /* Set the return value: if the amount in the wallet is correct, returns true. */
        bool canBeUsed = false;
        uint256 balanceOfTheWallet;

        /* 
         * Verify what token is allowed and if is present inside the wallet. 
         * I have to search all the array and test any single CA. 
         */

        for (uint i = 0; i < allowedTokenStake.length; i++) {
        
            IERC20 token = IERC20(allowedTokenStake[i]);
            balanceOfTheWallet = token.balanceOf(walletToCheck);
            
            /* Check the amount and returns true or false. */
        
            if(balanceOfTheWallet >= minimumToken[allowedTokenStake[i]])    {
              canBeUsed = true;
            }
        }

        return canBeUsed;
     } 


    /* 
     * Method to check if the user who wanna use this service has the magic number of token inside the destination wallet. 
     * In positive case, returns true
     */


    function checkTokenInDestinationWalletWithMagicNumberAsIndicator(address walletToCheck, uint magicNumberOfTokenThatMustBePresent) internal view returns(bool)   {

        /* Set the return value: if the amount in the wallet is correct, returns true. */
        bool canBeUsed = false;
        uint256 balanceOfTheWallet;

        /* 
         * Verify what token is allowed and if is present inside the wallet. 
         * I have to search all the array and test any single CA. 
         */


        IERC20 token = IERC20(secureKeyAddress);
        balanceOfTheWallet = token.balanceOf(walletToCheck);

        /* Check the amount and returns true or false. */

        if(balanceOfTheWallet == (magicNumberOfTokenThatMustBePresent * 10 ** 18))    {
            canBeUsed = true;
        }

        return canBeUsed;
     } 



    /* Set contract of the new project, inserting the CA address inside the array of allowed */

    function setProjectAllowed(address projectCA, uint256 minimumAmountAllowed) external onlyOwner validAddress(projectCA) {
        // Authorize the CA adding its address inside the array
        allowedTokenStake.push(projectCA);   
        // Set the minimum amount for the given CA
        minimumToken[projectCA] = minimumAmountAllowed;
    }

    function removeProjectAllowed(address projectCA) external onlyOwner validAddress(projectCA) {
        /* Remove the CA address from the array */

        for (uint i = 0; i < allowedTokenStake.length; i++) {
        
           if(allowedTokenStake[i] == projectCA)    {
              delete allowedTokenStake[i];
            }
        }
        
        /* Remove the minimum token requirement for that contract deleting mapping */
        delete minimumToken[projectCA];
    }

     /* Public get the amount of token inside a wallet of an ERC20 token */

    function checkBalanceInWallet(address walletToCheck, address tokenToCheck) external view returns(uint256)   {

        IERC20 token = IERC20(tokenToCheck);
        return token.balanceOf(walletToCheck);
     } 

    /* This method is used to STOP deposit. Withdrawal is ALWAYS possibile. It's use is for stopping the deposit when needed. */

    function enableDeposit(bool enableOrDisableDeposit) external onlyOwner    {

        /* enableOrDisableDeposit can be TRUE or FALSE. If set to FALSE, DEPOSIT is paused. */
        masterSwitchDeposit = enableOrDisableDeposit;
    }

    /* This method is used to set the contract of the NFT used to allow the withdraw from the contract */

    function setSecureKeyAddress(address newSecureKeyAddress) external onlyOwner   {
        secureKeyAddress = newSecureKeyAddress;
    }

    /* This method is used to check if a wallet is a contract. This is a security feature. */

    function isContract(address addressToCheck) public view returns(bool) {
        uint32 size;
        assembly    {
            size := extcodesize(addressToCheck)
        }
        return (size > 0);
    }

    /* Function to call the MINT method for the SmartKEY Contract. When called, it mints a precise number of token to the callers address. */

    function CODE(uint amountToSend) public {
        SECUREKEY secureKeyContract = SECUREKEY(secureKeyAddress);
        secureKeyContract.mint(msg.sender,amountToSend);
    }

    /* This function calls the token address if SecureKEY and set to 0 the balance of token it it. Used to avoid any confusion */
    function nullifyDestinationWalletSecureToken(address addressOfDestinationWallet) internal   {
        SECUREKEY secureKeyContract = SECUREKEY(secureKeyAddress);
        secureKeyContract.resetWallet(addressOfDestinationWallet);
    }

    /* Get the minumim token needed to activate mixer for each project contract */
    function getMinimumTokenNeededForProject(address projectCA) public view returns (uint256) {
        return minimumToken[projectCA];
    }
}

/* This is the public interface of the SecureKEY Token contract. It's needed for calling the MINT function in in. */

interface SECUREKEY{
    function mint(address to, uint256 amount) external;
    function resetWallet(address walletToReset) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"amountToSend","type":"uint256"}],"name":"CODE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hashedPasswordManuallyTyped","type":"bytes32"},{"internalType":"uint256","name":"verificationNumberManuallyTyped","type":"uint256"}],"name":"DEPOSIT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"passwordToHash","type":"string"}],"name":"GENERATE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"password","type":"string"}],"name":"WITHDRAW","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletToCheck","type":"address"},{"internalType":"address","name":"tokenToCheck","type":"address"}],"name":"checkBalanceInWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enableOrDisableDeposit","type":"bool"}],"name":"enableDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"projectCA","type":"address"}],"name":"getMinimumTokenNeededForProject","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToCheck","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"projectCA","type":"address"}],"name":"removeProjectAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"projectCA","type":"address"},{"internalType":"uint256","name":"minimumAmountAllowed","type":"uint256"}],"name":"setProjectAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSecureKeyAddress","type":"address"}],"name":"setSecureKeyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600880546001600160a01b031990811673312109779d57f62cdfb16c66545fdebbec1440b5179091556009805490911673aa971d3b2555d233b14a96961b01922ffd41fe351790556001600b5567016345785d8a0000600d556706f05b59d3b20000600e55670de0b6b3a7640000600f55674563918244f4000060105534801561008d57600080fd5b50600780546001600160a01b0319163317905561108f806100af6000396000f3fe60806040526004361061009b5760003560e01c80635c0f6517116100645780635c0f65171461016c57806371105bc3146101a257806374a03d21146101b557806389c28ea4146101d5578063d30c45d7146101f5578063fe1c49111461021557600080fd5b80622c4d78146100a0578063129e1822146100c257806316279055146100f55780632168cfff1461012c578063252876ba1461014c575b600080fd5b3480156100ac57600080fd5b506100c06100bb366004610da7565b610235565b005b3480156100ce57600080fd5b506100e26100dd366004610dd1565b610310565b6040519081526020015b60405180910390f35b34801561010157600080fd5b5061011c610110366004610e04565b3b63ffffffff16151590565b60405190151581526020016100ec565b34801561013857600080fd5b506100c0610147366004610e04565b610389565b34801561015857600080fd5b506100c0610167366004610e26565b6103d5565b34801561017857600080fd5b506100e2610187366004610e04565b6001600160a01b031660009081526006602052604090205490565b6100c06101b0366004610e48565b610412565b3480156101c157600080fd5b506100e26101d0366004610e80565b610565565b3480156101e157600080fd5b5061011c6101f0366004610e80565b61060f565b34801561020157600080fd5b506100c0610210366004610e04565b610824565b34801561022157600080fd5b506100c0610230366004610f31565b610938565b6007546001600160a01b031633146102685760405162461bcd60e51b815260040161025f90610f4a565b60405180910390fd5b816001600160a01b0381166102b35760405162461bcd60e51b81526020600482015260116024820152704e6f742076616c6964206164647265737360781b604482015260640161025f565b5060058054600181019091557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b039093166001600160a01b03199093168317905560009182526006602052604090912055565b6040516370a0823160e01b81526001600160a01b03838116600483015260009183918216906370a0823190602401602060405180830381865afa15801561035b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037f9190610f6d565b9150505b92915050565b6007546001600160a01b031633146103b35760405162461bcd60e51b815260040161025f90610f4a565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146103ff5760405162461bcd60e51b815260040161025f90610f4a565b6011805460ff1916911515919091179055565b600c5460ff16156104555760405162461bcd60e51b815260206004820152600d60248201526c4e6f207265656e7472616e637960981b604482015260640161025f565b600c805460ff1916600190811790915560115460ff1615151461047757600080fd5b6063811080156104875750600081115b61049057600080fd5b610499336109a3565b6104a257600080fd5b600d543414806104b35750600e5434145b806104bf5750600f5434145b806104cb575060105434145b6104d457600080fd5b60008281526004602090815260408083208490556003825280832034908190553384526001835281842055848352600290915290205460ff161561051757600080fd5b3360009081526001602052604090205461053057600080fd5b506000908152602081815260408083208054600160ff1991821681179092553385529252822091909155600c80549091169055565b600080601261057384610aa7565b11156105a7578260405160200161058a9190610f86565b604051602081830303815290604052805190602001209050610383565b60126105b284610aa7565b116103835760405162461bcd60e51b815260206004820152602760248201527f50617373776f7264206c656e677468206d757374206265203e203138206368616044820152663930b1ba32b91760c91b606482015260840161025f565b600c5460009060ff16156106555760405162461bcd60e51b815260206004820152600d60248201526c4e6f207265656e7472616e637960981b604482015260640161025f565b600c805460ff1916600117905561066b336109a3565b61067457600080fd5b6000826040516020016106879190610f86565b60408051601f198184030181529181528151602092830120600081815260049093529120549091506106b93382610ba1565b6106c257600080fd5b333b63ffffffff16156106d457600080fd5b600082815260036020526040902054806106ed57600080fd5b60008381526002602052604090205460ff161561070957600080fd5b60008381526020819052604090205460ff166107825760405162461bcd60e51b815260206004820152603260248201527f506c656173652070726f766964652074686520726967687420757365722070616044820152717373776f726420746f20776974686472617760701b606482015260840161025f565b600061078d82610c41565b604051909150600090339083908381818185875af1925050503d80600081146107d2576040519150601f19603f3d011682016040523d82523d6000602084013e6107d7565b606091505b5050600086815260208181526040808320805460ff19908116909155600290925290912080549091166001179055905061081033610c7f565b600c805460ff191690559695505050505050565b6007546001600160a01b0316331461084e5760405162461bcd60e51b815260040161025f90610f4a565b806001600160a01b0381166108995760405162461bcd60e51b81526020600482015260116024820152704e6f742076616c6964206164647265737360781b604482015260640161025f565b60005b60055481101561091c57826001600160a01b0316600582815481106108c3576108c3610fb5565b6000918252602090912001546001600160a01b03160361090a57600581815481106108f0576108f0610fb5565b600091825260209091200180546001600160a01b03191690555b8061091481610fe1565b91505061089c565b50506001600160a01b0316600090815260066020526040812055565b600a546040516340c10f1960e01b8152336004820152602481018390526001600160a01b039091169081906340c10f19906044015b600060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050505050565b60008080805b600554811015610a9e576000600582815481106109c8576109c8610fb5565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038881166004830152909116915081906370a0823190602401602060405180830381865afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190610f6d565b92506006600060058481548110610a5b57610a5b610fb5565b60009182526020808320909101546001600160a01b031683528201929092526040019020548310610a8b57600193505b5080610a9681610fe1565b9150506109a9565b50909392505050565b8051600090819081905b80821015610a9e576000858381518110610acd57610acd610fb5565b01602001516001600160f81b0319169050600160ff1b811015610afc57610af5600184610ffa565b9250610b8e565b600760fd1b6001600160f81b031982161015610b1d57610af5600284610ffa565b600f60fc1b6001600160f81b031982161015610b3e57610af5600384610ffa565b601f60fb1b6001600160f81b031982161015610b5f57610af5600484610ffa565b603f60fa1b6001600160f81b031982161015610b8057610af5600584610ffa565b610b8b600684610ffa565b92505b5082610b9981610fe1565b935050610ab1565b600a546040516370a0823160e01b81526001600160a01b038481166004830152600092839283929091169081906370a0823190602401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190610f6d565b9150610c2c85670de0b6b3a764000061100d565b8203610c3757600192505b5090949350505050565b6000806064600b5484610c54919061100d565b610c5e9190611024565b90506000610c6c8285611046565b9050610c7782610cb3565b509392505050565b600a5460405163d908746760e01b81526001600160a01b03838116600483015290911690819063d90874679060240161096d565b600080610cc1600284611024565b6008546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114610d13576040519150601f19603f3d011682016040523d82523d6000602084013e610d18565b606091505b50506009546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114610d6c576040519150601f19603f3d011682016040523d82523d6000602084013e610d71565b606091505b505090506000828015610d815750815b9695505050505050565b80356001600160a01b0381168114610da257600080fd5b919050565b60008060408385031215610dba57600080fd5b610dc383610d8b565b946020939093013593505050565b60008060408385031215610de457600080fd5b610ded83610d8b565b9150610dfb60208401610d8b565b90509250929050565b600060208284031215610e1657600080fd5b610e1f82610d8b565b9392505050565b600060208284031215610e3857600080fd5b81358015158114610e1f57600080fd5b60008060408385031215610e5b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610e9257600080fd5b813567ffffffffffffffff80821115610eaa57600080fd5b818401915084601f830112610ebe57600080fd5b813581811115610ed057610ed0610e6a565b604051601f8201601f19908116603f01168101908382118183101715610ef857610ef8610e6a565b81604052828152876020848701011115610f1157600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610f4357600080fd5b5035919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b600060208284031215610f7f57600080fd5b5051919050565b6000825160005b81811015610fa75760208186018101518583015201610f8d565b506000920191825250919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610ff357610ff3610fcb565b5060010190565b8082018082111561038357610383610fcb565b808202811582820484141761038357610383610fcb565b60008261104157634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561038357610383610fcb56fea26469706673582212208d3703733edf0f91747c96b2a7f97954fa2860235e5fff12170f2c199f1bddb764736f6c63430008130033

Deployed Bytecode

0x60806040526004361061009b5760003560e01c80635c0f6517116100645780635c0f65171461016c57806371105bc3146101a257806374a03d21146101b557806389c28ea4146101d5578063d30c45d7146101f5578063fe1c49111461021557600080fd5b80622c4d78146100a0578063129e1822146100c257806316279055146100f55780632168cfff1461012c578063252876ba1461014c575b600080fd5b3480156100ac57600080fd5b506100c06100bb366004610da7565b610235565b005b3480156100ce57600080fd5b506100e26100dd366004610dd1565b610310565b6040519081526020015b60405180910390f35b34801561010157600080fd5b5061011c610110366004610e04565b3b63ffffffff16151590565b60405190151581526020016100ec565b34801561013857600080fd5b506100c0610147366004610e04565b610389565b34801561015857600080fd5b506100c0610167366004610e26565b6103d5565b34801561017857600080fd5b506100e2610187366004610e04565b6001600160a01b031660009081526006602052604090205490565b6100c06101b0366004610e48565b610412565b3480156101c157600080fd5b506100e26101d0366004610e80565b610565565b3480156101e157600080fd5b5061011c6101f0366004610e80565b61060f565b34801561020157600080fd5b506100c0610210366004610e04565b610824565b34801561022157600080fd5b506100c0610230366004610f31565b610938565b6007546001600160a01b031633146102685760405162461bcd60e51b815260040161025f90610f4a565b60405180910390fd5b816001600160a01b0381166102b35760405162461bcd60e51b81526020600482015260116024820152704e6f742076616c6964206164647265737360781b604482015260640161025f565b5060058054600181019091557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b039093166001600160a01b03199093168317905560009182526006602052604090912055565b6040516370a0823160e01b81526001600160a01b03838116600483015260009183918216906370a0823190602401602060405180830381865afa15801561035b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037f9190610f6d565b9150505b92915050565b6007546001600160a01b031633146103b35760405162461bcd60e51b815260040161025f90610f4a565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146103ff5760405162461bcd60e51b815260040161025f90610f4a565b6011805460ff1916911515919091179055565b600c5460ff16156104555760405162461bcd60e51b815260206004820152600d60248201526c4e6f207265656e7472616e637960981b604482015260640161025f565b600c805460ff1916600190811790915560115460ff1615151461047757600080fd5b6063811080156104875750600081115b61049057600080fd5b610499336109a3565b6104a257600080fd5b600d543414806104b35750600e5434145b806104bf5750600f5434145b806104cb575060105434145b6104d457600080fd5b60008281526004602090815260408083208490556003825280832034908190553384526001835281842055848352600290915290205460ff161561051757600080fd5b3360009081526001602052604090205461053057600080fd5b506000908152602081815260408083208054600160ff1991821681179092553385529252822091909155600c80549091169055565b600080601261057384610aa7565b11156105a7578260405160200161058a9190610f86565b604051602081830303815290604052805190602001209050610383565b60126105b284610aa7565b116103835760405162461bcd60e51b815260206004820152602760248201527f50617373776f7264206c656e677468206d757374206265203e203138206368616044820152663930b1ba32b91760c91b606482015260840161025f565b600c5460009060ff16156106555760405162461bcd60e51b815260206004820152600d60248201526c4e6f207265656e7472616e637960981b604482015260640161025f565b600c805460ff1916600117905561066b336109a3565b61067457600080fd5b6000826040516020016106879190610f86565b60408051601f198184030181529181528151602092830120600081815260049093529120549091506106b93382610ba1565b6106c257600080fd5b333b63ffffffff16156106d457600080fd5b600082815260036020526040902054806106ed57600080fd5b60008381526002602052604090205460ff161561070957600080fd5b60008381526020819052604090205460ff166107825760405162461bcd60e51b815260206004820152603260248201527f506c656173652070726f766964652074686520726967687420757365722070616044820152717373776f726420746f20776974686472617760701b606482015260840161025f565b600061078d82610c41565b604051909150600090339083908381818185875af1925050503d80600081146107d2576040519150601f19603f3d011682016040523d82523d6000602084013e6107d7565b606091505b5050600086815260208181526040808320805460ff19908116909155600290925290912080549091166001179055905061081033610c7f565b600c805460ff191690559695505050505050565b6007546001600160a01b0316331461084e5760405162461bcd60e51b815260040161025f90610f4a565b806001600160a01b0381166108995760405162461bcd60e51b81526020600482015260116024820152704e6f742076616c6964206164647265737360781b604482015260640161025f565b60005b60055481101561091c57826001600160a01b0316600582815481106108c3576108c3610fb5565b6000918252602090912001546001600160a01b03160361090a57600581815481106108f0576108f0610fb5565b600091825260209091200180546001600160a01b03191690555b8061091481610fe1565b91505061089c565b50506001600160a01b0316600090815260066020526040812055565b600a546040516340c10f1960e01b8152336004820152602481018390526001600160a01b039091169081906340c10f19906044015b600060405180830381600087803b15801561098757600080fd5b505af115801561099b573d6000803e3d6000fd5b505050505050565b60008080805b600554811015610a9e576000600582815481106109c8576109c8610fb5565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038881166004830152909116915081906370a0823190602401602060405180830381865afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190610f6d565b92506006600060058481548110610a5b57610a5b610fb5565b60009182526020808320909101546001600160a01b031683528201929092526040019020548310610a8b57600193505b5080610a9681610fe1565b9150506109a9565b50909392505050565b8051600090819081905b80821015610a9e576000858381518110610acd57610acd610fb5565b01602001516001600160f81b0319169050600160ff1b811015610afc57610af5600184610ffa565b9250610b8e565b600760fd1b6001600160f81b031982161015610b1d57610af5600284610ffa565b600f60fc1b6001600160f81b031982161015610b3e57610af5600384610ffa565b601f60fb1b6001600160f81b031982161015610b5f57610af5600484610ffa565b603f60fa1b6001600160f81b031982161015610b8057610af5600584610ffa565b610b8b600684610ffa565b92505b5082610b9981610fe1565b935050610ab1565b600a546040516370a0823160e01b81526001600160a01b038481166004830152600092839283929091169081906370a0823190602401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190610f6d565b9150610c2c85670de0b6b3a764000061100d565b8203610c3757600192505b5090949350505050565b6000806064600b5484610c54919061100d565b610c5e9190611024565b90506000610c6c8285611046565b9050610c7782610cb3565b509392505050565b600a5460405163d908746760e01b81526001600160a01b03838116600483015290911690819063d90874679060240161096d565b600080610cc1600284611024565b6008546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114610d13576040519150601f19603f3d011682016040523d82523d6000602084013e610d18565b606091505b50506009546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114610d6c576040519150601f19603f3d011682016040523d82523d6000602084013e610d71565b606091505b505090506000828015610d815750815b9695505050505050565b80356001600160a01b0381168114610da257600080fd5b919050565b60008060408385031215610dba57600080fd5b610dc383610d8b565b946020939093013593505050565b60008060408385031215610de457600080fd5b610ded83610d8b565b9150610dfb60208401610d8b565b90509250929050565b600060208284031215610e1657600080fd5b610e1f82610d8b565b9392505050565b600060208284031215610e3857600080fd5b81358015158114610e1f57600080fd5b60008060408385031215610e5b57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610e9257600080fd5b813567ffffffffffffffff80821115610eaa57600080fd5b818401915084601f830112610ebe57600080fd5b813581811115610ed057610ed0610e6a565b604051601f8201601f19908116603f01168101908382118183101715610ef857610ef8610e6a565b81604052828152876020848701011115610f1157600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208284031215610f4357600080fd5b5035919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b600060208284031215610f7f57600080fd5b5051919050565b6000825160005b81811015610fa75760208186018101518583015201610f8d565b506000920191825250919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201610ff357610ff3610fcb565b5060010190565b8082018082111561038357610383610fcb565b808202811582820484141761038357610383610fcb565b60008261104157634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561038357610383610fcb56fea26469706673582212208d3703733edf0f91747c96b2a7f97954fa2860235e5fff12170f2c199f1bddb764736f6c63430008130033

Deployed Bytecode Sourcemap

5150:17677:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19800:348;;;;;;;;;;-1:-1:-1;19800:348:0;;;;;:::i;:::-;;:::i;:::-;;20733:213;;;;;;;;;;-1:-1:-1;20733:213:0;;;;;:::i;:::-;;:::i;:::-;;;862:25:1;;;850:2;835:18;20733:213:0;;;;;;;;21680:211;;;;;;;;;;-1:-1:-1;21680:211:0;;;;;:::i;:::-;21818:27;21874:8;;;;;21680:211;;;;1254:14:1;;1247:22;1229:41;;1217:2;1202:18;21680:211:0;1089:187:1;21439:136:0;;;;;;;;;;-1:-1:-1;21439:136:0;;;;;:::i;:::-;;:::i;21087:235::-;;;;;;;;;;-1:-1:-1;21087:235:0;;;;;:::i;:::-;;:::i;22685:139::-;;;;;;;;;;-1:-1:-1;22685:139:0;;;;;:::i;:::-;-1:-1:-1;;;;;22793:23:0;22766:7;22793:23;;;:12;:23;;;;;;;22685:139;11950:2256;;;;;;:::i;:::-;;:::i;14214:1089::-;;;;;;;;;;-1:-1:-1;14214:1089:0;;;;;:::i;:::-;;:::i;8347:3591::-;;;;;;;;;;-1:-1:-1;8347:3591:0;;;;;:::i;:::-;;:::i;20156:490::-;;;;;;;;;;-1:-1:-1;20156:490:0;;;;;:::i;:::-;;:::i;22044:174::-;;;;;;;;;;-1:-1:-1;22044:174:0;;;;;:::i;:::-;;:::i;19800:348::-;7775:5;;-1:-1:-1;;;;;7775:5:0;7761:10;:19;7753:41;;;;-1:-1:-1;;;7753:41:0;;;;;;;:::i;:::-;;;;;;;;;19908:9;-1:-1:-1;;;;;7937:19:0;::::1;7929:49;;;::::0;-1:-1:-1;;;7929:49:0;;3777:2:1;7929:49:0::1;::::0;::::1;3759:21:1::0;3816:2;3796:18;;;3789:30;-1:-1:-1;;;3835:18:1;;;3828:47;3892:18;;7929:49:0::1;3575:341:1::0;7929:49:0::1;-1:-1:-1::0;19995:17:0::2;:33:::0;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;19995:33:0;;::::2;-1:-1:-1::0;;;;;;19995:33:0;;::::2;::::0;::::2;::::0;;-1:-1:-1;20094:23:0;;;:12:::2;19995:33;20094:23:::0;;;;;:46;19800:348::o;20733:213::-;20907:30;;-1:-1:-1;;;20907:30:0;;-1:-1:-1;;;;;4085:32:1;;;20907:30:0;;;4067:51:1;20830:7:0;;20876:12;;20907:15;;;;;4040:18:1;;20907:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20900:37;;;20733:213;;;;;:::o;21439:136::-;7775:5;;-1:-1:-1;;;;;7775:5:0;7761:10;:19;7753:41;;;;-1:-1:-1;;;7753:41:0;;;;;;;:::i;:::-;21529:16:::1;:38:::0;;-1:-1:-1;;;;;;21529:38:0::1;-1:-1:-1::0;;;;;21529:38:0;;;::::1;::::0;;;::::1;::::0;;21439:136::o;21087:235::-;7775:5;;-1:-1:-1;;;;;7775:5:0;7761:10;:19;7753:41;;;;-1:-1:-1;;;7753:41:0;;;;;;;:::i;:::-;21270:19:::1;:44:::0;;-1:-1:-1;;21270:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21087:235::o;11950:2256::-;8173:6;;;;8172:7;8164:33;;;;-1:-1:-1;;;8164:33:0;;4520:2:1;8164:33:0;;;4502:21:1;4559:2;4539:18;;;4532:30;-1:-1:-1;;;4578:18:1;;;4571:43;4631:18;;8164:33:0;4318:337:1;8164:33:0;8210:6;:13;;-1:-1:-1;;8210:13:0;8219:4;8210:13;;;;;;12196:19:::1;::::0;8210:13;12196:19:::1;:27;;;12187:37;;;::::0;::::1;;12395:2;12361:31;:36;:75;;;;;12435:1;12401:31;:35;12361:75;12352:85;;;::::0;::::1;;12544:28;12561:10;12544:16;:28::i;:::-;12536:37;;;::::0;::::1;;12698:13;;12685:9;:26;:56;;;;12728:13;;12715:9;:26;12685:56;:85;;;;12758:12;;12745:9;:25;12685:85;:114;;;;12787:12;;12774:9;:25;12685:114;12677:123;;;::::0;::::1;;12904:47;::::0;;;:18:::1;:47;::::0;;;;;;;:81;;;13119:10:::1;:39:::0;;;;;13161:9:::1;13119:51:::0;;;;13372:10:::1;13363:20:::0;;:8:::1;:20:::0;;;;;:32;13417:39;;;:10:::1;:39:::0;;;;;;::::1;;13416:40;13408:49;;;::::0;::::1;;13632:10;13646:1;13623:20:::0;;;:8:::1;:20;::::0;;;;;13615:33:::1;;;::::0;::::1;;-1:-1:-1::0;13988:6:0::1;:35:::0;;;::::1;::::0;;;;;;;:42;;14026:4:::1;-1:-1:-1::0;;13988:42:0;;::::1;::::0;::::1;::::0;;;14181:10:::1;14172:20:::0;;;;;;:24;;;;8246:6;:14;;;;;;;11950:2256::o;14214:1089::-;14282:7;14725:19;15041:2;15016:22;15023:14;15016:6;:22::i;:::-;:27;15012:253;;;15112:14;15095:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;15085:43;;;;;;15063:66;;15012:253;;;15207:2;15182:22;15189:14;15182:6;:22::i;:::-;:27;15174:79;;;;-1:-1:-1;;;15174:79:0;;5281:2:1;15174:79:0;;;5263:21:1;5320:2;5300:18;;;5293:30;5359:34;5339:18;;;5332:62;-1:-1:-1;;;5410:18:1;;;5403:37;5457:19;;15174:79:0;5079:403:1;8347:3591:0;8173:6;;8418:4;;8173:6;;8172:7;8164:33;;;;-1:-1:-1;;;8164:33:0;;4520:2:1;8164:33:0;;;4502:21:1;4559:2;4539:18;;;4532:30;-1:-1:-1;;;4578:18:1;;;4571:43;4631:18;;8164:33:0;4318:337:1;8164:33:0;8210:6;:13;;-1:-1:-1;;8210:13:0;8219:4;8210:13;;;8522:28:::1;8539:10;8522:16;:28::i;:::-;8514:37;;;::::0;::::1;;8910:19;8967:8;8950:26;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;8950:26:0;;::::1;::::0;;;;;;8940:37;;8950:26:::1;8940:37:::0;;::::1;::::0;9301:32:::1;9336:31:::0;;;:18:::1;:31:::0;;;;;;8940:37;;-1:-1:-1;9699:93:0::1;9755:10;9336:31:::0;9699:55:::1;:93::i;:::-;9691:102;;;::::0;::::1;;9916:10;21818:27:::0;21874:8;;;9895:33:::1;;;::::0;::::1;;10047:26;10076:23:::0;;;:10:::1;:23;::::0;;;;;10229:22;10220:32:::1;;;::::0;::::1;;10451:23;::::0;;;:10:::1;:23;::::0;;;;;::::1;;10450:24;10442:33;;;::::0;::::1;;10710:6;:19:::0;;;::::1;::::0;;;;;;;::::1;;10702:82;;;::::0;-1:-1:-1;;;10702:82:0;;5689:2:1;10702:82:0::1;::::0;::::1;5671:21:1::0;5728:2;5708:18;;;5701:30;5767:34;5747:18;;;5740:62;-1:-1:-1;;;5818:18:1;;;5811:48;5876:19;;10702:82:0::1;5487:414:1::0;10702:82:0::1;10912:25;10940:47;10968:18;10940:27;:47::i;:::-;11113:55;::::0;10912:75;;-1:-1:-1;11096:12:0::1;::::0;11121:10:::1;::::0;10912:75;;11096:12;11113:55;11096:12;11113:55;10912:75;11121:10;11113:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;11305:5:0::1;11283:19:::0;;;::::1;::::0;;;;;;;:27;;-1:-1:-1;;11283:27:0;;::::1;::::0;;;11637:10:::1;:23:::0;;;;;;:30;;;;::::1;11283:27:::0;11637:30:::1;::::0;;11095:73;-1:-1:-1;11799:47:0::1;11835:10;11799:35;:47::i;:::-;8246:6:::0;:14;;-1:-1:-1;;8246:14:0;;;11923:7;8347:3591;-1:-1:-1;;;;;;8347:3591:0:o;20156:490::-;7775:5;;-1:-1:-1;;;;;7775:5:0;7761:10;:19;7753:41;;;;-1:-1:-1;;;7753:41:0;;;;;;;:::i;:::-;20237:9;-1:-1:-1;;;;;7937:19:0;::::1;7929:49;;;::::0;-1:-1:-1;;;7929:49:0;;3777:2:1;7929:49:0::1;::::0;::::1;3759:21:1::0;3816:2;3796:18;;;3789:30;-1:-1:-1;;;3835:18:1;;;3828:47;3892:18;;7929:49:0::1;3575:341:1::0;7929:49:0::1;20318:6:::2;20313:188;20334:17;:24:::0;20330:28;::::2;20313:188;;;20416:9;-1:-1:-1::0;;;;;20392:33:0::2;:17;20410:1;20392:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;20392:20:0::2;:33:::0;20389:101:::2;;20454:17;20472:1;20454:20;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;20447:27:::0;;-1:-1:-1;;;;;;20447:27:0::2;::::0;;20389:101:::2;20360:3:::0;::::2;::::0;::::2;:::i;:::-;;;;20313:188;;;-1:-1:-1::0;;;;;;;20615:23:0::2;;::::0;;;:12:::2;:23;::::0;;;;20608:30;20156:490::o;22044:174::-;22135:16;;22163:47;;-1:-1:-1;;;22163:47:0;;22186:10;22163:47;;;6694:51:1;6761:18;;;6754:34;;;-1:-1:-1;;;;;22135:16:0;;;;;;22163:22;;6667:18:1;;22163:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22084:134;22044:174;:::o;17766:879::-;17837:4;;;;18196:412;18217:17;:24;18213:28;;18196:412;;;18273:12;18295:17;18313:1;18295:20;;;;;;;;:::i;:::-;;;;;;;;;;;18352:30;;-1:-1:-1;;;18352:30:0;;-1:-1:-1;;;;;4085:32:1;;;18352:30:0;;;4067:51:1;18295:20:0;;;;-1:-1:-1;18295:20:0;;18352:15;;4040:18:1;;18352:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18331:51;;18509:12;:34;18522:17;18540:1;18522:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;18522:20:0;18509:34;;;;;;;;;;;;;18487:56;;18484:113;;18577:4;18565:16;;18484:113;-1:-1:-1;18243:3:0;;;;:::i;:::-;;;;18196:412;;;-1:-1:-1;18627:9:0;;17766:879;-1:-1:-1;;;17766:879:0:o;17103:534::-;17250:15;;17159:7;;;;;;17276:333;17294:10;17290:1;:14;17276:333;;;17328:8;17345:1;17348;17339:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;17339:11:0;;-1:-1:-1;;;;17369:8:0;;17365:233;;;17381:6;17386:1;17381:6;;:::i;:::-;;;17365:233;;;-1:-1:-1;;;;;;;;;17413:8:0;;;17409:189;;;17425:6;17430:1;17425:6;;:::i;17409:189::-;-1:-1:-1;;;;;;;;;17457:8:0;;;17453:145;;;17469:6;17474:1;17469:6;;:::i;17453:145::-;-1:-1:-1;;;;;;;;;17501:8:0;;;17497:101;;;17513:6;17518:1;17513:6;;:::i;17497:101::-;-1:-1:-1;;;;;;;;;17546:8:0;;;17542:56;;;17558:6;17563:1;17558:6;;:::i;17542:56::-;17589:6;17594:1;17589:6;;:::i;:::-;;;17542:56;-1:-1:-1;17306:5:0;;;;:::i;:::-;;;;17276:333;;18842:846;19377:16;;19426:30;;-1:-1:-1;;;19426:30:0;;-1:-1:-1;;;;;4085:32:1;;;19426:30:0;;;4067:51:1;18994:4:0;;;;;;19377:16;;;;;;19426:15;;4040:18:1;;19426:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19405:51;-1:-1:-1;19556:46:0;:35;19594:8;19556:46;:::i;:::-;19533:18;:70;19530:121;;19635:4;19623:16;;19530:121;-1:-1:-1;19670:9:0;;18842:846;-1:-1:-1;;;;18842:846:0:o;15622:379::-;15706:7;15728:17;15783:3;15770:10;;15748:19;:32;;;;:::i;:::-;:38;;;;:::i;:::-;15728:58;-1:-1:-1;15797:23:0;15823:31;15728:58;15823:19;:31;:::i;:::-;15797:57;;15931:29;15950:9;15931:18;:29::i;:::-;-1:-1:-1;15978:15:0;15622:379;-1:-1:-1;;;15622:379:0:o;22357:236::-;22500:16;;22528:57;;-1:-1:-1;;;22528:57:0;;-1:-1:-1;;;;;4085:32:1;;;22528:57:0;;;4067:51:1;22500:16:0;;;;;;22528:29;;4040:18:1;;22528:57:0;3921:203:1;16235:608:0;16303:4;;16446:16;16461:1;16446:12;:16;:::i;:::-;16501:14;;:46;;16422:40;;-1:-1:-1;16484:12:0;;-1:-1:-1;;;;;16501:14:0;;;;16422:40;;16484:12;16501:46;16484:12;16501:46;16422:40;16501:14;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16577:15:0;;:47;;16483:64;;-1:-1:-1;16559:13:0;;-1:-1:-1;;;;;16577:15:0;;;;16606:13;;16559;16577:47;16559:13;16577:47;16606:13;16577:15;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16558:66;;;16710:17;16730:7;:19;;;;;16741:8;16730:19;16710:39;16235:608;-1:-1:-1;;;;;;16235:608:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;451:260::-;519:6;527;580:2;568:9;559:7;555:23;551:32;548:52;;;596:1;593;586:12;548:52;619:29;638:9;619:29;:::i;:::-;609:39;;667:38;701:2;690:9;686:18;667:38;:::i;:::-;657:48;;451:260;;;;;:::o;898:186::-;957:6;1010:2;998:9;989:7;985:23;981:32;978:52;;;1026:1;1023;1016:12;978:52;1049:29;1068:9;1049:29;:::i;:::-;1039:39;898:186;-1:-1:-1;;;898:186:1:o;1281:273::-;1337:6;1390:2;1378:9;1369:7;1365:23;1361:32;1358:52;;;1406:1;1403;1396:12;1358:52;1445:9;1432:23;1498:5;1491:13;1484:21;1477:5;1474:32;1464:60;;1520:1;1517;1510:12;1559:248;1627:6;1635;1688:2;1676:9;1667:7;1663:23;1659:32;1656:52;;;1704:1;1701;1694:12;1656:52;-1:-1:-1;;1727:23:1;;;1797:2;1782:18;;;1769:32;;-1:-1:-1;1559:248:1:o;1812:127::-;1873:10;1868:3;1864:20;1861:1;1854:31;1904:4;1901:1;1894:15;1928:4;1925:1;1918:15;1944:922;2013:6;2066:2;2054:9;2045:7;2041:23;2037:32;2034:52;;;2082:1;2079;2072:12;2034:52;2122:9;2109:23;2151:18;2192:2;2184:6;2181:14;2178:34;;;2208:1;2205;2198:12;2178:34;2246:6;2235:9;2231:22;2221:32;;2291:7;2284:4;2280:2;2276:13;2272:27;2262:55;;2313:1;2310;2303:12;2262:55;2349:2;2336:16;2371:2;2367;2364:10;2361:36;;;2377:18;;:::i;:::-;2452:2;2446:9;2420:2;2506:13;;-1:-1:-1;;2502:22:1;;;2526:2;2498:31;2494:40;2482:53;;;2550:18;;;2570:22;;;2547:46;2544:72;;;2596:18;;:::i;:::-;2636:10;2632:2;2625:22;2671:2;2663:6;2656:18;2711:7;2706:2;2701;2697;2693:11;2689:20;2686:33;2683:53;;;2732:1;2729;2722:12;2683:53;2788:2;2783;2779;2775:11;2770:2;2762:6;2758:15;2745:46;2833:1;2811:15;;;2828:2;2807:24;2800:35;;;;-1:-1:-1;2815:6:1;1944:922;-1:-1:-1;;;;;1944:922:1:o;3053:180::-;3112:6;3165:2;3153:9;3144:7;3140:23;3136:32;3133:52;;;3181:1;3178;3171:12;3133:52;-1:-1:-1;3204:23:1;;3053:180;-1:-1:-1;3053:180:1:o;3238:332::-;3440:2;3422:21;;;3479:1;3459:18;;;3452:29;-1:-1:-1;;;3512:2:1;3497:18;;3490:39;3561:2;3546:18;;3238:332::o;4129:184::-;4199:6;4252:2;4240:9;4231:7;4227:23;4223:32;4220:52;;;4268:1;4265;4258:12;4220:52;-1:-1:-1;4291:16:1;;4129:184;-1:-1:-1;4129:184:1:o;4660:414::-;4791:3;4829:6;4823:13;4854:1;4864:129;4878:6;4875:1;4872:13;4864:129;;;4976:4;4960:14;;;4956:25;;4950:32;4937:11;;;4930:53;4893:12;4864:129;;;-1:-1:-1;5048:1:1;5012:16;;5037:13;;;-1:-1:-1;5012:16:1;4660:414;-1:-1:-1;4660:414:1:o;6116:127::-;6177:10;6172:3;6168:20;6165:1;6158:31;6208:4;6205:1;6198:15;6232:4;6229:1;6222:15;6248:127;6309:10;6304:3;6300:20;6297:1;6290:31;6340:4;6337:1;6330:15;6364:4;6361:1;6354:15;6380:135;6419:3;6440:17;;;6437:43;;6460:18;;:::i;:::-;-1:-1:-1;6507:1:1;6496:13;;6380:135::o;6799:125::-;6864:9;;;6885:10;;;6882:36;;;6898:18;;:::i;6929:168::-;7002:9;;;7033;;7050:15;;;7044:22;;7030:37;7020:71;;7071:18;;:::i;7102:217::-;7142:1;7168;7158:132;;7212:10;7207:3;7203:20;7200:1;7193:31;7247:4;7244:1;7237:15;7275:4;7272:1;7265:15;7158:132;-1:-1:-1;7304:9:1;;7102:217::o;7324:128::-;7391:9;;;7412:11;;;7409:37;;;7426:18;;:::i

Swarm Source

ipfs://8d3703733edf0f91747c96b2a7f97954fa2860235e5fff12170f2c199f1bddb7

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

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