Contract 0xE61fDAF474Fac07063f2234Fb9e60C1163Cfa850 4

 

Contract Overview

CoinDefi: COIN Token
Balance:
0 Ether

EtherValue:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value
0x2f948a64f258701ba353ff11e70ec36910d83077eccff46c56d3ae1e89d0d9acTransfer(pending)2022-09-25 2:23:384 days 11 hrs ago0x2d8d143c03758f41e8f6a37e25c7fc33b6727439 IN CoinDefi: COIN Token0 Ether(Pending)(Pending)
0x8329fd5fa4e52e0b1eb02edaafda451a6ca5ca2c184c75bc4606348845d28815Transfer156329512022-09-28 16:12:1121 hrs 25 mins agoENS Name 1.tokenid.eth IN  CoinDefi: COIN Token0 Ether0.00101456 21.25273966
0xe66353754b5fbc9f5461a3ffc3b73823b078d63cc856d71aed5667e8c3f53d94Approve156161562022-09-26 7:48:113 days 5 hrs agoBIKI.com IN  CoinDefi: COIN Token0 Ether0.000276915.94642906
0xaa7f62c62ebfed54c1d75a70eca67cd01e0cb3630408cabdf59d5bc5bc916a4fApprove156151552022-09-26 4:27:113 days 9 hrs ago0xa3b9465dc7ae35f578ae6e23b36cb77d60af1a10 IN  CoinDefi: COIN Token0 Ether0.00027459 5.89671685
0x3579183af2a3da80752ce84db28178be270e9c75ee7b46bf526013cc15cb8a83Approve156085392022-09-25 6:16:474 days 7 hrs ago0x1ce1977c4381c6fa89365c62996fa7191562a28f IN  CoinDefi: COIN Token0 Ether0.00028011 6.0150748
0x3ec9554ae12a5f86bb41ef3178d2efe2135f517b78fae8ea5a0ca383be6f970fTransfer155993742022-09-23 23:36:355 days 14 hrs ago0xc19a3f5d8bb5f10718527e2296aeb2f5c8dc2974 IN  CoinDefi: COIN Token0 Ether0.00052885 17.24783334
0x2697405d90c7823da5c0b5400dda9a2c2852e3b22a3e002a2952051e6c366157Transfer155960252022-09-23 12:23:596 days 1 hr ago0x886497a1c17a850a5d614ab30bdc708f8a7fea40 IN  CoinDefi: COIN Token0 Ether0.00191491 40.09291458
0xbb1e0caff349667a2e7c1ddd06536b94d3dfcfc04330520ca3d53eee5e09f733Approve155917242022-09-22 21:59:356 days 15 hrs ago0xf9940c3d00176611c4c65302b0a692609dcf43fe IN  CoinDefi: COIN Token0 Ether0.00036817 7.90615086
0x45e47b3b40ac8492e6efb1daa748c18ce517aee7d6b43d8420699d1bc6ebd4e7Approve155808702022-09-21 9:27:238 days 4 hrs ago0x0e23b4cd9a468f340740d40e29eb28fb18b21367 IN  CoinDefi: COIN Token0 Ether0.000122554.19636219
0x2f4d8bc6ba9aa9f3bf90bb652dd47efbe423675224b0a06af06cd066bf8599acApprove155723192022-09-20 4:28:599 days 9 hrs ago0x6c72e4b88d4297aed454f068f4e5156b2493310a IN  CoinDefi: COIN Token0 Ether0.00034798 7.47260653
0x3c9279cb14b5a03f0d2b16f0e23f3dfac63611a11b26feef56d15f8de938f1e5Approve155722982022-09-20 4:24:479 days 9 hrs ago0xd6dbc8d8ed39d597a5167bfd7796b0769275cc8b IN  CoinDefi: COIN Token0 Ether0.00017566.01561725
0xb2299ed06672cce556232da6bd02672e7941ba07fdad1942d2b765b0abf174c5Approve155647992022-09-19 3:10:3510 days 10 hrs ago0x3c9581113ef9dc0f5dda6b245e95041b0efb3221 IN  CoinDefi: COIN Token0 Ether0.000280586.05961104
0x9e91aa2720c1b359141c4a22da295c3e9a1fe7dd59b926cbc024484e1e0ef71cTransfer155617652022-09-18 16:57:4710 days 20 hrs ago0xc331eccd224f1ef05f0db70f7b87073191b5045f IN  CoinDefi: COIN Token0 Ether0.00088911 18.61559854
0x1f5ce8e917ed8a4dea4a9f58c7887b9143b83d1c108924316f347222cc3f4614Approve155570922022-09-18 1:14:1111 days 12 hrs ago0x60a2ef7249920fb5146032396f79c76ee5329e3e IN  CoinDefi: COIN Token0 Ether0.00021899 4.70266331
0x3e0d6d1e44d8d85b4f9356ce4b50644041c79bd3e78b630538ce6051834f0a4dApprove155495742022-09-16 23:55:3512 days 13 hrs ago0xa0abe17a83ce8aa2e3365d43c2d181df4dc9b99b IN  CoinDefi: COIN Token0 Ether0.000113883.89963693
0x9ebb099d96a7d5e45767863e48dde230d06ada58cdb3843c2f604958b20a7067Transfer155353392022-09-14 22:14:0414 days 15 hrs ago0xd3531d3d1eb04bb4292ca9843ff3b488e763d8af IN  CoinDefi: COIN Token0 Ether0.00049744 10.41763215
0xf285e4d1a8fa1988c9a77cae92d2d3c0f84895e9df6b92c93f3c401cb65d0864Approve155099922022-09-10 17:15:4518 days 20 hrs ago0x3a2c7b157265325d889e45a1639c2bb4b9434eff IN  CoinDefi: COIN Token0 Ether0.00037108 7.96872064
0x9d3e5a26af8416a92160676505915b833d8cd17589fe30970e2af396025032d3Approve155084692022-09-10 11:05:2719 days 2 hrs ago0x2004e6c6091046514481133e752b0c58b9887fe3 IN  CoinDefi: COIN Token0 Ether0.000287296.2061906
0xf39f12bf3743a82f0bf89773e4c9eaeb01756d7e663b247522430235132f4907Approve154989682022-09-08 21:37:2420 days 16 hrs ago0xbdb0b7bac3f79ff0af8e17867987b85a071db1bb IN  CoinDefi: COIN Token0 Ether0.00114429 24.5724863
0x6175f69678a03f3abea6a891ddb9dbe79aecfee7e4dac1557456ee260761ab79Approve154977452022-09-08 16:54:5520 days 20 hrs ago0x6cfe4294f641fc4182471bc7d2aac24e4b805c34 IN  CoinDefi: COIN Token0 Ether0.0011453824.74266064
0xfdd0cb85ebfdce9a67aa815ae98ee4b14ed35dfdb0065ab04864b68d28b32214Transfer154976092022-09-08 16:21:5120 days 21 hrs ago0xad07743bfa3dadcd954fc0290fe9f9816bc3d22e IN  CoinDefi: COIN Token0 Ether0.00530876101
0x74c90a6574d092493c67782cff2ccc4290878a24323f9eb3bab2c200e5a16504Approve154884782022-09-07 5:14:3922 days 8 hrs ago0x7e6b09945e0756860bbfcbc7ac560a73b39576e8 IN  CoinDefi: COIN Token0 Ether0.00063904 13.72292145
0xabc6d15821cc0d6f57ce9f72cf2847e6c3b87f9d1e8f39c36fc186ed7801f0cfApprove154776702022-09-05 11:43:2324 days 1 hr ago0xf20eeb289ac4ce8bfe3fe225130a14d6a4374809 IN  CoinDefi: COIN Token0 Ether0.000183376.27914547
0xf2d381721e0869695beed51b2761efdfc5d573c009e0c42d747f5baab14d04c2Approve154739262022-09-04 21:16:0524 days 16 hrs ago0x18e368d3f9de886753381e8b74c29ce2e90b82cc IN  CoinDefi: COIN Token0 Ether0.00033084 7.10455785
0x42cc7c8a355d16770f16804576377b1b330b2ef841020e21c2908ddf71bcfc95Approve154654272022-09-03 12:39:2026 days 58 mins ago0x4f20eae89781b563d3688401fe80bc9d45b25472 IN  CoinDefi: COIN Token0 Ether0.00038927 8.35932532
[ Download CSV Export 

OVERVIEW

Coin is a cross-chain P2P decentralized wallet, exchange, and assistant powered by atomic swap and artificial intelligence technology.

View more zero value Internal Transactions in Advanced View mode
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
CoinToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-20
*/

pragma solidity ^0.4.24;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMathLib{
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }
  
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;
  address public coinvest;
  mapping (address => bool) public admins;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
    coinvest = msg.sender;
    admins[owner] = true;
    admins[coinvest] = true;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  modifier onlyCoinvest() {
      require(msg.sender == coinvest);
      _;
  }

  modifier onlyAdmin() {
      require(admins[msg.sender]);
      _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
  
  /**
   * @dev Changes the Coinvest wallet that will receive funds from investment contract.
   * @param _newCoinvest The address of the new wallet.
  **/
  function transferCoinvest(address _newCoinvest) 
    external
    onlyCoinvest
  {
    require(_newCoinvest != address(0));
    coinvest = _newCoinvest;
  }

  /**
   * @dev Used to add admins who are allowed to add funds to the investment contract.
   * @param _user The address of the admin to add or remove.
   * @param _status True to add the user, False to remove the user.
  **/
  function alterAdmin(address _user, bool _status)
    external
    onlyCoinvest
  {
    require(_user != address(0));
    require(_user != coinvest);
    admins[_user] = _status;
  }

}

/**
 * @dev Abstract contract for approveAndCall.
**/
contract ApproveAndCallFallBack {
    function receiveApproval(address from, uint256 tokens, address token, bytes data) public;
}

/**
 * @title Coin Utility Token
 * @dev ERC20 contract utilizing ERC865 structure (3esmit's implementation with alterations).
 * @dev to allow users to pay Ethereum fees in tokens.
 * @author Coin -- Robert M.C. Forster
**/
contract CoinToken is Ownable {
    using SafeMathLib for uint256;
    
    string public constant symbol = "COIN";
    string public constant name = "Coin Utility Token";
    
    uint8 public constant decimals = 18;
    uint256 private _totalSupply = 107142857 * (10 ** 18);
    
    // Function sigs to be used within contract for signature recovery.
    bytes4 internal constant transferSig = 0xa9059cbb;
    bytes4 internal constant approveSig = 0x095ea7b3;
    bytes4 internal constant increaseApprovalSig = 0xd73dd623;
    bytes4 internal constant decreaseApprovalSig = 0x66188463;
    bytes4 internal constant approveAndCallSig = 0xcae9ca51;
    bytes4 internal constant revokeHashSig = 0x70de43f1;

    // Balances for each account
    mapping(address => uint256) balances;

    // Owner of account approves the transfer of an amount to another account
    mapping(address => mapping (address => uint256)) allowed;
    
    // Mapping of past used hashes: true if already used.
    mapping(address => mapping (bytes32 => bool)) invalidHashes;

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed from, address indexed spender, uint tokens);
    event HashRedeemed(bytes32 indexed txHash, address indexed from);

    /**
     * @dev Set owner and beginning balance.
    **/
    constructor()
      public
    {
        balances[msg.sender] = _totalSupply;
    }

    /**
     * @dev approveAndCall reception used primarily to pay gas with other tokens.
    **/
    function receiveApproval(address _from, uint256 _amount, address _token, bytes _data) 
      public
    {
        require(msg.sender != address(this));
        require(address(this).delegatecall(_data));
        _from; _amount; _token;
    }

/** ******************************** ERC20 ********************************* **/

    /**
     * @dev Transfers coins from one address to another.
     * @param _to The recipient of the transfer amount.
     * @param _amount The amount of tokens to transfer.
    **/
    function transfer(address _to, uint256 _amount) 
      public
    returns (bool success)
    {
        require(_transfer(msg.sender, _to, _amount));
        return true;
    }
    
    /**
     * @dev An allowed address can transfer tokens from another's address.
     * @param _from The owner of the tokens to be transferred.
     * @param _to The address to which the tokens will be transferred.
     * @param _amount The amount of tokens to be transferred.
    **/
    function transferFrom(address _from, address _to, uint _amount)
      public
    returns (bool success)
    {
        require(balances[_from] >= _amount && allowed[_from][msg.sender] >= _amount);

        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_amount);
        require(_transfer(_from, _to, _amount));
        return true;
    }
    
    /**
     * @dev Approves a wallet to transfer tokens on one's behalf.
     * @param _spender The wallet approved to spend tokens.
     * @param _amount The amount of tokens approved to spend.
    **/
    function approve(address _spender, uint256 _amount) 
      public
    returns (bool success)
    {
        require(_approve(msg.sender, _spender, _amount));
        return true;
    }
    
    /**
     * @dev Increases the allowed amount for spender from msg.sender.
     * @param _spender The address to increase allowed amount for.
     * @param _amount The amount of tokens to increase allowed amount by.
    **/
    function increaseApproval(address _spender, uint256 _amount) 
      public
    returns (bool success)
    {
        require(_increaseApproval(msg.sender, _spender, _amount));
        return true;
    }
    
    /**
     * @dev Decreases the allowed amount for spender from msg.sender.
     * @param _spender The address to decrease allowed amount for.
     * @param _amount The amount of tokens to decrease allowed amount by.
    **/
    function decreaseApproval(address _spender, uint256 _amount) 
      public
    returns (bool success)
    {
        require(_decreaseApproval(msg.sender, _spender, _amount));
        return true;
    }
    
    /**
     * @dev Used to approve an address and call a function on it in the same transaction.
     * @dev _spender The address to be approved to spend COIN.
     * @dev _amount The amount of COIN to be approved to spend.
     * @dev _data The data to send to the called contract.
    **/
    function approveAndCall(address _spender, uint256 _amount, bytes _data) 
      public
    returns (bool success) 
    {
        require(_approve(msg.sender, _spender, _amount));
        ApproveAndCallFallBack(_spender).receiveApproval(msg.sender, _amount, address(this), _data);
        return true;
    }

/** ****************************** Internal ******************************** **/
    
    /**
     * @dev Internal transfer for all functions that transfer.
     * @param _from The address that is transferring coins.
     * @param _to The receiving address of the coins.
     * @param _amount The amount of coins being transferred.
    **/
    function _transfer(address _from, address _to, uint256 _amount)
      internal
    returns (bool success)
    {
        require (_to != address(0), "Invalid transfer recipient address.");
        require(balances[_from] >= _amount, "Sender does not have enough balance.");
        
        balances[_from] = balances[_from].sub(_amount);
        balances[_to] = balances[_to].add(_amount);
        
        emit Transfer(_from, _to, _amount);
        return true;
    }
    
    /**
     * @dev Internal approve for all functions that require an approve.
     * @param _owner The owner who is allowing spender to use their balance.
     * @param _spender The wallet approved to spend tokens.
     * @param _amount The amount of tokens approved to spend.
    **/
    function _approve(address _owner, address _spender, uint256 _amount) 
      internal
    returns (bool success)
    {
        allowed[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
        return true;
    }
    
    /**
     * @dev Increases the allowed by "_amount" for "_spender" from "owner"
     * @param _owner The address that tokens may be transferred from.
     * @param _spender The address that may transfer these tokens.
     * @param _amount The amount of tokens to transfer.
    **/
    function _increaseApproval(address _owner, address _spender, uint256 _amount)
      internal
    returns (bool success)
    {
        allowed[_owner][_spender] = allowed[_owner][_spender].add(_amount);
        emit Approval(_owner, _spender, allowed[_owner][_spender]);
        return true;
    }
    
    /**
     * @dev Decreases the allowed by "_amount" for "_spender" from "_owner"
     * @param _owner The owner of the tokens to decrease allowed for.
     * @param _spender The spender whose allowed will decrease.
     * @param _amount The amount of tokens to decrease allowed by.
    **/
    function _decreaseApproval(address _owner, address _spender, uint256 _amount)
      internal
    returns (bool success)
    {
        if (allowed[_owner][_spender] <= _amount) allowed[_owner][_spender] = 0;
        else allowed[_owner][_spender] = allowed[_owner][_spender].sub(_amount);
        
        emit Approval(_owner, _spender, allowed[_owner][_spender]);
        return true;
    }
    
/** ************************ Delegated Functions *************************** **/

    /**
     * @dev Called by delegate with a signed hash of the transaction data to allow a user
     * @dev to transfer tokens without paying gas in Ether (they pay in COIN instead).
     * @param _signature Signed hash of data for this transfer.
     * @param _to The address to transfer COIN to.
     * @param _value The amount of COIN to transfer.
     * @param _gasPrice Price (IN COIN) that will be paid per unit of gas by user to "delegate".
     * @param _nonce Nonce of the user's new transaction.
    **/
    function transferPreSigned(
        bytes _signature,
        address _to, 
        uint256 _value,
        uint256 _gasPrice, 
        uint256 _nonce) 
      public
    returns (bool) 
    {
        // Log starting gas left of transaction for later gas price calculations.
        uint256 gas = gasleft();
        
        // Recover signer address from signature; ensure address is valid.
        address from = recoverPreSigned(_signature, transferSig, _to, _value, "", _gasPrice, _nonce);
        require(from != address(0), "Invalid signature provided.");
        
        // Require the hash has not been used, declare it used.
        bytes32 txHash = getPreSignedHash(transferSig, _to, _value, "", _gasPrice, _nonce);
        require(!invalidHashes[from][txHash], "Transaction has already been executed.");
        invalidHashes[from][txHash] = true;

        // Internal transfer.
        require(_transfer(from, _to, _value));

        // If the delegate is charging, pay them for gas in COIN.
        if (_gasPrice > 0) {
            // 35000 because of base fee of 21000 and ~14000 for the fee transfer.
            gas = 35000 + gas.sub(gasleft());
            require(_transfer(from, tx.origin, _gasPrice.mul(gas)), "Gas cost could not be paid.");
        }
        
        emit HashRedeemed(txHash, from);
        return true;
    }
    
    /**
     * @dev Called by a delegate with signed hash to approve a transaction for user.
     * @dev All variables equivalent to transfer except _to:
     * @param _to The address that will be approved to transfer COIN from user's wallet.
    **/
    function approvePreSigned(
        bytes _signature,
        address _to, 
        uint256 _value,
        uint256 _gasPrice, 
        uint256 _nonce) 
      public
    returns (bool) 
    {
        uint256 gas = gasleft();
        address from = recoverPreSigned(_signature, approveSig, _to, _value, "", _gasPrice, _nonce);
        require(from != address(0), "Invalid signature provided.");

        bytes32 txHash = getPreSignedHash(approveSig, _to, _value, "", _gasPrice, _nonce);
        require(!invalidHashes[from][txHash], "Transaction has already been executed.");
        invalidHashes[from][txHash] = true;

        require(_approve(from, _to, _value));

        if (_gasPrice > 0) {
            gas = 35000 + gas.sub(gasleft());
            require(_transfer(from, tx.origin, _gasPrice.mul(gas)), "Gas cost could not be paid.");
        }

        emit HashRedeemed(txHash, from);
        return true;
    }
    
    /**
     * @dev Used to increase the amount allowed for "_to" to spend from "from"
     * @dev A bare approve allows potentially nasty race conditions when using a delegate.
    **/
    function increaseApprovalPreSigned(
        bytes _signature,
        address _to, 
        uint256 _value,
        uint256 _gasPrice, 
        uint256 _nonce)
      public
    returns (bool) 
    {
        uint256 gas = gasleft();
        address from = recoverPreSigned(_signature, increaseApprovalSig, _to, _value, "", _gasPrice, _nonce);
        require(from != address(0), "Invalid signature provided.");

        bytes32 txHash = getPreSignedHash(increaseApprovalSig, _to, _value, "", _gasPrice, _nonce);
        require(!invalidHashes[from][txHash], "Transaction has already been executed.");
        invalidHashes[from][txHash] = true;

        require(_increaseApproval(from, _to, _value));

        if (_gasPrice > 0) {
            gas = 35000 + gas.sub(gasleft());
            require(_transfer(from, tx.origin, _gasPrice.mul(gas)), "Gas cost could not be paid.");
        }
        
        emit HashRedeemed(txHash, from);
        return true;
    }
    
    /**
     * @dev Added for the same reason as increaseApproval. Decreases to 0 if "_value" is greater than allowed.
    **/
    function decreaseApprovalPreSigned(
        bytes _signature,
        address _to, 
        uint256 _value, 
        uint256 _gasPrice, 
        uint256 _nonce) 
      public
    returns (bool) 
    {
        uint256 gas = gasleft();
        address from = recoverPreSigned(_signature, decreaseApprovalSig, _to, _value, "", _gasPrice, _nonce);
        require(from != address(0), "Invalid signature provided.");

        bytes32 txHash = getPreSignedHash(decreaseApprovalSig, _to, _value, "", _gasPrice, _nonce);
        require(!invalidHashes[from][txHash], "Transaction has already been executed.");
        invalidHashes[from][txHash] = true;

        require(_decreaseApproval(from, _to, _value));

        if (_gasPrice > 0) {
            gas = 35000 + gas.sub(gasleft());
            require(_transfer(from, tx.origin, _gasPrice.mul(gas)), "Gas cost could not be paid.");
        }

        emit HashRedeemed(txHash, from);
        return true;
    }
    
    /**
     * @dev approveAndCallPreSigned allows a user to approve a contract and call a function on it
     * @dev in the same transaction. As with the other presigneds, a delegate calls this with signed data from user.
     * @dev This function is the big reason we're using gas price and calculating gas use.
     * @dev Using this with the investment contract can result in varying gas costs.
     * @param _extraData The data to send to the contract.
    **/
    function approveAndCallPreSigned(
        bytes _signature,
        address _to, 
        uint256 _value,
        bytes _extraData,
        uint256 _gasPrice,
        uint256 _nonce) 
      public
    returns (bool) 
    {
        uint256 gas = gasleft();
        address from = recoverPreSigned(_signature, approveAndCallSig, _to, _value, _extraData, _gasPrice, _nonce);
        require(from != address(0), "Invalid signature provided.");

        bytes32 txHash = getPreSignedHash(approveAndCallSig, _to, _value, _extraData, _gasPrice, _nonce);
        require(!invalidHashes[from][txHash], "Transaction has already been executed.");
        invalidHashes[from][txHash] = true;

        if (_value > 0) require(_approve(from, _to, _value));
        ApproveAndCallFallBack(_to).receiveApproval(from, _value, address(this), _extraData);

        if (_gasPrice > 0) {
            gas = 35000 + gas.sub(gasleft());
            require(_transfer(from, tx.origin, _gasPrice.mul(gas)), "Gas cost could not be paid.");
        }
        
        emit HashRedeemed(txHash, from);
        return true;
    }

/** *************************** Revoke PreSigned ************************** **/
    
    /**
     * @dev Revoke hash without going through a delegate.
     * @param _hashToRevoke The hash that you no longer want to be used.
    **/
    function revokeHash(bytes32 _hashToRevoke)
      public
    returns (bool)
    {
        invalidHashes[msg.sender][_hashToRevoke] = true;
        return true;
    }
    
    /**
     * @dev Revoke hash through a delegate.
     * @param _signature The signature allowing this revocation.
     * @param _hashToRevoke The hash that you would like revoked.
     * @param _gasPrice The amount of token wei to be paid for each uint of gas.
    **/
    function revokeHashPreSigned(
        bytes _signature,
        bytes32 _hashToRevoke,
        uint256 _gasPrice)
      public
    returns (bool)
    {
        uint256 gas = gasleft();
        address from = recoverRevokeHash(_signature, _hashToRevoke, _gasPrice);
        require(from != address(0), "Invalid signature provided.");
        
        bytes32 txHash = getRevokeHash(_hashToRevoke, _gasPrice);
        require(!invalidHashes[from][txHash], "Transaction has already been executed.");
        invalidHashes[from][txHash] = true;

        invalidHashes[from][_hashToRevoke] = true;
        
        if (_gasPrice > 0) {
            gas = 35000 + gas.sub(gasleft());
            require(_transfer(from, tx.origin, _gasPrice.mul(gas)), "Gas cost could not be paid.");
        }
        
        emit HashRedeemed(txHash, from);
        return true;
    }
    
    /**
     * @dev Get hash for a revocation.
     * @param _hashToRevoke The signature to be revoked.
     * @param _gasPrice The amount to be paid to delegate for sending this tx.
    **/
    function getRevokeHash(bytes32 _hashToRevoke, uint256 _gasPrice)
      public
      view
    returns (bytes32 txHash)
    {
        return keccak256(abi.encodePacked(address(this), revokeHashSig, _hashToRevoke, _gasPrice));
    }

    /**
     * @dev Recover the address from a revocation hash.
     * @param _hashToRevoke The hash to be revoked.
     * @param _signature The signature allowing this revocation.
     * @param _gasPrice The amount of token wei to be paid for each unit of gas.
    **/
    function recoverRevokeHash(bytes _signature, bytes32 _hashToRevoke, uint256 _gasPrice)
      public
      view
    returns (address from)
    {
        return ecrecoverFromSig(getSignHash(getRevokeHash(_hashToRevoke, _gasPrice)), _signature);
    }
    
/** ************************** PreSigned Constants ************************ **/

    /**
     * @dev Used in frontend and contract to get hashed data of any given pre-signed transaction.
     * @param _to The address to transfer COIN to.
     * @param _value The amount of COIN to be transferred.
     * @param _extraData Extra data of tx if needed. Transfers and approves will leave this null.
     * @param _function Function signature of the pre-signed function being used.
     * @param _gasPrice The agreed-upon amount of COIN to be paid per unit of gas.
     * @param _nonce The user's nonce of the new transaction.
    **/
    function getPreSignedHash(
        bytes4 _function,
        address _to, 
        uint256 _value,
        bytes _extraData,
        uint256 _gasPrice,
        uint256 _nonce)
      public
      view
    returns (bytes32 txHash) 
    {
        return keccak256(abi.encodePacked(address(this), _function, _to, _value, _extraData, _gasPrice, _nonce));
    }
    
    /**
     * @dev Recover an address from a signed pre-signed hash.
     * @param _sig The signed hash.
     * @param _function The function signature for function being called.
     * @param _to The address to transfer/approve/transferFrom/etc. tokens to.
     * @param _value The amont of tokens to transfer/approve/etc.
     * @param _extraData The extra data included in the transaction, if any.
     * @param _gasPrice The amount of token wei to be paid to the delegate for each unit of gas.
     * @param _nonce The user's nonce for this transaction.
    **/
    function recoverPreSigned(
        bytes _sig,
        bytes4 _function,
        address _to,
        uint256 _value,
        bytes _extraData,
        uint256 _gasPrice,
        uint256 _nonce) 
      public
      view
    returns (address recovered)
    {
        return ecrecoverFromSig(getSignHash(getPreSignedHash(_function, _to, _value, _extraData, _gasPrice, _nonce)), _sig);
    }
    
    /**
     * @dev Add signature prefix to hash for recovery à la ERC191.
     * @param _hash The hashed transaction to add signature prefix to.
    **/
    function getSignHash(bytes32 _hash)
      public
      pure
    returns (bytes32 signHash)
    {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash));
    }

    /**
     * @dev Helps to reduce stack depth problems for delegations. Thank you to Bokky for this!
     * @param hash The hash of signed data for the transaction.
     * @param sig Contains r, s, and v for recovery of address from the hash.
    **/
    function ecrecoverFromSig(bytes32 hash, bytes sig) 
      public 
      pure 
    returns (address recoveredAddress) 
    {
        bytes32 r;
        bytes32 s;
        uint8 v;
        if (sig.length != 65) return address(0);
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            // Here we are loading the last 32 bytes. We exploit the fact that 'mload' will pad with zeroes if we overread.
            // There is no 'mload8' to do this, but that would be nicer.
            v := byte(0, mload(add(sig, 96)))
        }
        // Albeit non-transactional signatures are not specified by the YP, one would expect it to match the YP range of [27, 28]
        // geth uses [0, 1] and some clients have followed. This might change, see https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27) v += 27;
        if (v != 27 && v != 28) return address(0);
        return ecrecover(hash, v, r, s);
    }

/** ****************************** Constants ******************************* **/
    
    /**
     * @dev Return total supply of token.
    **/
    function totalSupply() 
      external
      view 
     returns (uint256)
    {
        return _totalSupply;
    }

    /**
     * @dev Return balance of a certain address.
     * @param _owner The address whose balance we want to check.
    **/
    function balanceOf(address _owner)
      external
      view 
    returns (uint256) 
    {
        return balances[_owner];
    }
    
    /**
     * @dev Allowed amount for a user to spend of another's tokens.
     * @param _owner The owner of the tokens approved to spend.
     * @param _spender The address of the user allowed to spend the tokens.
    **/
    function allowance(address _owner, address _spender) 
      external
      view 
    returns (uint256) 
    {
        return allowed[_owner][_spender];
    }
    
/** ****************************** onlyOwner ******************************* **/
    
    /**
     * @dev Allow the owner to take ERC20 tokens off of this contract if they are accidentally sent.
    **/
    function tokenEscape(address _tokenContract)
      external
      onlyOwner
    {
        CoinToken lostToken = CoinToken(_tokenContract);
        
        uint256 stuckTokens = lostToken.balanceOf(address(this));
        lostToken.transfer(owner, stuckTokens);
    }
    
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"coinvest","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sig","type":"bytes"},{"name":"_function","type":"bytes4"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"recoverPreSigned","outputs":[{"name":"recovered","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_status","type":"bool"}],"name":"alterAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"transferPreSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"}],"name":"tokenEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_hashToRevoke","type":"bytes32"},{"name":"_gasPrice","type":"uint256"}],"name":"recoverRevokeHash","outputs":[{"name":"from","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"approvePreSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hashToRevoke","type":"bytes32"}],"name":"revokeHash","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"decreaseApprovalPreSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_hashToRevoke","type":"bytes32"},{"name":"_gasPrice","type":"uint256"}],"name":"revokeHashPreSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_token","type":"address"},{"name":"_data","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hashToRevoke","type":"bytes32"},{"name":"_gasPrice","type":"uint256"}],"name":"getRevokeHash","outputs":[{"name":"txHash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_function","type":"bytes4"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"getPreSignedHash","outputs":[{"name":"txHash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"increaseApprovalPreSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"getSignHash","outputs":[{"name":"signHash","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_signature","type":"bytes"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"},{"name":"_gasPrice","type":"uint256"},{"name":"_nonce","type":"uint256"}],"name":"approveAndCallPreSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"sig","type":"bytes"}],"name":"ecrecoverFromSig","outputs":[{"name":"recoveredAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCoinvest","type":"address"}],"name":"transferCoinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"txHash","type":"bytes32"},{"indexed":true,"name":"from","type":"address"}],"name":"HashRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040526a58a061ea91aa7f2584000060035534801561001f57600080fd5b5060008054600160a060020a0319908116339081178084556001805490931682178355600160a060020a039081168452600260209081526040808620805460ff1990811687179091558554909316865280862080549093169094179091556003549184526004905291205561258b806100996000396000f3006080604052600436106101875763ffffffff60e060020a60003504166306fdde03811461018c5780630958a9f314610216578063095ea7b31461024757806309ea63e31461027f57806310840303146103595780631296830d1461038157806318160ddd146103f457806323b872dd1461041b578063313ce567146104455780633f45440614610470578063429b62e514610491578063476e492f146104b2578063617b390b14610514578063661884631461058757806370a08231146105ab57806370de43f1146105cc5780638be52783146105e45780638da5cb5b146106575780638e421f161461066c5780638f4ffcb1146106ce57806395d89b411461073e578063a59b3d4614610753578063a9059cbb1461076e578063a9a0b49514610792578063adb8249e14610829578063b15aa5b71461089c578063c8d4b389146108b4578063cae9ca511461096a578063d4acaf6c146109d3578063d73dd62314610a31578063dd62ed3e14610a55578063dfb6c46814610a7c578063f2fde38b14610a9d575b600080fd5b34801561019857600080fd5b506101a1610abe565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101db5781810151838201526020016101c3565b50505050905090810190601f1680156102085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561022257600080fd5b5061022b610af5565b60408051600160a060020a039092168252519081900360200190f35b34801561025357600080fd5b5061026b600160a060020a0360043516602435610b04565b604080519115158252519081900360200190f35b34801561028b57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261022b94369492936024939284019190819084018382808284375050604080516020601f60608a01358b0180359182018390048302840183018552818452989b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff198b35169b600160a060020a03848d0135169b958601359a919950975060809094019550919350918201918190840183828082843750949750508435955050506020909201359150610b259050565b34801561036557600080fd5b5061037f600160a060020a03600435166024351515610b52565b005b34801561038d57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026b94369492936024939284019190819084018382808284375094975050508335600160a060020a0316945050506020820135916040810135915060600135610bc4565b34801561040057600080fd5b50610409610e08565b60408051918252519081900360200190f35b34801561042757600080fd5b5061026b600160a060020a0360043581169060243516604435610e0e565b34801561045157600080fd5b5061045a610edc565b6040805160ff9092168252519081900360200190f35b34801561047c57600080fd5b5061037f600160a060020a0360043516610ee1565b34801561049d57600080fd5b5061026b600160a060020a0360043516611030565b3480156104be57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261022b9436949293602493928401919081908401838280828437509497505084359550505060209092013591506110459050565b34801561052057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026b94369492936024939284019190819084018382808284375094975050508335600160a060020a0316945050506020820135916040810135915060600135611065565b34801561059357600080fd5b5061026b600160a060020a03600435166024356111c9565b3480156105b757600080fd5b50610409600160a060020a03600435166111d6565b3480156105d857600080fd5b5061026b6004356111f1565b3480156105f057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026b94369492936024939284019190819084018382808284375094975050508335600160a060020a031694505050602082013591604081013591506060013561121b565b34801561066357600080fd5b5061022b61137f565b34801561067857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026b94369492936024939284019190819084018382808284375094975050843595505050602090920135915061138e9050565b3480156106da57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261037f94600160a060020a0381358116956024803596604435909316953695608494920191819084018382808284375094975061158a9650505050505050565b34801561074a57600080fd5b506101a161161d565b34801561075f57600080fd5b50610409600435602435611654565b34801561077a57600080fd5b5061026b600160a060020a036004351660243561171b565b34801561079e57600080fd5b50604080516020601f606435600481810135928301849004840285018401909552818452610409947bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981351694600160a060020a0360248035919091169560443595369560849493019181908401838280828437509497505084359550505060209092013591506117289050565b34801561083557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026b94369492936024939284019190819084018382808284375094975050508335600160a060020a031694505050602082013591604081013591506060013561189f565b3480156108a857600080fd5b50610409600435611a03565b3480156108c057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261026b94369492936024939284019190819084018382808284375050604080516020888301358a018035601f8101839004830284018301909452838352979a8935600160a060020a03169a8a8301359a91999098506060909101965091945090810192508190840183828082843750949750508435955050506020909201359150611aad9050565b34801561097657600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261026b948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750611dff9650505050505050565b3480156109df57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261022b958335953695604494919390910191908190840183828082843750949750611f1b9650505050505050565b348015610a3d57600080fd5b5061026b600160a060020a0360043516602435611ff0565b348015610a6157600080fd5b50610409600160a060020a0360043581169060243516611ffd565b348015610a8857600080fd5b5061037f600160a060020a0360043516612028565b348015610aa957600080fd5b5061037f600160a060020a0360043516612083565b60408051808201909152601281527f436f696e205574696c69747920546f6b656e0000000000000000000000000000602082015281565b600154600160a060020a031681565b6000610b11338484612117565b1515610b1c57600080fd5b50600192915050565b6000610b46610b40610b3b898989898989611728565b611a03565b89611f1b565b98975050505050505050565b600154600160a060020a03163314610b6957600080fd5b600160a060020a0382161515610b7e57600080fd5b600154600160a060020a0383811691161415610b9957600080fd5b600160a060020a03919091166000908152600260205260409020805460ff1916911515919091179055565b6000806000805a9250610bf68963a9059cbb60e060020a028a8a60206040519081016040528060008152508b8b610b25565b9150600160a060020a0382161515610c46576040805160e560020a62461bcd02815260206004820152601b6024820152600080516020612540833981519152604482015290519081900360640190fd5b610c6e63a9059cbb60e060020a02898960206040519081016040528060008152508a8a611728565b600160a060020a038316600090815260066020908152604080832084845290915290205490915060ff1615610cef576040805160e560020a62461bcd02815260206004820152602660248201526000805160206125008339815191526044820152600080516020612520833981519152606482015290519081900360840190fd5b600160a060020a03821660009081526006602090815260408083208484529091529020805460ff19166001179055610d28828989612182565b1515610d3357600080fd5b6000861115610dc357610d4d5a849063ffffffff61235e16565b6188b8019250610d6d8232610d68898763ffffffff61237016565b612182565b1515610dc3576040805160e560020a62461bcd02815260206004820152601b60248201527f47617320636f737420636f756c64206e6f7420626520706169642e0000000000604482015290519081900360640190fd5b604051600160a060020a0383169082907ff4a65fdaee7ca2336b6b5ea720055552af3fd371f7ebe46b8c83fa89d8c733f890600090a350600198975050505050505050565b60035490565b600160a060020a0383166000908152600460205260408120548211801590610e595750600160a060020a03841660009081526005602090815260408083203384529091529020548211155b1515610e6457600080fd5b600160a060020a0384166000908152600560209081526040808320338452909152902054610e98908363ffffffff61235e16565b600160a060020a0385166000908152600560209081526040808320338452909152902055610ec7848484612182565b1515610ed257600080fd5b5060019392505050565b601281565b600080548190600160a060020a03163314610efb57600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051849350600160a060020a038416916370a082319160248083019260209291908290030181600087803b158015610f5f57600080fd5b505af1158015610f73573d6000803e3d6000fd5b505050506040513d6020811015610f8957600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b158015610fff57600080fd5b505af1158015611013573d6000803e3d6000fd5b505050506040513d602081101561102957600080fd5b5050505050565b60026020526000908152604090205460ff1681565b600061105d611057610b3b8585611654565b85611f1b565b949350505050565b6000806000805a92506110978963095ea7b360e060020a028a8a60206040519081016040528060008152508b8b610b25565b9150600160a060020a03821615156110e7576040805160e560020a62461bcd02815260206004820152601b6024820152600080516020612540833981519152604482015290519081900360640190fd5b61110f63095ea7b360e060020a02898960206040519081016040528060008152508a8a611728565b600160a060020a038316600090815260066020908152604080832084845290915290205490915060ff1615611190576040805160e560020a62461bcd02815260206004820152602660248201526000805160206125008339815191526044820152600080516020612520833981519152606482015290519081900360840190fd5b600160a060020a03821660009081526006602090815260408083208484529091529020805460ff19166001179055610d28828989612117565b6000610b1133848461239b565b600160a060020a031660009081526004602052604090205490565b33600090815260066020908152604080832093835292905220805460ff1916600190811790915590565b6000806000805a925061124d89636618846360e060020a028a8a60206040519081016040528060008152508b8b610b25565b9150600160a060020a038216151561129d576040805160e560020a62461bcd02815260206004820152601b6024820152600080516020612540833981519152604482015290519081900360640190fd5b6112c5636618846360e060020a02898960206040519081016040528060008152508a8a611728565b600160a060020a038316600090815260066020908152604080832084845290915290205490915060ff1615611346576040805160e560020a62461bcd02815260206004820152602660248201526000805160206125008339815191526044820152600080516020612520833981519152606482015290519081900360840190fd5b600160a060020a03821660009081526006602090815260408083208484529091529020805460ff19166001179055610d2882898961239b565b600054600160a060020a031681565b6000806000805a92506113a2878787611045565b9150600160a060020a03821615156113f2576040805160e560020a62461bcd02815260206004820152601b6024820152600080516020612540833981519152604482015290519081900360640190fd5b6113fc8686611654565b600160a060020a038316600090815260066020908152604080832084845290915290205490915060ff161561147d576040805160e560020a62461bcd02815260206004820152602660248201526000805160206125008339815191526044820152600080516020612520833981519152606482015290519081900360840190fd5b600160a060020a03821660009081526006602090815260408083208484529091528082208054600160ff1991821681179092558984529183208054909216179055851115611547576114d65a849063ffffffff61235e16565b6188b80192506114f18232610d68888763ffffffff61237016565b1515611547576040805160e560020a62461bcd02815260206004820152601b60248201527f47617320636f737420636f756c64206e6f7420626520706169642e0000000000604482015290519081900360640190fd5b604051600160a060020a0383169082907ff4a65fdaee7ca2336b6b5ea720055552af3fd371f7ebe46b8c83fa89d8c733f890600090a35060019695505050505050565b3330141561159757600080fd5b30600160a060020a03168160405180828051906020019080838360005b838110156115cc5781810151838201526020016115b4565b50505050905090810190601f1680156115f95780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af4915050151561161757600080fd5b50505050565b60408051808201909152600481527f434f494e00000000000000000000000000000000000000000000000000000000602082015281565b604080516c0100000000000000000000000030026020808301919091527f70de43f1000000000000000000000000000000000000000000000000000000006034830152603882018590526058808301859052835180840390910181526078909201928390528151600093918291908401908083835b602083106116e85780518252601f1990920191602091820191016116c9565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209695505050505050565b6000610b11338484612182565b6000308787878787876040516020018088600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040186600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140185815260200184805190602001908083835b602083106117fb5780518252601f1990920191602091820191016117dc565b51815160209384036101000a60001901801990921691161790529201948552508381019290925250604080518084038301815292810190819052825192975095508594508601925090508083835b602083106118685780518252601f199092019160209182019101611849565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209a9950505050505050505050565b6000806000805a92506118d18963d73dd62360e060020a028a8a60206040519081016040528060008152508b8b610b25565b9150600160a060020a0382161515611921576040805160e560020a62461bcd02815260206004820152601b6024820152600080516020612540833981519152604482015290519081900360640190fd5b61194963d73dd62360e060020a02898960206040519081016040528060008152508a8a611728565b600160a060020a038316600090815260066020908152604080832084845290915290205490915060ff16156119ca576040805160e560020a62461bcd02815260206004820152602660248201526000805160206125008339815191526044820152600080516020612520833981519152606482015290519081900360840190fd5b600160a060020a03821660009081526006602090815260408083208484529091529020805460ff19166001179055610d288289896124b8565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c909201928390528151600093918291908401908083835b60208310611a7b5780518252601f199092019160209182019101611a5c565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b6000806000805a9250611ae58a7fcae9ca51000000000000000000000000000000000000000000000000000000008b8b8b8b8b610b25565b9150600160a060020a0382161515611b35576040805160e560020a62461bcd02815260206004820152601b6024820152600080516020612540833981519152604482015290519081900360640190fd5b611b637fcae9ca51000000000000000000000000000000000000000000000000000000008a8a8a8a8a611728565b600160a060020a038316600090815260066020908152604080832084845290915290205490915060ff1615611be4576040805160e560020a62461bcd02815260206004820152602660248201526000805160206125008339815191526044820152600080516020612520833981519152606482015290519081900360840190fd5b600160a060020a03821660009081526006602090815260408083208484529091528120805460ff19166001179055881115611c2f57611c24828a8a612117565b1515611c2f57600080fd5b88600160a060020a0316638f4ffcb1838a308b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611cc7578181015183820152602001611caf565b50505050905090810190601f168015611cf45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015611d1657600080fd5b505af1158015611d2a573d6000803e3d6000fd5b505050506000861115611db957611d485a849063ffffffff61235e16565b6188b8019250611d638232610d68898763ffffffff61237016565b1515611db9576040805160e560020a62461bcd02815260206004820152601b60248201527f47617320636f737420636f756c64206e6f7420626520706169642e0000000000604482015290519081900360640190fd5b604051600160a060020a0383169082907ff4a65fdaee7ca2336b6b5ea720055552af3fd371f7ebe46b8c83fa89d8c733f890600090a35060019998505050505050505050565b6000611e0c338585612117565b1515611e1757600080fd5b6040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018690523060448401819052608060648501908152865160848601528651600160a060020a038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b83811015611eaa578181015183820152602001611e92565b50505050905090810190601f168015611ed75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015611ef957600080fd5b505af1158015611f0d573d6000803e3d6000fd5b506001979650505050505050565b60008060008084516041141515611f355760009350611fe7565b50505060208201516040830151606084015160001a601b60ff82161015611f5a57601b015b8060ff16601b14158015611f7257508060ff16601c14155b15611f805760009350611fe7565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a0808501949193601f19840193928390039091019190865af1158015611fda573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b6000610b113384846124b8565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205490565b600154600160a060020a0316331461203f57600080fd5b600160a060020a038116151561205457600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461209a57600080fd5b600160a060020a03811615156120af57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a03808416600081815260056020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b6000600160a060020a038316151561220a576040805160e560020a62461bcd02815260206004820152602360248201527f496e76616c6964207472616e7366657220726563697069656e7420616464726560448201527f73732e0000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03841660009081526004602052604090205482111561229f576040805160e560020a62461bcd028152602060048201526024808201527f53656e64657220646f6573206e6f74206861766520656e6f7567682062616c6160448201527f6e63652e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0384166000908152600460205260409020546122c8908363ffffffff61235e16565b600160a060020a0380861660009081526004602052604080822093909355908516815220546122fd908363ffffffff6124f016565b600160a060020a0380851660008181526004602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b60008282111561236a57fe5b50900390565b600082820283158061238c575082848281151561238957fe5b04145b151561239457fe5b9392505050565b600160a060020a03808416600090815260056020908152604080832093861683529290529081205482106123f657600160a060020a038085166000908152600560209081526040808320938716835292905290812055612453565b600160a060020a0380851660009081526005602090815260408083209387168352929052205461242c908363ffffffff61235e16565b600160a060020a038086166000908152600560209081526040808320938816835292905220555b600160a060020a0384811660008181526005602090815260408083209488168084529482529182902054825190815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35060019392505050565b600160a060020a03808416600090815260056020908152604080832093861683529290529081205461242c908363ffffffff6124f016565b60008282018381101561239457fe005472616e73616374696f6e2068617320616c7265616479206265656e2065786563757465642e0000000000000000000000000000000000000000000000000000496e76616c6964207369676e61747572652070726f76696465642e0000000000a165627a7a72305820c5f31889e3915aad670c448dac3aa2e66d2b27260024d48e62c2b7ab26b2697b0029

Deployed ByteCode Sourcemap

3352:22390:0:-;;;;;;;;;-1:-1:-1;;;3352:22390:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3476:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3476:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3476:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1078:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1078:23:0;;;;;;;;-1:-1:-1;;;;;1078:23:0;;;;;;;;;;;;;;6520:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6520:189:0;-1:-1:-1;;;;;6520:189:0;;;;;;;;;;;;;;;;;;;;;;;;;22261:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22261:401:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22261:401:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22261:401:0;;;;-1:-1:-1;;;;;22261:401:0;;;;;;;;;;;;;-1:-1:-1;22261:401:0;-1:-1:-1;22261:401:0;;;;;-1:-1:-1;22261:401:0;;-1:-1:-1;22261:401:0;;;;;;;;;;;;;;-1:-1:-1;22261:401:0;;-1:-1:-1;;22261:401:0;;;-1:-1:-1;;;22261:401:0;;;;;;-1:-1:-1;22261:401:0;;-1:-1:-1;22261:401:0;2732:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2732:188:0;-1:-1:-1;;;;;2732:188:0;;;;;;;;;;;11558:1381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11558:1381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11558:1381:0;;-1:-1:-1;;;11558:1381:0;;-1:-1:-1;;;;;11558:1381:0;;-1:-1:-1;;;11558:1381:0;;;;;;;;;;-1:-1:-1;11558:1381:0;;;;;24437:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24437:120:0;;;;;;;;;;;;;;;;;;;;5940:359;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5940:359:0;-1:-1:-1;;;;;5940:359:0;;;;;;;;;;;;3539:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3539:35:0;;;;;;;;;;;;;;;;;;;;;;;25458:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25458:275:0;-1:-1:-1;;;;;25458:275:0;;;;;1106:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1106:39:0;-1:-1:-1;;;;;1106:39:0;;;;;20398:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20398:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20398:254:0;;-1:-1:-1;;20398:254:0;;;-1:-1:-1;;;20398:254:0;;;;;;-1:-1:-1;20398:254:0;;-1:-1:-1;20398:254:0;13207:945;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13207:945:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13207:945:0;;-1:-1:-1;;;13207:945:0;;-1:-1:-1;;;;;13207:945:0;;-1:-1:-1;;;13207:945:0;;;;;;;;;;-1:-1:-1;13207:945:0;;;;;7404:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7404:207:0;-1:-1:-1;;;;;7404:207:0;;;;;;;24699:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24699:135:0;-1:-1:-1;;;;;24699:135:0;;;;;18324:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18324:170:0;;;;;15484:982;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15484:982:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15484:982:0;;-1:-1:-1;;;15484:982:0;;-1:-1:-1;;;;;15484:982:0;;-1:-1:-1;;;15484:982:0;;;;;;;;;;-1:-1:-1;15484:982:0;;;;;1053:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1053:20:0;;;;18784:887;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18784:887:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18784:887:0;;-1:-1:-1;;18784:887:0;;;-1:-1:-1;;;18784:887:0;;;;;;-1:-1:-1;18784:887:0;;-1:-1:-1;18784:887:0;4925:247;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4925:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4925:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4925:247:0;;-1:-1:-1;4925:247:0;;-1:-1:-1;;;;;;;4925:247:0;3431:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3431:38:0;;;;19879:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19879:235:0;;;;;;;5454:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5454:181:0;-1:-1:-1;;;;;5454:181:0;;;;;;;21305:367;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21305:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21305:367:0;;;;-1:-1:-1;;;;;21305:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21305:367:0;;-1:-1:-1;;21305:367:0;;;-1:-1:-1;;;21305:367:0;;;;;;-1:-1:-1;21305:367:0;;-1:-1:-1;21305:367:0;14354:988;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14354:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14354:988:0;;-1:-1:-1;;;14354:988:0;;-1:-1:-1;;;;;14354:988:0;;-1:-1:-1;;;14354:988:0;;;;;;;;;;-1:-1:-1;14354:988:0;;;;;22833:195;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22833:195:0;;;;;16951:1127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16951:1127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16951:1127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16951:1127:0;;;;;;;;;;;-1:-1:-1;16951:1127:0;;;;;-1:-1:-1;16951:1127:0;;-1:-1:-1;16951:1127:0;;;;-1:-1:-1;16951:1127:0;;;;;;;;;;-1:-1:-1;16951:1127:0;;-1:-1:-1;;16951:1127:0;;;-1:-1:-1;;;16951:1127:0;;;;;;-1:-1:-1;16951:1127:0;;-1:-1:-1;16951:1127:0;7921:312;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7921:312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7921:312:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7921:312:0;;-1:-1:-1;7921:312:0;;-1:-1:-1;;;;;;;7921:312:0;23294:986;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23294:986:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23294:986:0;;-1:-1:-1;23294:986:0;;-1:-1:-1;;;;;;;23294:986:0;6953:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6953:207:0;-1:-1:-1;;;;;6953:207:0;;;;;;;25075:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25075:163:0;-1:-1:-1;;;;;25075:163:0;;;;;;;;;;2332:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2332:162:0;-1:-1:-1;;;;;2332:162:0;;;;;1986:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1986:178:0;-1:-1:-1;;;;;1986:178:0;;;;;3476:50;;;;;;;;;;;;;;;;;;;:::o;1078:23::-;;;-1:-1:-1;;;;;1078:23:0;;:::o;6520:189::-;6601:12;6639:39;6648:10;6660:8;6670:7;6639:8;:39::i;:::-;6631:48;;;;;;;;-1:-1:-1;6697:4:0;6520:189;;;;:::o;22261:401::-;22504:17;22546:108;22563:84;22575:71;22592:9;22603:3;22608:6;22616:10;22628:9;22639:6;22575:16;:71::i;:::-;22563:11;:84::i;:::-;22649:4;22546:16;:108::i;:::-;22539:115;22261:401;-1:-1:-1;;;;;;;;22261:401:0:o;2732:188::-;1715:8;;-1:-1:-1;;;;;1715:8:0;1701:10;:22;1693:31;;;;;;-1:-1:-1;;;;;2831:19:0;;;;2823:28;;;;;;2875:8;;-1:-1:-1;;;;;2866:17:0;;;2875:8;;2866:17;;2858:26;;;;;;-1:-1:-1;;;;;2891:13:0;;;;;;;;:6;:13;;;;;:23;;-1:-1:-1;;2891:23:0;;;;;;;;;;2732:188::o;11558:1381::-;11744:4;11850:11;11970:12;12217:14;11864:9;11850:23;;11985:77;12002:10;3759;-1:-1:-1;;;12014:11:0;12027:3;12032:6;11985:77;;;;;;;;;;;;;12044:9;12055:6;11985:16;:77::i;:::-;11970:92;-1:-1:-1;;;;;;12081:18:0;;;;12073:58;;;;;-1:-1:-1;;;;;12073:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12073:58:0;;;;;;;;;;;;;;;12234:65;3759:10;-1:-1:-1;;;12251:11:0;12264:3;12269:6;12234:65;;;;;;;;;;;;;12281:9;12292:6;12234:16;:65::i;:::-;-1:-1:-1;;;;;12319:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;12217:82;;-1:-1:-1;12319:27:0;;12318:28;12310:79;;;;;-1:-1:-1;;;;;12310:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12310:79:0;;;;-1:-1:-1;;;;;;;;;;;12310:79:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;12400:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;:34;;-1:-1:-1;;12400:34:0;12430:4;12400:34;;;12486:28;12414:4;12502:3;12507:6;12486:9;:28::i;:::-;12478:37;;;;;;;;12611:1;12599:9;:13;12595:263;;;12727:18;12735:9;12727:3;;:18;:7;:18;:::i;:::-;12719:5;:26;;-1:-1:-1;12768:46:0;12778:4;12784:9;12795:18;:9;12719:26;12795:18;:13;:18;:::i;:::-;12768:9;:46::i;:::-;12760:86;;;;;;;-1:-1:-1;;;;;12760:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12883:26;;-1:-1:-1;;;;;12883:26:0;;;12896:6;;12883:26;;;;;-1:-1:-1;12927:4:0;;11558:1381;-1:-1:-1;;;;;;;;11558:1381:0:o;24437:120::-;24537:12;;24437:120;:::o;5940:359::-;-1:-1:-1;;;;;6070:15:0;;6032:12;6070:15;;;:8;:15;;;;;;:26;-1:-1:-1;6070:26:0;;;:67;;-1:-1:-1;;;;;;6100:14:0;;;;;;:7;:14;;;;;;;;6115:10;6100:26;;;;;;;;:37;-1:-1:-1;6100:37:0;6070:67;6062:76;;;;;;;;-1:-1:-1;;;;;6180:14:0;;;;;;:7;:14;;;;;;;;6195:10;6180:26;;;;;;;;:39;;6211:7;6180:39;:30;:39;:::i;:::-;-1:-1:-1;;;;;6151:14:0;;;;;;:7;:14;;;;;;;;6166:10;6151:26;;;;;;;:68;6238:30;6159:5;6255:3;6260:7;6238:9;:30::i;:::-;6230:39;;;;;;;;-1:-1:-1;6287:4:0;5940:359;;;;;:::o;3539:35::-;3572:2;3539:35;:::o;25458:275::-;25552:19;1634:5;;25552:19;;-1:-1:-1;;;;;1634:5:0;1620:10;:19;1612:28;;;;;;25642:34;;;;;;25670:4;25642:34;;;;;;25584:14;;-1:-1:-1;;;;;;25642:19:0;;;;;:34;;;;;;;;;;;;;;-1:-1:-1;25642:19:0;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;25642:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25642:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25642:34:0;25706:5;;;25687:38;;;;;;-1:-1:-1;;;;;25706:5:0;;;25687:38;;;;;;;;;;;;25642:34;;-1:-1:-1;25687:18:0;;;;;;:38;;;;;25642:34;;25687:38;;;;;;;;;;;:18;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;25687:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25687:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;25458:275:0:o;1106:39::-;;;;;;;;;;;;;;;:::o;20398:254::-;20525:12;20562:82;20579:52;20591:39;20605:13;20620:9;20591:13;:39::i;20579:52::-;20633:10;20562:16;:82::i;:::-;20555:89;20398:254;-1:-1:-1;;;;20398:254:0:o;13207:945::-;13392:4;13415:11;13449:12;13622:14;13429:9;13415:23;;13464:76;13481:10;3814;-1:-1:-1;;;13493:10:0;13505:3;13510:6;13464:76;;;;;;;;;;;;;13522:9;13533:6;13464:16;:76::i;:::-;13449:91;-1:-1:-1;;;;;;13559:18:0;;;;13551:58;;;;;-1:-1:-1;;;;;13551:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13551:58:0;;;;;;;;;;;;;;;13639:64;3814:10;-1:-1:-1;;;13656:10:0;13668:3;13673:6;13639:64;;;;;;;;;;;;;13685:9;13696:6;13639:16;:64::i;:::-;-1:-1:-1;;;;;13723:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;13622:81;;-1:-1:-1;13723:27:0;;13722:28;13714:79;;;;;-1:-1:-1;;;;;13714:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13714:79:0;;;;-1:-1:-1;;;;;;;;;;;13714:79:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;13804:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;:34;;-1:-1:-1;;13804:34:0;13834:4;13804:34;;;13859:27;13818:4;13874:3;13879:6;13859:8;:27::i;7404:207::-;7494:12;7532:48;7550:10;7562:8;7572:7;7532:17;:48::i;24699:135::-;-1:-1:-1;;;;;24810:16:0;24777:7;24810:16;;;:8;:16;;;;;;;24699:135::o;18324:170::-;18431:10;18395:4;18417:25;;;:13;:25;;;;;;;;:40;;;;;;;:47;;-1:-1:-1;;18417:47:0;18460:4;18417:47;;;;;;18460:4;18324:170::o;15484:982::-;15679:4;15702:11;15736:12;15918:14;15716:9;15702:23;;15751:85;15768:10;3942;-1:-1:-1;;;15780:19:0;15801:3;15806:6;15751:85;;;;;;;;;;;;;15818:9;15829:6;15751:16;:85::i;:::-;15736:100;-1:-1:-1;;;;;;15855:18:0;;;;15847:58;;;;;-1:-1:-1;;;;;15847:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15847:58:0;;;;;;;;;;;;;;;15935:73;3942:10;-1:-1:-1;;;15952:19:0;15973:3;15978:6;15935:73;;;;;;;;;;;;;15990:9;16001:6;15935:16;:73::i;:::-;-1:-1:-1;;;;;16028:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;15918:90;;-1:-1:-1;16028:27:0;;16027:28;16019:79;;;;;-1:-1:-1;;;;;16019:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16019:79:0;;;;-1:-1:-1;;;;;;;;;;;16019:79:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16109:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;:34;;-1:-1:-1;;16109:34:0;16139:4;16109:34;;;16164:36;16123:4;16188:3;16193:6;16164:17;:36::i;1053:20::-;;;-1:-1:-1;;;;;1053:20:0;;:::o;18784:887::-;18929:4;18951:11;18985:12;19145:14;18965:9;18951:23;;19000:55;19018:10;19030:13;19045:9;19000:17;:55::i;:::-;18985:70;-1:-1:-1;;;;;;19074:18:0;;;;19066:58;;;;;-1:-1:-1;;;;;19066:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19066:58:0;;;;;;;;;;;;;;;19162:39;19176:13;19191:9;19162:13;:39::i;:::-;-1:-1:-1;;;;;19221:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;19145:56;;-1:-1:-1;19221:27:0;;19220:28;19212:79;;;;;-1:-1:-1;;;;;19212:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19212:79:0;;;;-1:-1:-1;;;;;;;;;;;19212:79:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19302:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;:34;;19332:4;-1:-1:-1;;19302:34:0;;;;;;;;19349;;;;;;:41;;;;;;;;19415:13;;19411:179;;;19459:18;19467:9;19459:3;;:18;:7;:18;:::i;:::-;19451:5;:26;;-1:-1:-1;19500:46:0;19510:4;19516:9;19527:18;:9;19451:26;19527:18;:13;:18;:::i;19500:46::-;19492:86;;;;;;;-1:-1:-1;;;;;19492:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19615:26;;-1:-1:-1;;;;;19615:26:0;;;19628:6;;19615:26;;;;;-1:-1:-1;19659:4:0;;18784:887;-1:-1:-1;;;;;;18784:887:0:o;4925:247::-;5050:10;5072:4;5050:27;;5042:36;;;;;;5105:4;-1:-1:-1;;;;;5097:26:0;5124:5;5097:33;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5097:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5089:42;;;;;;;;4925:247;;;;:::o;3431:38::-;;;;;;;;;;;;;;;;;;;:::o;19879:235::-;20033:72;;;;20058:4;20033:72;;;;;;;;;20065:13;20033:72;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20033:72:0;;;;;;;;20023:83;;19984:14;;20033:72;;;20023:83;;;;;20033:72;20023:83;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;20023:83:0;;;;;;;;;;;;-1:-1:-1;;;;;;19879:235:0:o;5454:181::-;5531:12;5569:35;5579:10;5591:3;5596:7;5569:9;:35::i;21305:367::-;21527:14;21602:4;21609:9;21620:3;21625:6;21633:10;21645:9;21656:6;21577:86;;;;;;-1:-1:-1;;;;;21577:86:0;-1:-1:-1;;;;;21577:86:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21577:86:0;-1:-1:-1;;;;;21577:86:0;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21577:86:0;;;;;-1:-1:-1;21577:86:0;;;;;;;-1:-1:-1;21577:86:0;;;26:21:-1;;;22:32;;6:49;;21577:86:0;;;;;;;21567:97;;21577:86;;-1:-1:-1;21577:86:0;-1:-1:-1;21577:86:0;;-1:-1:-1;21567:97:0;;;-1:-1:-1;21567:97:0;-1:-1:-1;21567:97:0;21577:86;21567:97;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;21567:97:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;21305:367:0:o;14354:988::-;14547:4;14570:11;14604:12;14786:14;14584:9;14570:23;;14619:85;14636:10;3878;-1:-1:-1;;;14648:19:0;14669:3;14674:6;14619:85;;;;;;;;;;;;;14686:9;14697:6;14619:16;:85::i;:::-;14604:100;-1:-1:-1;;;;;;14723:18:0;;;;14715:58;;;;;-1:-1:-1;;;;;14715:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14715:58:0;;;;;;;;;;;;;;;14803:73;3878:10;-1:-1:-1;;;14820:19:0;14841:3;14846:6;14803:73;;;;;;;;;;;;;14858:9;14869:6;14803:16;:73::i;:::-;-1:-1:-1;;;;;14896:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;14786:90;;-1:-1:-1;14896:27:0;;14895:28;14887:79;;;;;-1:-1:-1;;;;;14887:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14887:79:0;;;;-1:-1:-1;;;;;;;;;;;14887:79:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14977:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;:34;;-1:-1:-1;;14977:34:0;15007:4;14977:34;;;15032:36;14991:4;15056:3;15061:6;15032:17;:36::i;22833:195::-;22960:59;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22960:59:0;;;;;;;;22950:70;;22909:16;;22960:59;;;22950:70;;;;;22960:59;22950:70;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;22950:70:0;;;;;;;;;;;;-1:-1:-1;;;;;22833:195:0:o;16951:1127::-;17169:4;17192:11;17226:12;17414:14;17206:9;17192:23;-1:-1:-1;17241:91:0;17258:10;17270:17;17289:3;17294:6;17302:10;17314:9;17325:6;17241:16;:91::i;:::-;17226:106;-1:-1:-1;;;;;;17351:18:0;;;;17343:58;;;;;-1:-1:-1;;;;;17343:58:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17343:58:0;;;;;;;;;;;;;;;17431:79;17448:17;17467:3;17472:6;17480:10;17492:9;17503:6;17431:16;:79::i;:::-;-1:-1:-1;;;;;17530:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;;17414:96;;-1:-1:-1;17530:27:0;;17529:28;17521:79;;;;;-1:-1:-1;;;;;17521:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17521:79:0;;;;-1:-1:-1;;;;;;;;;;;17521:79:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17611:19:0;;;;;;:13;:19;;;;;;;;:27;;;;;;;;:34;;-1:-1:-1;;17611:34:0;17641:4;17611:34;;;17662:10;;17658:52;;;17682:27;17691:4;17697:3;17702:6;17682:8;:27::i;:::-;17674:36;;;;;;;;17744:3;-1:-1:-1;;;;;17721:43:0;;17765:4;17771:6;17787:4;17794:10;17721:84;;;;;-1:-1:-1;;;17721:84:0;;;;;;;-1:-1:-1;;;;;17721:84:0;-1:-1:-1;;;;;17721:84:0;;;;;;;;;;;-1:-1:-1;;;;;17721:84:0;-1:-1:-1;;;;;17721:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17721:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17721:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17721:84:0;;;;17834:1;17822:9;:13;17818:179;;;17866:18;17874:9;17866:3;;:18;:7;:18;:::i;:::-;17858:5;:26;;-1:-1:-1;17907:46:0;17917:4;17923:9;17934:18;:9;17858:26;17934:18;:13;:18;:::i;17907:46::-;17899:86;;;;;;;-1:-1:-1;;;;;17899:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18022:26;;-1:-1:-1;;;;;18022:26:0;;;18035:6;;18022:26;;;;;-1:-1:-1;18066:4:0;;16951:1127;-1:-1:-1;;;;;;;;;16951:1127:0:o;7921:312::-;8022:12;8061:39;8070:10;8082:8;8092:7;8061:8;:39::i;:::-;8053:48;;;;;;;;8112:91;;;;;8161:10;8112:91;;;;;;;;;;;;8190:4;8112:91;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8112:48:0;;;;;8161:10;8173:7;;8190:4;8197:5;;8112:91;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8112:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8112:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;8221:4:0;;7921:312;-1:-1:-1;;;;;;;7921:312:0:o;23294:986::-;23388:24;23431:9;23451;23471:7;23493:3;:10;23507:2;23493:16;;23489:39;;;23526:1;23511:17;;;;23489:39;-1:-1:-1;;;23583:2:0;23574:12;;23568:19;23621:2;23612:12;;23606:19;23866:2;23857:12;;23851:19;23848:1;23843:28;24167:2;24163:6;;;;24159:19;;;24176:2;24171:7;24159:19;24193:1;:7;;24198:2;24193:7;;:18;;;;;24204:1;:7;;24209:2;24204:7;;24193:18;24189:41;;;24228:1;24213:17;;;;24189:41;24248:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24248:24:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24248:24:0;;;;;;;;24241:31;;23294:986;;;;;;;;:::o;6953:207::-;7043:12;7081:48;7099:10;7111:8;7121:7;7081:17;:48::i;25075:163::-;-1:-1:-1;;;;;25205:15:0;;;25172:7;25205:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;25075:163::o;2332:162::-;1715:8;;-1:-1:-1;;;;;1715:8:0;1701:10;:22;1693:31;;;;;;-1:-1:-1;;;;;2431:26:0;;;;2423:35;;;;;;2465:8;:23;;-1:-1:-1;;2465:23:0;-1:-1:-1;;;;;2465:23:0;;;;;;;;;;2332:162::o;1986:178::-;1634:5;;-1:-1:-1;;;;;1634:5:0;1620:10;:19;1612:28;;;;;;-1:-1:-1;;;;;2063:22:0;;;;2055:31;;;;;;2119:5;;;2098:37;;-1:-1:-1;;;;;2098:37:0;;;;2119:5;;;2098:37;;;2142:5;:16;;-1:-1:-1;;2142:16:0;-1:-1:-1;;;;;2142:16:0;;;;;;;;;;1986:178::o;9375:246::-;-1:-1:-1;;;;;9505:15:0;;;9475:12;9505:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;:35;;;9556;;;;;;;9475:12;;9505:25;:15;9556:35;;;;;;;;;;;-1:-1:-1;9609:4:0;9375:246;;;;;:::o;8589:481::-;8683:12;-1:-1:-1;;;;;8722:17:0;;;;8713:66;;;;;-1:-1:-1;;;;;8713:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8798:15:0;;;;;;:8;:15;;;;;;:26;-1:-1:-1;8798:26:0;8790:75;;;;;-1:-1:-1;;;;;8790:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8904:15:0;;;;;;:8;:15;;;;;;:28;;8924:7;8904:28;:19;:28;:::i;:::-;-1:-1:-1;;;;;8886:15:0;;;;;;;:8;:15;;;;;;:46;;;;8959:13;;;;;;;:26;;8977:7;8959:26;:17;:26;:::i;:::-;-1:-1:-1;;;;;8943:13:0;;;;;;;:8;:13;;;;;;;;;:42;;;;9011:29;;;;;;;8943:13;;9011:29;;;;;;;;;;;;;-1:-1:-1;9058:4:0;8589:481;;;;;:::o;575:113::-;633:7;656:6;;;;649:14;;;;-1:-1:-1;677:5:0;;;575:113::o;146:147::-;204:7;232:5;;;251:6;;;:20;;;270:1;265;261;:5;;;;;;;;:10;251:20;244:28;;;;;;286:1;146:147;-1:-1:-1;;;146:147:0:o;10537:400::-;-1:-1:-1;;;;;10679:15:0;;;10645:12;10679:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;:36;-1:-1:-1;10675:153:0;;-1:-1:-1;;;;;10717:15:0;;;10745:1;10717:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;:29;10675:153;;;-1:-1:-1;;;;;10790:15:0;;;;;;;:7;:15;;;;;;;;:25;;;;;;;;;;:38;;10820:7;10790:38;:29;:38;:::i;:::-;-1:-1:-1;;;;;10762:15:0;;;;;;;:7;:15;;;;;;;;:25;;;;;;;;;:66;10675:153;-1:-1:-1;;;;;10854:53:0;;;10881:15;;;;:7;:15;;;;;;;;10854:53;;;10881:25;;;;;;;;;;;10854:53;;;;;;;;;;;;;;;;;-1:-1:-1;10925:4:0;10537:400;;;;;:::o;9923:303::-;-1:-1:-1;;;;;10089:15:0;;;10031:12;10089:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;:38;;10119:7;10089:38;:29;:38;:::i;696:133::-;754:7;782:5;;;801:6;;;;794:14;;

Swarm Source

bzzr://c5f31889e3915aad670c448dac3aa2e66d2b27260024d48e62c2b7ab26b2697b
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.