ETH Price: $3,306.92 (-0.56%)
Gas: 10 Gwei

Contract

0x81f040Ec6A1574197Ae651025383170230f31c07
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer65280262018-10-16 21:19:542113 days ago1539724794IN
0x81f040Ec...230f31c07
0 ETH0.000069863
Transfer64962362018-10-11 17:21:522118 days ago1539278512IN
0x81f040Ec...230f31c07
0.011361 ETH0.000025261.1
Transfer53452152018-03-29 21:35:272314 days ago1522359327IN
0x81f040Ec...230f31c07
0.7 ETH0.00574175250
Transfer53452082018-03-29 21:33:282314 days ago1522359208IN
0x81f040Ec...230f31c07
0.7 ETH0.00344505150
Transfer53452062018-03-29 21:33:032314 days ago1522359183IN
0x81f040Ec...230f31c07
0.7 ETH0.00344505150
Transfer52748202018-03-18 2:37:332326 days ago1521340653IN
0x81f040Ec...230f31c07
0.0999 ETH0.000093154
Transfer52748152018-03-18 2:35:532326 days ago1521340553IN
0x81f040Ec...230f31c07
0.0999 ETH0.000093154
Transfer52393082018-03-12 1:08:092332 days ago1520816889IN
0x81f040Ec...230f31c07
0.29 ETH0.000024051
Transfer52353432018-03-11 9:19:232333 days ago1520759963IN
0x81f040Ec...230f31c07
0.04 ETH0.00291116121.021
Transfer52353432018-03-11 9:19:232333 days ago1520759963IN
0x81f040Ec...230f31c07
0.04 ETH0.000098624.1
Transfer52353412018-03-11 9:18:352333 days ago1520759915IN
0x81f040Ec...230f31c07
0.02 ETH0.000024051
Transfer52350202018-03-11 8:00:042333 days ago1520755204IN
0x81f040Ec...230f31c07
0.03 ETH0.000024051
Transfer52349152018-03-11 7:35:192333 days ago1520753719IN
0x81f040Ec...230f31c07
0.03 ETH0.000026461.1
Transfer52349132018-03-11 7:34:502333 days ago1520753690IN
0x81f040Ec...230f31c07
0.032 ETH0.000024051
Transfer52347982018-03-11 7:05:032333 days ago1520751903IN
0x81f040Ec...230f31c07
0.035 ETH0.000024051
Transfer52346852018-03-11 6:39:462333 days ago1520750386IN
0x81f040Ec...230f31c07
0.04 ETH0.000050512.1
Transfer52346842018-03-11 6:39:232333 days ago1520750363IN
0x81f040Ec...230f31c07
0.04 ETH0.000026461.1
Transfer52346832018-03-11 6:39:132333 days ago1520750353IN
0x81f040Ec...230f31c07
0.04 ETH0.000024051
Transfer52346452018-03-11 6:29:592333 days ago1520749799IN
0x81f040Ec...230f31c07
0.04 ETH0.000024051
Transfer52322552018-03-10 20:48:232333 days ago1520714903IN
0x81f040Ec...230f31c07
0.037 ETH0.000024051
Transfer51893212018-03-03 13:55:062341 days ago1520085306IN
0x81f040Ec...230f31c07
0.04 ETH0.000024051
Transfer51892192018-03-03 13:33:532341 days ago1520084033IN
0x81f040Ec...230f31c07
0.039 ETH0.000096224
Transfer51892182018-03-03 13:33:442341 days ago1520084024IN
0x81f040Ec...230f31c07
0.036 ETH0.000048112
Transfer51892172018-03-03 13:33:272341 days ago1520084007IN
0x81f040Ec...230f31c07
0.048 ETH0.000048112
Transfer51860542018-03-03 0:35:582341 days ago1520037358IN
0x81f040Ec...230f31c07
0.039 ETH0.000048112
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
51017262018-02-16 16:44:512355 days ago1518799491
0x81f040Ec...230f31c07
0.2514296 ETH
51010762018-02-16 14:07:052356 days ago1518790025
0x81f040Ec...230f31c07
0.2 ETH
51010612018-02-16 14:04:272356 days ago1518789867
0x81f040Ec...230f31c07
0.15 ETH
51010502018-02-16 14:02:332356 days ago1518789753
0x81f040Ec...230f31c07
0.046 ETH
51010462018-02-16 14:01:512356 days ago1518789711
0x81f040Ec...230f31c07
0.3 ETH
51010452018-02-16 14:01:282356 days ago1518789688
0x81f040Ec...230f31c07
0.07 ETH
51010452018-02-16 14:01:282356 days ago1518789688
0x81f040Ec...230f31c07
0.24 ETH
51010452018-02-16 14:01:282356 days ago1518789688
0x81f040Ec...230f31c07
0.0545 ETH
51010402018-02-16 14:00:392356 days ago1518789639
0x81f040Ec...230f31c07
0.4 ETH
51010392018-02-16 14:00:292356 days ago1518789629
0x81f040Ec...230f31c07
0.6 ETH
51010392018-02-16 14:00:292356 days ago1518789629
0x81f040Ec...230f31c07
0.11 ETH
51010382018-02-16 14:00:212356 days ago1518789621
0x81f040Ec...230f31c07
0.14 ETH
51010382018-02-16 14:00:212356 days ago1518789621
0x81f040Ec...230f31c07
0.3564838 ETH
51010382018-02-16 14:00:212356 days ago1518789621
0x81f040Ec...230f31c07
0.5 ETH
51010382018-02-16 14:00:212356 days ago1518789621
0x81f040Ec...230f31c07
0.6 ETH
51010382018-02-16 14:00:212356 days ago1518789621
0x81f040Ec...230f31c07
0.05 ETH
51010372018-02-16 13:59:492356 days ago1518789589
0x81f040Ec...230f31c07
0.1 ETH
51010362018-02-16 13:59:442356 days ago1518789584
0x81f040Ec...230f31c07
0.0265 ETH
51010362018-02-16 13:59:442356 days ago1518789584
0x81f040Ec...230f31c07
1.92 ETH
51010362018-02-16 13:59:442356 days ago1518789584
0x81f040Ec...230f31c07
1.60002364 ETH
51010362018-02-16 13:59:442356 days ago1518789584
0x81f040Ec...230f31c07
0.4 ETH
51010342018-02-16 13:58:502356 days ago1518789530
0x81f040Ec...230f31c07
0.18 ETH
51010342018-02-16 13:58:502356 days ago1518789530
0x81f040Ec...230f31c07
3 ETH
51010332018-02-16 13:58:332356 days ago1518789513
0x81f040Ec...230f31c07
0.05 ETH
51010322018-02-16 13:58:272356 days ago1518789507
0x81f040Ec...230f31c07
0.05 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Auction

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-14
*/

pragma solidity 0.4.19;

/// @title ERC223 interface
interface ERC223 {

    function totalSupply() public view returns (uint);
    function name() public view returns (string);
    function symbol() public view returns (string);
    function decimals() public view returns (uint8);
    function balanceOf(address _owner) public view returns (uint);
    function transfer(address _to, uint _value) public returns (bool);
    function transfer(address _to, uint _value, bytes _data) public returns (bool);

    event Transfer(address indexed _from, address indexed _to, uint indexed _value, bytes _data);
}

/// @title Interface for the contract that will work with ERC223 tokens.
interface ERC223ReceivingContract { 
    /**
     * @dev Standard ERC223 function that will handle incoming token transfers.
     *
     * @param _from  Token sender address.
     * @param _value Amount of tokens.
     * @param _data  Transaction data.
     */
    function tokenFallback(address _from, uint _value, bytes _data) public;
}

contract OraclizeI {
    address public cbAddress;
    function query(uint _timestamp, string _datasource, string _arg) payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) payable returns (bytes32 _id);
    function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) payable returns (bytes32 _id);
    function queryN(uint _timestamp, string _datasource, bytes _argN) payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string _datasource, bytes _argN, uint _gaslimit) payable returns (bytes32 _id);
    function getPrice(string _datasource) returns (uint _dsprice);
    function getPrice(string _datasource, uint gaslimit) returns (uint _dsprice);
    function useCoupon(string _coupon);
    function setProofType(byte _proofType);
    function setConfig(bytes32 _config);
    function setCustomGasPrice(uint _gasPrice);
    function randomDS_getSessionPubKeyHash() returns(bytes32);
}

contract OraclizeAddrResolverI {
    function getAddress() returns (address _addr);
}

contract usingOraclize {
    uint constant day = 60*60*24;
    uint constant week = 60*60*24*7;
    uint constant month = 60*60*24*30;
    byte constant proofType_NONE = 0x00;
    byte constant proofType_TLSNotary = 0x10;
    byte constant proofType_Android = 0x20;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_consensys = 161;

    OraclizeAddrResolverI OAR;

    OraclizeI oraclize;
    modifier oraclizeAPI {
        if((address(OAR)==0)||(getCodeSize(address(OAR))==0))
            oraclize_setNetwork(networkID_auto);

        if(address(oraclize) != OAR.getAddress())
            oraclize = OraclizeI(OAR.getAddress());

        _;
    }
    modifier coupon(string code){
        oraclize = OraclizeI(OAR.getAddress());
        oraclize.useCoupon(code);
        _;
    }

    function oraclize_setNetwork(uint8 networkID) internal returns(bool){
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet
            OAR = OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            oraclize_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet
            OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            oraclize_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet
            OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            oraclize_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet
            OAR = OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            oraclize_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge
            OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide
            OAR = OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity
            OAR = OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }

    function __callback(bytes32 myid, string result) {
        __callback(myid, result, new bytes(0));
    }
    function __callback(bytes32 myid, string result, bytes proof) {
    }

    function oraclize_useCoupon(string code) oraclizeAPI internal {
        oraclize.useCoupon(code);
    }

    function oraclize_getPrice(string datasource) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource);
    }

    function oraclize_getPrice(string datasource, uint gaslimit) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource, gaslimit);
    }

    function oraclize_query(string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(0, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(timestamp, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(timestamp, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(0, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(0, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(timestamp, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(timestamp, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(0, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_query(string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_query(string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_query(string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_query(string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_cbAddress() oraclizeAPI internal returns (address){
        return oraclize.cbAddress();
    }
    function oraclize_setProof(byte proofP) oraclizeAPI internal {
        return oraclize.setProofType(proofP);
    }
    function oraclize_setCustomGasPrice(uint gasPrice) oraclizeAPI internal {
        return oraclize.setCustomGasPrice(gasPrice);
    }
    function oraclize_setConfig(bytes32 config) oraclizeAPI internal {
        return oraclize.setConfig(config);
    }

    function oraclize_randomDS_getSessionPubKeyHash() oraclizeAPI internal returns (bytes32){
        return oraclize.randomDS_getSessionPubKeyHash();
    }

    function getCodeSize(address _addr) constant internal returns(uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function parseAddr(string _a) internal returns (address){
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i=2; i<2+2*20; i+=2){
            iaddr *= 256;
            b1 = uint160(tmp[i]);
            b2 = uint160(tmp[i+1]);
            if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87;
            else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55;
            else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48;
            if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
            else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55;
            else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48;
            iaddr += (b1*16+b2);
        }
        return address(iaddr);
    }

    function strCompare(string _a, string _b) internal returns (int) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        for (uint i = 0; i < minLength; i ++)
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        if (a.length < b.length)
            return -1;
        else if (a.length > b.length)
            return 1;
        else
            return 0;
    }

    function indexOf(string _haystack, string _needle) internal returns (int) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if(h.length < 1 || n.length < 1 || (n.length > h.length))
            return -1;
        else if(h.length > (2**128 -1))
            return -1;
        else
        {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i ++)
            {
                if (h[i] == n[0])
                {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex])
                    {
                        subindex++;
                    }
                    if(subindex == n.length)
                        return int(i);
                }
            }
            return -1;
        }
    }

    function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
        for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
        for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
        for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
        return string(babcde);
    }

    function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string _a, string _b, string _c) internal returns (string) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string _a, string _b) internal returns (string) {
        return strConcat(_a, _b, "", "", "");
    }

    // parseInt
    function parseInt(string _a) internal returns (uint) {
        return parseInt(_a, 0);
    }

    // parseInt(parseFloat*10^_b)
    function parseInt(string _a, uint _b) internal returns (uint) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i=0; i<bresult.length; i++){
            if ((bresult[i] >= 48)&&(bresult[i] <= 57)){
                if (decimals){
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(bresult[i]) - 48;
            } else if (bresult[i] == 46) decimals = true;
        }
        if (_b > 0) mint *= 10**_b;
        return mint;
    }

    function uint2str(uint i) internal returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint len;
        while (j != 0){
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }

    function stra2cbor(string[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }

    function ba2cbor(bytes[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }


    string oraclize_network_name;
    function oraclize_setNetworkName(string _network_name) internal {
        oraclize_network_name = _network_name;
    }

    function oraclize_getNetworkName() internal returns (string) {
        return oraclize_network_name;
    }

    function oraclize_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32){
        if ((_nbytes == 0)||(_nbytes > 32)) throw;
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(_nbytes);
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = oraclize_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp)))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes[3] memory args = [unonce, nbytes, sessionKeyHash];
        bytes32 queryId = oraclize_query(_delay, "random", args, _customGasLimit);
        oraclize_randomDS_setCommitment(queryId, sha3(bytes8(_delay), args[1], sha256(args[0]), args[2]));
        return queryId;
    }

    function oraclize_randomDS_setCommitment(bytes32 queryId, bytes32 commitment) internal {
        oraclize_randomDS_args[queryId] = commitment;
    }

    mapping(bytes32=>bytes32) oraclize_randomDS_args;
    mapping(bytes32=>bool) oraclize_randomDS_sessionKeysHashVerified;

    function verifySig(bytes32 tosignh, bytes dersig, bytes pubkey) internal returns (bool){
        bool sigok;
        address signer;

        bytes32 sigr;
        bytes32 sigs;

        bytes memory sigr_ = new bytes(32);
        uint offset = 4+(uint(dersig[3]) - 0x20);
        sigr_ = copyBytes(dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(dersig, offset+(uint(dersig[offset-1]) - 0x20), 32, sigs_, 0);

        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }


        (sigok, signer) = safer_ecrecover(tosignh, 27, sigr, sigs);
        if (address(sha3(pubkey)) == signer) return true;
        else {
            (sigok, signer) = safer_ecrecover(tosignh, 28, sigr, sigs);
            return (address(sha3(pubkey)) == signer);
        }
    }

    function oraclize_randomDS_proofVerify__sessionKeyValidity(bytes proof, uint sig2offset) internal returns (bool) {
        bool sigok;

        // Step 6: verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(proof[sig2offset+1])+2);
        copyBytes(proof, sig2offset, sig2.length, sig2, 0);

        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(proof, 3+1, 64, appkey1_pubkey, 0);

        bytes memory tosign2 = new bytes(1+65+32);
        tosign2[0] = 1; //role
        copyBytes(proof, sig2offset-65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1+65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);

        if (sigok == false) return false;


        // Step 7: verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";

        bytes memory tosign3 = new bytes(1+65);
        tosign3[0] = 0xFE;
        copyBytes(proof, 3, 65, tosign3, 1);

        bytes memory sig3 = new bytes(uint(proof[3+65+1])+2);
        copyBytes(proof, 3+65, sig3.length, sig3, 0);

        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);

        return sigok;
    }

    modifier oraclize_randomDS_proofVerify(bytes32 _queryId, string _result, bytes _proof) {
        // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) throw;

        bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName());
        if (proofVerified == false) throw;

        _;
    }

    function oraclize_randomDS_proofVerify__returnCode(bytes32 _queryId, string _result, bytes _proof) internal returns (uint8){
        // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) return 1;

        bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName());
        if (proofVerified == false) return 2;

        return 0;
    }

    function matchBytes32Prefix(bytes32 content, bytes prefix, uint n_random_bytes) internal returns (bool){
        bool match_ = true;
        
        for (uint256 i=0; i< n_random_bytes; i++) {
            if (content[i] != prefix[i]) match_ = false;
        }

        return match_;
    }

    function oraclize_randomDS_proofVerify__main(bytes proof, bytes32 queryId, bytes result, string context_name) internal returns (bool){

        // Step 2: the unique keyhash has to match with the sha256 of (context name + queryId)
        uint ledgerProofLength = 3+65+(uint(proof[3+65+1])+2)+32;
        bytes memory keyhash = new bytes(32);
        copyBytes(proof, ledgerProofLength, 32, keyhash, 0);
        if (!(sha3(keyhash) == sha3(sha256(context_name, queryId)))) return false;

        bytes memory sig1 = new bytes(uint(proof[ledgerProofLength+(32+8+1+32)+1])+2);
        copyBytes(proof, ledgerProofLength+(32+8+1+32), sig1.length, sig1, 0);

        // Step 3: we assume sig1 is valid (it will be verified during step 5) and we verify if 'result' is the prefix of sha256(sig1)
        if (!matchBytes32Prefix(sha256(sig1), result, uint(proof[ledgerProofLength+32+8]))) return false;

        // Step 4: commitment match verification, sha3(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8+1+32);
        copyBytes(proof, ledgerProofLength+32, 8+1+32, commitmentSlice1, 0);

        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength+32+(8+1+32)+sig1.length+65;
        copyBytes(proof, sig2offset-64, 64, sessionPubkey, 0);

        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (oraclize_randomDS_args[queryId] == sha3(commitmentSlice1, sessionPubkeyHash)){ //unonce, nbytes and sessionKeyHash match
            delete oraclize_randomDS_args[queryId];
        } else return false;


        // Step 5: validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32+8+1+32);
        copyBytes(proof, ledgerProofLength, 32+8+1+32, tosign1, 0);
        if (!verifySig(sha256(tosign1), sig1, sessionPubkey)) return false;

        // verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] == false){
            oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = oraclize_randomDS_proofVerify__sessionKeyValidity(proof, sig2offset);
        }

        return oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }


    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function copyBytes(bytes from, uint fromOffset, uint length, bytes to, uint toOffset) internal returns (bytes) {
        uint minLength = length + toOffset;

        if (to.length < minLength) {
            // Buffer too small
            throw; // Should be a better way?
        }

        // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint i = 32 + fromOffset;
        uint j = 32 + toOffset;

        while (i < (32 + fromOffset + length)) {
            assembly {
                let tmp := mload(add(from, i))
                mstore(add(to, j), tmp)
            }
            i += 32;
            j += 32;
        }

        return to;
    }

    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    // Duplicate Solidity's ecrecover, but catching the CALL return value
    function safer_ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal returns (bool, address) {
        // We do our own memory management here. Solidity uses memory offset
        // 0x40 to store the current end of memory. We write past it (as
        // writes are memory extensions), but don't update the offset so
        // Solidity will reuse it. The memory used here is only needed for
        // this context.

        // FIXME: inline assembly can't access return values
        bool ret;
        address addr;

        assembly {
            let size := mload(0x40)
            mstore(size, hash)
            mstore(add(size, 32), v)
            mstore(add(size, 64), r)
            mstore(add(size, 96), s)

            // NOTE: we can reuse the request memory because we deal with
            //       the return code
            ret := call(3000, 1, 0, size, 128, size, 32)
            addr := mload(size)
        }

        return (ret, addr);
    }

    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function ecrecovery(bytes32 hash, bytes sig) internal returns (bool, address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (sig.length != 65)
          return (false, 0);

        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        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)))

            // Alternative solution:
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            // v := and(mload(add(sig, 65)), 255)
        }

        // 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 (false, 0);

        return safer_ecrecover(hash, v, r, s);
    }

}
// </ORACLIZE_API>

/**
 * @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;


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


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

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

  /**
   * @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) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


/**
 * @title Dutch auction of DGTX tokens. Sale of 100 000 000 DGTX.
 * @author SmartDec
 */
contract Auction is Ownable, usingOraclize, ERC223ReceivingContract {
    
    address public token;
    address public beneficiary;

    uint public constant TOKEN_DECIMALS_MULTIPLIER = uint(10) ** 18;
    uint public constant TOTAL_TOKENS = 100000000 * TOKEN_DECIMALS_MULTIPLIER; // 100 000 000 DGTX
    uint public constant DOLLAR_DECIMALS_MULTIPLIER = 100;

    uint public constant START_PRICE_IN_CENTS = 25; 
    uint public constant MIN_PRICE_IN_CENTS = 1; 
    uint public constant TRANSACTION_MIN_IN_ETH = 0.01 ether; 
    uint public constant START_ETH_TO_CENTS = 83800; 

    uint public startTime;
    uint public endTime;

    uint public maxBidInCentsPerAddress;
    uint public ethToCents = START_ETH_TO_CENTS;
    
    uint public totalTokens = TOTAL_TOKENS;
    bool public tokensReceived = false;
    uint public totalCentsCollected = 0;
    address[] public participants;
    mapping (address => uint) public centsReceived; // Participants' bid in USD cents
    mapping (address => bool) public withdrawn; // Participants who received their tokens

    bool public updateEthToCentsRateCycleStarted = false;
    
    event NewOraclizeQuery(string description);
    event EthToCentsUpdated(uint _rate);
    event Bid(address indexed _from, uint256 _valueCents);
    event TokensWithdraw(address indexed _whom, uint256 _value);

    /**
     * @notice Constructor for contract. Sets token and beneficiary addresses.
     * @param _token token address - supposed to be DGTX address
     * @param _beneficiary recipient of received ethers
     */
    function Auction(address _token, address _beneficiary, uint _startTime, uint _maxBidInCentsPerAddress)
            public
            payable
            Ownable()
    {
        require(_token != address(0));
        require(_beneficiary != address(0));
        require(_startTime > now);
        require(_maxBidInCentsPerAddress > 0);
        token = _token;
        beneficiary = _beneficiary;
        startTime = _startTime;
        endTime = startTime + 30 days;
        maxBidInCentsPerAddress = _maxBidInCentsPerAddress;
    }

    /**
     * @notice Fallback function.
     * During the auction receives and remembers participants bids.
     * After the sale is finished, withdraws tokens to participants.
     * It is not allowed to bid from contract (e.g., multisig).
     */
    function () public payable {
        if (msg.sender == owner) {
            return;
        }
        require(now >= startTime);
        require(!isContract(msg.sender));

        if (!hasEnded()) {
            require(msg.value >= TRANSACTION_MIN_IN_ETH);
            bid(msg.sender, msg.value);
        } else {
            require(!withdrawn[msg.sender]);
            require(centsReceived[msg.sender] != 0);
            withdrawTokens(msg.sender);
            msg.sender.transfer(msg.value);
        }
    }

    /**
     * @notice Anyone can call this function to start update cycle.
     */
    function startEthToCentsRateUpdateCycle() public {
        require(!updateEthToCentsRateCycleStarted);
        updateEthToCentsRateCycleStarted = true;
        updateEthToCentsRate(0);
    }

    /**
     * @notice Function to receive ERC223 tokens (only from token, only once, only TOTAL_TOKENS).
     * @param _value number of tokens to receive
     */
    function tokenFallback(address, uint _value, bytes) public {
        require(msg.sender == token);
        require(!tokensReceived);
        require(_value == TOTAL_TOKENS);
        totalTokens = TOTAL_TOKENS;
        tokensReceived = true;
    }

    /**
     * @notice Get current price: dgtx to cents.
     * 25 cents in the beginning and linearly decreases by 1 cent every hour until it reaches 1 cent.
     * @return current token to cents price
     */
    function getPrice() public view returns (uint) {
        if (now < startTime) {
            return START_PRICE_IN_CENTS;
        }
        uint passedHours = (now - startTime) / 1 hours;
        return (passedHours >= 24) ? MIN_PRICE_IN_CENTS : (25 - passedHours);
    }

    /**
     * @notice Checks if auction has ended.
     * @return true if auction has ended
     */
    function hasEnded() public view returns (bool) {
        return now > endTime || areTokensSold();
    }

    /**
     * @notice Сhecks if sufficient funds have been received:
     * amount of USD cents received is more or equal to the current valuation of the tokens offered
     * (that is current auction token price multiplied by total amount of tokens offered).
     * @dev Sets final token price
     * @return true if all tokens are sold
     */
    function areTokensSold() public view returns (bool) {
        return totalCentsCollected >= getPrice() * totalTokens / TOKEN_DECIMALS_MULTIPLIER;
    }

    /**
     * @notice Function to receive transaction from oracle with new ETH rate.
     * @dev Calls updateEthToCentsRate in one hour (starts update cycle)
     * @param result string with new rate
     */
    function __callback(bytes32, string result) public {
        require(msg.sender == oraclize_cbAddress());
        uint newEthToCents = parseInt(result, 2); // convert string to cents
        if (newEthToCents > 0) {
            ethToCents = newEthToCents;
            EthToCentsUpdated(ethToCents);
        } 
        if (!hasEnded()) {
            updateEthToCentsRate(1 hours);
        }
    }

    /**
     * @notice Function to transfer tokens to participants in the range [_from, _to).
     * @param _from starting index in the range of participants to withdraw to
     * @param _to index after the last participant to withdraw to
     */
    function distributeTokensRange(uint _from, uint _to) public {
        require(hasEnded());
        require(_from < _to && _to <= participants.length);

        address recipient;
        for (uint i = _from; i < _to; ++i) {
            recipient = participants[i];
            if (!withdrawn[recipient]) {
                withdrawTokens(recipient);
            }
        }
    }

    /**
     * @notice Lets the owner withdraw extra tokens, which were not sold during the auction.
     * @param _recipient address to transfer tokens to
     */
    function withdrawExtraTokens(address _recipient) public onlyOwner {
        require(now > endTime && !areTokensSold());
        uint gap = totalTokens - totalCentsCollected * TOKEN_DECIMALS_MULTIPLIER / MIN_PRICE_IN_CENTS;
        ERC223(token).transfer(_recipient, gap);
    }

    /**
     * @notice Lets the owner withdraw ethers from contract.
     * @param _recipient address to transfer ethers to
     * @param _value Wei to withdraw
     */
    function withdraw(address _recipient, uint _value) public onlyOwner {
        require(_value != 0);
        require(_recipient != address(0));
        require(this.balance >= _value);
        _recipient.transfer(_value);
    }

    /**
     * @notice Lets the owner withdraw all ethers from contract.
     * @param _recipient address to transfer ethers to 
     */
    function withdrawAll(address _recipient) public onlyOwner {
        withdraw(_recipient, this.balance);
    }

    /**
     * @dev Function which records bids.
     * @param _bidder is the address that bids
     * @param _valueETH is value of THE bid in ether
     */
    function bid(address _bidder, uint _valueETH) internal {
        uint price = getPrice();
        uint bidInCents = _valueETH * ethToCents / 1 ether;

        uint centsToAccept = bidInCents;
        uint ethToAccept = _valueETH;

        // Refund any ether above address bid limit
        if (centsReceived[_bidder] + centsToAccept > maxBidInCentsPerAddress) {
            centsToAccept = maxBidInCentsPerAddress - centsReceived[_bidder];
            ethToAccept = centsToAccept * 1 ether / ethToCents;
        }

        // Refund bid part which more than total tokens cost
        if (totalCentsCollected + centsToAccept > price * totalTokens / TOKEN_DECIMALS_MULTIPLIER) {
            centsToAccept = price * totalTokens / TOKEN_DECIMALS_MULTIPLIER - totalCentsCollected;
            ethToAccept = centsToAccept * 1 ether / ethToCents;
        }

        require(centsToAccept > 0 && ethToAccept > 0);

        if (centsReceived[_bidder] == 0) {
            participants.push(_bidder);
        }

        centsReceived[_bidder] += centsToAccept;
        totalCentsCollected += centsToAccept;
        Bid(_bidder, centsToAccept);

        if (ethToAccept < _valueETH) {
            _bidder.transfer(_valueETH - ethToAccept);
        }
        beneficiary.transfer(ethToAccept);
    }

    /**
     * @dev Internal function to withdraw tokens by final price.
     * @param _recipient participant to withdraw
     */
    function withdrawTokens(address _recipient) internal {
        uint256 tokens = 0;
        if (totalCentsCollected < totalTokens * MIN_PRICE_IN_CENTS / TOKEN_DECIMALS_MULTIPLIER) {
            tokens = centsReceived[_recipient] * TOKEN_DECIMALS_MULTIPLIER / MIN_PRICE_IN_CENTS;
        } else {
            tokens = centsReceived[_recipient] * totalTokens / totalCentsCollected;
        }
        withdrawn[_recipient] = true;
        ERC223(token).transfer(_recipient, tokens);
        TokensWithdraw(_recipient, tokens);
    }

    /**
     * @dev Assemble the given address bytecode. If bytecode exists then the _addr is a contract.
     * @return true if _addr is contract
     */
    function isContract(address _addr) internal view returns (bool) {
        // retrieve the size of the code on target address, this needs assembly
        uint length;
        assembly { length := extcodesize(_addr) }
        return length > 0;
    }

    /**
     * @dev Internal function to make an oraclize query for rate update with given delay in seconds.
     * @param _delay Delay for query in seconds
     */
    function updateEthToCentsRate(uint _delay) private {
        NewOraclizeQuery("Update of ETH to USD cents price requested");
        oraclize_query(
            _delay,
            "URL",
            "json(https://api.etherscan.io/api?module=stats&action=ethprice&apikey=YourApiKeyToken).result.ethusd");
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"TOTAL_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_PRICE_IN_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"participants","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensReceived","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"START_ETH_TO_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"uint256"},{"name":"_to","type":"uint256"}],"name":"distributeTokensRange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethToCents","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"START_PRICE_IN_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"withdrawn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxBidInCentsPerAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCentsCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOLLAR_DECIMALS_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"withdrawExtraTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"centsReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"areTokensSold","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"startEthToCentsRateUpdateCycle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TRANSACTION_MIN_IN_ETH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"_value","type":"uint256"},{"name":"","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_DECIMALS_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"updateEthToCentsRateCycleStarted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_beneficiary","type":"address"},{"name":"_startTime","type":"uint256"},{"name":"_maxBidInCentsPerAddress","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"description","type":"string"}],"name":"NewOraclizeQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_rate","type":"uint256"}],"name":"EthToCentsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_valueCents","type":"uint256"}],"name":"Bid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_whom","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"TokensWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

606060405262014758600b556012600a0a6305f5e10002600c556000600d60006101000a81548160ff0219169083151502179055506000600e556000601260006101000a81548160ff02191690831515021790555060405160808062002e9183398101604052808051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561010857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561014457600080fd5b428211151561015257600080fd5b60008111151561016157600080fd5b83600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160088190555062278d006008540160098190555080600a8190555050505050612c7e80620002136000396000f3006060604052600436106101a1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630b7abf771461034957806317eba34d1461037257806327dc297e1461039b5780633197cbb61461040557806335c1d3491461042e57806338af3eed1461049157806338bbfa50146104e65780633bb0cc55146105935780634d794cfc146105c057806352a982d3146105e95780635d7e8c151461061557806367b7a4aa1461063e5780636ef610921461066757806371c9572b146106b857806378e97925146106e15780637e1c0c091461070a57806384fa2c97146107335780638857322d1461075c5780638da5cb5b146107855780639409962f146107da57806398d5fdca146108135780639988807d1461083c578063a44a00c314610889578063bb7d715b146108b6578063c0db4dd7146108cb578063c0ee0b8a146108f4578063ec6c18fc14610979578063ecb70fb7146109a2578063f2fde38b146109cf578063f3fef3a314610a08578063fa09e63014610a4a578063faaf192114610a83578063fc0c546a14610ab0575b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101fb57610347565b600854421015151561020c57600080fd5b61021533610b05565b15151561022157600080fd5b610229610b18565b151561025457662386f26fc10000341015151561024557600080fd5b61024f3334610b33565b610346565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156102ad57600080fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141515156102fc57600080fd5b61030533610e8a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050151561034557600080fd5b5b5b005b341561035457600080fd5b61035c6110ed565b6040518082815260200191505060405180910390f35b341561037d57600080fd5b6103856110fb565b6040518082815260200191505060405180910390f35b34156103a657600080fd5b61040360048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611100565b005b341561041057600080fd5b6104186111b9565b6040518082815260200191505060405180910390f35b341561043957600080fd5b61044f60048080359060200190919050506111bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049c57600080fd5b6104a46111fe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104f157600080fd5b61059160048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611224565b005b341561059e57600080fd5b6105a6611229565b604051808215151515815260200191505060405180910390f35b34156105cb57600080fd5b6105d361123c565b6040518082815260200191505060405180910390f35b34156105f457600080fd5b6106136004808035906020019091908035906020019091905050611243565b005b341561062057600080fd5b61062861132f565b6040518082815260200191505060405180910390f35b341561064957600080fd5b610651611335565b6040518082815260200191505060405180910390f35b341561067257600080fd5b61069e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061133a565b604051808215151515815260200191505060405180910390f35b34156106c357600080fd5b6106cb61135a565b6040518082815260200191505060405180910390f35b34156106ec57600080fd5b6106f4611360565b6040518082815260200191505060405180910390f35b341561071557600080fd5b61071d611366565b6040518082815260200191505060405180910390f35b341561073e57600080fd5b61074661136c565b6040518082815260200191505060405180910390f35b341561076757600080fd5b61076f611372565b6040518082815260200191505060405180910390f35b341561079057600080fd5b610798611377565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107e557600080fd5b610811600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061139c565b005b341561081e57600080fd5b610826611522565b6040518082815260200191505060405180910390f35b341561084757600080fd5b610873600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611568565b6040518082815260200191505060405180910390f35b341561089457600080fd5b61089c611580565b604051808215151515815260200191505060405180910390f35b34156108c157600080fd5b6108c96115a7565b005b34156108d657600080fd5b6108de6115ea565b6040518082815260200191505060405180910390f35b34156108ff57600080fd5b610977600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506115f5565b005b341561098457600080fd5b61098c6116b6565b6040518082815260200191505060405180910390f35b34156109ad57600080fd5b6109b5610b18565b604051808215151515815260200191505060405180910390f35b34156109da57600080fd5b610a06600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116be565b005b3415610a1357600080fd5b610a48600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611813565b005b3415610a5557600080fd5b610a81600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611924565b005b3415610a8e57600080fd5b610a966119a3565b604051808215151515815260200191505060405180910390f35b3415610abb57600080fd5b610ac36119b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600080823b905060008111915050919050565b6000600954421180610b2e5750610b2d611580565b5b905090565b600080600080610b41611522565b9350670de0b6b3a7640000600b548602811515610b5a57fe5b049250829150849050600a5482601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115610c0f57601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54039150600b54670de0b6b3a76400008302811515610c0b57fe5b0490505b6012600a0a600c548502811515610c2257fe5b0482600e54011115610c6357600e546012600a0a600c548602811515610c4457fe5b04039150600b54670de0b6b3a76400008302811515610c5f57fe5b0490505b600082118015610c735750600081115b1515610c7e57600080fd5b6000601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610d2a57600f8054806001018281610cda9190612b6d565b9160005260206000209001600088909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b81601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555081600e600082825401925050819055508573ffffffffffffffffffffffffffffffffffffffff167fe684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d2836040518082815260200191505060405180910390a284811015610e20578573ffffffffffffffffffffffffffffffffffffffff166108fc8287039081150290604051600060405180830381858888f193505050501515610e1f57600080fd5b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610e8257600080fd5b505050505050565b60008090506012600a0a6001600c5402811515610ea357fe5b04600e541015610f065760016012600a0a601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205402811515610efe57fe5b049050610f5a565b600e54600c54601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205402811515610f5657fe5b0490505b6001601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561107f57600080fd5b6102c65a03f1151561109057600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167f7948a9c59728231dcf4f97482d85cfd815d4250fc610df4a92ce0a712f0237f3826040518082815260200191505060405180910390a25050565b6012600a0a6305f5e1000281565b600181565b600061110a6119dc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561114357600080fd5b61114e826002611cf6565b9050600081111561119a5780600b819055507fe24670ebe4fdf59f35bf58f24e940ff40fa052b10a4956490bc80512feedab1b600b546040518082815260200191505060405180910390a15b6111a2610b18565b15156111b4576111b3610e10611ff0565b5b505050565b60095481565b600f818154811015156111ce57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b505050565b600d60009054906101000a900460ff1681565b6201475881565b60008061124e610b18565b151561125957600080fd5b828410801561126d5750600f805490508311155b151561127857600080fd5b8390505b8281101561132957600f8181548110151561129357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561131e5761131d82610e8a565b5b80600101905061127c565b50505050565b600b5481565b601981565b60116020528060005260406000206000915054906101000a900460ff1681565b600a5481565b60085481565b600c5481565b600e5481565b606481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113f957600080fd5b6009544211801561140f575061140d611580565b155b151561141a57600080fd5b60016012600a0a600e540281151561142e57fe5b04600c54039050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561150257600080fd5b6102c65a03f1151561151357600080fd5b50505060405180519050505050565b6000806008544210156115385760199150611564565b610e10600854420381151561154957fe5b049050601881101561155e5780601903611561565b60015b91505b5090565b60106020528060005260406000206000915090505481565b60006012600a0a600c54611592611522565b0281151561159c57fe5b04600e541015905090565b601260009054906101000a900460ff161515156115c357600080fd5b6001601260006101000a81548160ff0219169083151502179055506115e86000611ff0565b565b662386f26fc1000081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561165157600080fd5b600d60009054906101000a900460ff1615151561166d57600080fd5b6012600a0a6305f5e100028214151561168557600080fd5b6012600a0a6305f5e10002600c819055506001600d60006101000a81548160ff021916908315150217905550505050565b6012600a0a81565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561171957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561175557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561186e57600080fd5b6000811415151561187e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ba57600080fd5b803073ffffffffffffffffffffffffffffffffffffffff1631101515156118e057600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561192057600080fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197f57600080fd5b6119a0813073ffffffffffffffffffffffffffffffffffffffff1631611813565b50565b601260009054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a4e57506000611a4c600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661216a565b145b15611a5f57611a5d6000612175565b505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611aed57600080fd5b6102c65a03f11515611afe57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611c4857600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611bec57600080fd5b6102c65a03f11515611bfd57600080fd5b50505060405180519050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611cd657600080fd5b6102c65a03f11515611ce757600080fd5b50505060405180519050905090565b6000611d00612b99565b60008060008693506000925060009150600090505b8351811015611fd15760307f0100000000000000000000000000000000000000000000000000000000000000028482815181101515611d5057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611e68575060397f0100000000000000000000000000000000000000000000000000000000000000028482815181101515611df857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b15611f19578115611e8b576000861415611e8157611fd1565b8580600190039650505b600a8302925060308482815181101515611ea157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040383019250611fc4565b602e7f0100000000000000000000000000000000000000000000000000000000000000028482815181101515611f4b57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611fc357600191505b5b8080600101915050611d15565b6000861115611fe35785600a0a830292505b8294505050505092915050565b7f096835e36c2ccea88ff2b3aca87dfc938b977e52ea656873ff76a8dba50d4d3460405180806020018281038252602a8152602001807f557064617465206f662045544820746f205553442063656e747320707269636581526020017f207265717565737465640000000000000000000000000000000000000000000081525060400191505060405180910390a1612166816040805190810160405280600381526020017f55524c000000000000000000000000000000000000000000000000000000000081525060a060405190810160405280606481526020017f6a736f6e2868747470733a2f2f6170692e65746865727363616e2e696f2f617081526020017f693f6d6f64756c653d737461747326616374696f6e3d6574687072696365266181526020017f70696b65793d596f75724170694b6579546f6b656e292e726573756c742e657481526020017f687573640000000000000000000000000000000000000000000000000000000081525061260d565b5050565b6000813b9050919050565b600080612195731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed61216a565b111561223757731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061222e6040805190810160405280600b81526020017f6574685f6d61696e6e6574000000000000000000000000000000000000000000815250612b53565b60019050612608565b600061225673c03a2615d5efaf5f49f60b7bb6583eaec212fdf161216a565b11156122f85773c03a2615d5efaf5f49f60b7bb6583eaec212fdf1600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122ef6040805190810160405280600c81526020017f6574685f726f707374656e330000000000000000000000000000000000000000815250612b53565b60019050612608565b600061231773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e61216a565b11156123b95773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123b06040805190810160405280600981526020017f6574685f6b6f76616e0000000000000000000000000000000000000000000000815250612b53565b60019050612608565b60006123d873146500cfd35b22e4a392fe0adc06de1a1368ed4861216a565b111561247a5773146500cfd35b22e4a392fe0adc06de1a1368ed48600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506124716040805190810160405280600b81526020017f6574685f72696e6b656279000000000000000000000000000000000000000000815250612b53565b60019050612608565b6000612499736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47561216a565b11156124fd57736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612608565b600061251c7320e12a1f859b3feae5fb2a0a32c18f5a65555bbf61216a565b1115612580577320e12a1f859b3feae5fb2a0a32c18f5a65555bbf600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612608565b600061259f7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa61216a565b1115612603577351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612608565b600090505b919050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806126815750600061267f600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661216a565b145b15612692576126906000612175565b505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561272057600080fd5b6102c65a03f1151561273157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561287b57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561281f57600080fd5b6102c65a03f1151561283057600080fd5b50505060405180519050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663524f3889856000604051602001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561292e578082015181840152602081019050612913565b50505050905090810190601f16801561295b5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561297957600080fd5b6102c65a03f1151561298a57600080fd5b50505060405180519050905062030d403a02670de0b6b3a7640000018111156129b95760006001029150612b4b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663adf59f99828787876000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612a79578082015181840152602081019050612a5e565b50505050905090810190601f168015612aa65780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015612adf578082015181840152602081019050612ac4565b50505050905090810190601f168015612b0c5780820380516001836020036101000a031916815260200191505b50955050505050506020604051808303818588803b1515612b2c57600080fd5b6125ee5a03f11515612b3d57600080fd5b505050506040518051905091505b509392505050565b8060039080519060200190612b69929190612bad565b5050565b815481835581811511612b9457818360005260206000209182019101612b939190612c2d565b5b505050565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612bee57805160ff1916838001178555612c1c565b82800160010185558215612c1c579182015b82811115612c1b578251825591602001919060010190612c00565b5b509050612c299190612c2d565b5090565b612c4f91905b80821115612c4b576000816000905550600101612c33565b5090565b905600a165627a7a723058201348f98b9644cd1b15bf8f4623e8ea0b592ad9cb344a414f509dee61a9fd5a3500290000000000000000000000001c83501478f1320977047008496dacbd60bb15ef00000000000000000000000084a5b2e686d6c048a28927a138df5b7cc7d6e530000000000000000000000000000000000000000000000000000000005a85926000000000000000000000000000000000000000000000000000000000000f4240

Deployed Bytecode

0x6060604052600436106101a1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630b7abf771461034957806317eba34d1461037257806327dc297e1461039b5780633197cbb61461040557806335c1d3491461042e57806338af3eed1461049157806338bbfa50146104e65780633bb0cc55146105935780634d794cfc146105c057806352a982d3146105e95780635d7e8c151461061557806367b7a4aa1461063e5780636ef610921461066757806371c9572b146106b857806378e97925146106e15780637e1c0c091461070a57806384fa2c97146107335780638857322d1461075c5780638da5cb5b146107855780639409962f146107da57806398d5fdca146108135780639988807d1461083c578063a44a00c314610889578063bb7d715b146108b6578063c0db4dd7146108cb578063c0ee0b8a146108f4578063ec6c18fc14610979578063ecb70fb7146109a2578063f2fde38b146109cf578063f3fef3a314610a08578063fa09e63014610a4a578063faaf192114610a83578063fc0c546a14610ab0575b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101fb57610347565b600854421015151561020c57600080fd5b61021533610b05565b15151561022157600080fd5b610229610b18565b151561025457662386f26fc10000341015151561024557600080fd5b61024f3334610b33565b610346565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156102ad57600080fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141515156102fc57600080fd5b61030533610e8a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050151561034557600080fd5b5b5b005b341561035457600080fd5b61035c6110ed565b6040518082815260200191505060405180910390f35b341561037d57600080fd5b6103856110fb565b6040518082815260200191505060405180910390f35b34156103a657600080fd5b61040360048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611100565b005b341561041057600080fd5b6104186111b9565b6040518082815260200191505060405180910390f35b341561043957600080fd5b61044f60048080359060200190919050506111bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049c57600080fd5b6104a46111fe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104f157600080fd5b61059160048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611224565b005b341561059e57600080fd5b6105a6611229565b604051808215151515815260200191505060405180910390f35b34156105cb57600080fd5b6105d361123c565b6040518082815260200191505060405180910390f35b34156105f457600080fd5b6106136004808035906020019091908035906020019091905050611243565b005b341561062057600080fd5b61062861132f565b6040518082815260200191505060405180910390f35b341561064957600080fd5b610651611335565b6040518082815260200191505060405180910390f35b341561067257600080fd5b61069e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061133a565b604051808215151515815260200191505060405180910390f35b34156106c357600080fd5b6106cb61135a565b6040518082815260200191505060405180910390f35b34156106ec57600080fd5b6106f4611360565b6040518082815260200191505060405180910390f35b341561071557600080fd5b61071d611366565b6040518082815260200191505060405180910390f35b341561073e57600080fd5b61074661136c565b6040518082815260200191505060405180910390f35b341561076757600080fd5b61076f611372565b6040518082815260200191505060405180910390f35b341561079057600080fd5b610798611377565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107e557600080fd5b610811600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061139c565b005b341561081e57600080fd5b610826611522565b6040518082815260200191505060405180910390f35b341561084757600080fd5b610873600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611568565b6040518082815260200191505060405180910390f35b341561089457600080fd5b61089c611580565b604051808215151515815260200191505060405180910390f35b34156108c157600080fd5b6108c96115a7565b005b34156108d657600080fd5b6108de6115ea565b6040518082815260200191505060405180910390f35b34156108ff57600080fd5b610977600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506115f5565b005b341561098457600080fd5b61098c6116b6565b6040518082815260200191505060405180910390f35b34156109ad57600080fd5b6109b5610b18565b604051808215151515815260200191505060405180910390f35b34156109da57600080fd5b610a06600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116be565b005b3415610a1357600080fd5b610a48600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611813565b005b3415610a5557600080fd5b610a81600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611924565b005b3415610a8e57600080fd5b610a966119a3565b604051808215151515815260200191505060405180910390f35b3415610abb57600080fd5b610ac36119b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600080823b905060008111915050919050565b6000600954421180610b2e5750610b2d611580565b5b905090565b600080600080610b41611522565b9350670de0b6b3a7640000600b548602811515610b5a57fe5b049250829150849050600a5482601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115610c0f57601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54039150600b54670de0b6b3a76400008302811515610c0b57fe5b0490505b6012600a0a600c548502811515610c2257fe5b0482600e54011115610c6357600e546012600a0a600c548602811515610c4457fe5b04039150600b54670de0b6b3a76400008302811515610c5f57fe5b0490505b600082118015610c735750600081115b1515610c7e57600080fd5b6000601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610d2a57600f8054806001018281610cda9190612b6d565b9160005260206000209001600088909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b81601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555081600e600082825401925050819055508573ffffffffffffffffffffffffffffffffffffffff167fe684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d2836040518082815260200191505060405180910390a284811015610e20578573ffffffffffffffffffffffffffffffffffffffff166108fc8287039081150290604051600060405180830381858888f193505050501515610e1f57600080fd5b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610e8257600080fd5b505050505050565b60008090506012600a0a6001600c5402811515610ea357fe5b04600e541015610f065760016012600a0a601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205402811515610efe57fe5b049050610f5a565b600e54600c54601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205402811515610f5657fe5b0490505b6001601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561107f57600080fd5b6102c65a03f1151561109057600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167f7948a9c59728231dcf4f97482d85cfd815d4250fc610df4a92ce0a712f0237f3826040518082815260200191505060405180910390a25050565b6012600a0a6305f5e1000281565b600181565b600061110a6119dc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561114357600080fd5b61114e826002611cf6565b9050600081111561119a5780600b819055507fe24670ebe4fdf59f35bf58f24e940ff40fa052b10a4956490bc80512feedab1b600b546040518082815260200191505060405180910390a15b6111a2610b18565b15156111b4576111b3610e10611ff0565b5b505050565b60095481565b600f818154811015156111ce57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b505050565b600d60009054906101000a900460ff1681565b6201475881565b60008061124e610b18565b151561125957600080fd5b828410801561126d5750600f805490508311155b151561127857600080fd5b8390505b8281101561132957600f8181548110151561129357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561131e5761131d82610e8a565b5b80600101905061127c565b50505050565b600b5481565b601981565b60116020528060005260406000206000915054906101000a900460ff1681565b600a5481565b60085481565b600c5481565b600e5481565b606481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113f957600080fd5b6009544211801561140f575061140d611580565b155b151561141a57600080fd5b60016012600a0a600e540281151561142e57fe5b04600c54039050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561150257600080fd5b6102c65a03f1151561151357600080fd5b50505060405180519050505050565b6000806008544210156115385760199150611564565b610e10600854420381151561154957fe5b049050601881101561155e5780601903611561565b60015b91505b5090565b60106020528060005260406000206000915090505481565b60006012600a0a600c54611592611522565b0281151561159c57fe5b04600e541015905090565b601260009054906101000a900460ff161515156115c357600080fd5b6001601260006101000a81548160ff0219169083151502179055506115e86000611ff0565b565b662386f26fc1000081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561165157600080fd5b600d60009054906101000a900460ff1615151561166d57600080fd5b6012600a0a6305f5e100028214151561168557600080fd5b6012600a0a6305f5e10002600c819055506001600d60006101000a81548160ff021916908315150217905550505050565b6012600a0a81565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561171957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561175557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561186e57600080fd5b6000811415151561187e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ba57600080fd5b803073ffffffffffffffffffffffffffffffffffffffff1631101515156118e057600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561192057600080fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197f57600080fd5b6119a0813073ffffffffffffffffffffffffffffffffffffffff1631611813565b50565b601260009054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a4e57506000611a4c600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661216a565b145b15611a5f57611a5d6000612175565b505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611aed57600080fd5b6102c65a03f11515611afe57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611c4857600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611bec57600080fd5b6102c65a03f11515611bfd57600080fd5b50505060405180519050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611cd657600080fd5b6102c65a03f11515611ce757600080fd5b50505060405180519050905090565b6000611d00612b99565b60008060008693506000925060009150600090505b8351811015611fd15760307f0100000000000000000000000000000000000000000000000000000000000000028482815181101515611d5057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611e68575060397f0100000000000000000000000000000000000000000000000000000000000000028482815181101515611df857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b15611f19578115611e8b576000861415611e8157611fd1565b8580600190039650505b600a8302925060308482815181101515611ea157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040383019250611fc4565b602e7f0100000000000000000000000000000000000000000000000000000000000000028482815181101515611f4b57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611fc357600191505b5b8080600101915050611d15565b6000861115611fe35785600a0a830292505b8294505050505092915050565b7f096835e36c2ccea88ff2b3aca87dfc938b977e52ea656873ff76a8dba50d4d3460405180806020018281038252602a8152602001807f557064617465206f662045544820746f205553442063656e747320707269636581526020017f207265717565737465640000000000000000000000000000000000000000000081525060400191505060405180910390a1612166816040805190810160405280600381526020017f55524c000000000000000000000000000000000000000000000000000000000081525060a060405190810160405280606481526020017f6a736f6e2868747470733a2f2f6170692e65746865727363616e2e696f2f617081526020017f693f6d6f64756c653d737461747326616374696f6e3d6574687072696365266181526020017f70696b65793d596f75724170694b6579546f6b656e292e726573756c742e657481526020017f687573640000000000000000000000000000000000000000000000000000000081525061260d565b5050565b6000813b9050919050565b600080612195731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed61216a565b111561223757731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061222e6040805190810160405280600b81526020017f6574685f6d61696e6e6574000000000000000000000000000000000000000000815250612b53565b60019050612608565b600061225673c03a2615d5efaf5f49f60b7bb6583eaec212fdf161216a565b11156122f85773c03a2615d5efaf5f49f60b7bb6583eaec212fdf1600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122ef6040805190810160405280600c81526020017f6574685f726f707374656e330000000000000000000000000000000000000000815250612b53565b60019050612608565b600061231773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e61216a565b11156123b95773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123b06040805190810160405280600981526020017f6574685f6b6f76616e0000000000000000000000000000000000000000000000815250612b53565b60019050612608565b60006123d873146500cfd35b22e4a392fe0adc06de1a1368ed4861216a565b111561247a5773146500cfd35b22e4a392fe0adc06de1a1368ed48600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506124716040805190810160405280600b81526020017f6574685f72696e6b656279000000000000000000000000000000000000000000815250612b53565b60019050612608565b6000612499736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47561216a565b11156124fd57736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612608565b600061251c7320e12a1f859b3feae5fb2a0a32c18f5a65555bbf61216a565b1115612580577320e12a1f859b3feae5fb2a0a32c18f5a65555bbf600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612608565b600061259f7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa61216a565b1115612603577351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612608565b600090505b919050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806126815750600061267f600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661216a565b145b15612692576126906000612175565b505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561272057600080fd5b6102c65a03f1151561273157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561287b57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561281f57600080fd5b6102c65a03f1151561283057600080fd5b50505060405180519050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663524f3889856000604051602001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561292e578082015181840152602081019050612913565b50505050905090810190601f16801561295b5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561297957600080fd5b6102c65a03f1151561298a57600080fd5b50505060405180519050905062030d403a02670de0b6b3a7640000018111156129b95760006001029150612b4b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663adf59f99828787876000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612a79578082015181840152602081019050612a5e565b50505050905090810190601f168015612aa65780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015612adf578082015181840152602081019050612ac4565b50505050905090810190601f168015612b0c5780820380516001836020036101000a031916815260200191505b50955050505050506020604051808303818588803b1515612b2c57600080fd5b6125ee5a03f11515612b3d57600080fd5b505050506040518051905091505b509392505050565b8060039080519060200190612b69929190612bad565b5050565b815481835581811511612b9457818360005260206000209182019101612b939190612c2d565b5b505050565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612bee57805160ff1916838001178555612c1c565b82800160010185558215612c1c579182015b82811115612c1b578251825591602001919060010190612c00565b5b509050612c299190612c2d565b5090565b612c4f91905b80821115612c4b576000816000905550600101612c33565b5090565b905600a165627a7a723058201348f98b9644cd1b15bf8f4623e8ea0b592ad9cb344a414f509dee61a9fd5a350029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000001c83501478f1320977047008496dacbd60bb15ef00000000000000000000000084a5b2e686d6c048a28927a138df5b7cc7d6e530000000000000000000000000000000000000000000000000000000005a85926000000000000000000000000000000000000000000000000000000000000f4240

-----Decoded View---------------
Arg [0] : _token (address): 0x1C83501478f1320977047008496DACBD60Bb15ef
Arg [1] : _beneficiary (address): 0x84a5B2E686D6C048a28927a138Df5b7Cc7D6E530
Arg [2] : _startTime (uint256): 1518703200
Arg [3] : _maxBidInCentsPerAddress (uint256): 1000000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001c83501478f1320977047008496dacbd60bb15ef
Arg [1] : 00000000000000000000000084a5b2e686d6c048a28927a138df5b7cc7d6e530
Arg [2] : 000000000000000000000000000000000000000000000000000000005a859260
Arg [3] : 00000000000000000000000000000000000000000000000000000000000f4240


Swarm Source

bzzr://1348f98b9644cd1b15bf8f4623e8ea0b592ad9cb344a414f509dee61a9fd5a35

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.