More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,191 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 6528026 | 2285 days ago | IN | 0 ETH | 0.00006986 | ||||
Transfer | 6496236 | 2291 days ago | IN | 0.011361 ETH | 0.00002526 | ||||
Transfer | 5345215 | 2486 days ago | IN | 0.7 ETH | 0.00574175 | ||||
Transfer | 5345208 | 2486 days ago | IN | 0.7 ETH | 0.00344505 | ||||
Transfer | 5345206 | 2486 days ago | IN | 0.7 ETH | 0.00344505 | ||||
Transfer | 5274820 | 2498 days ago | IN | 0.0999 ETH | 0.00009315 | ||||
Transfer | 5274815 | 2498 days ago | IN | 0.0999 ETH | 0.00009315 | ||||
Transfer | 5239308 | 2504 days ago | IN | 0.29 ETH | 0.00002405 | ||||
Transfer | 5235343 | 2505 days ago | IN | 0.04 ETH | 0.00291116 | ||||
Transfer | 5235343 | 2505 days ago | IN | 0.04 ETH | 0.00009862 | ||||
Transfer | 5235341 | 2505 days ago | IN | 0.02 ETH | 0.00002405 | ||||
Transfer | 5235020 | 2505 days ago | IN | 0.03 ETH | 0.00002405 | ||||
Transfer | 5234915 | 2505 days ago | IN | 0.03 ETH | 0.00002646 | ||||
Transfer | 5234913 | 2505 days ago | IN | 0.032 ETH | 0.00002405 | ||||
Transfer | 5234798 | 2505 days ago | IN | 0.035 ETH | 0.00002405 | ||||
Transfer | 5234685 | 2505 days ago | IN | 0.04 ETH | 0.00005051 | ||||
Transfer | 5234684 | 2505 days ago | IN | 0.04 ETH | 0.00002646 | ||||
Transfer | 5234683 | 2505 days ago | IN | 0.04 ETH | 0.00002405 | ||||
Transfer | 5234645 | 2505 days ago | IN | 0.04 ETH | 0.00002405 | ||||
Transfer | 5232255 | 2505 days ago | IN | 0.037 ETH | 0.00002405 | ||||
Transfer | 5189321 | 2513 days ago | IN | 0.04 ETH | 0.00002405 | ||||
Transfer | 5189219 | 2513 days ago | IN | 0.039 ETH | 0.00009622 | ||||
Transfer | 5189218 | 2513 days ago | IN | 0.036 ETH | 0.00004811 | ||||
Transfer | 5189217 | 2513 days ago | IN | 0.048 ETH | 0.00004811 | ||||
Transfer | 5186054 | 2513 days ago | IN | 0.039 ETH | 0.00004811 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
5101726 | 2528 days ago | 0.2514296 ETH | ||||
5101076 | 2528 days ago | 0.2 ETH | ||||
5101061 | 2528 days ago | 0.15 ETH | ||||
5101050 | 2528 days ago | 0.046 ETH | ||||
5101046 | 2528 days ago | 0.3 ETH | ||||
5101045 | 2528 days ago | 0.07 ETH | ||||
5101045 | 2528 days ago | 0.24 ETH | ||||
5101045 | 2528 days ago | 0.0545 ETH | ||||
5101040 | 2528 days ago | 0.4 ETH | ||||
5101039 | 2528 days ago | 0.6 ETH | ||||
5101039 | 2528 days ago | 0.11 ETH | ||||
5101038 | 2528 days ago | 0.14 ETH | ||||
5101038 | 2528 days ago | 0.3564838 ETH | ||||
5101038 | 2528 days ago | 0.5 ETH | ||||
5101038 | 2528 days ago | 0.6 ETH | ||||
5101038 | 2528 days ago | 0.05 ETH | ||||
5101037 | 2528 days ago | 0.1 ETH | ||||
5101036 | 2528 days ago | 0.0265 ETH | ||||
5101036 | 2528 days ago | 1.92 ETH | ||||
5101036 | 2528 days ago | 1.60002364 ETH | ||||
5101036 | 2528 days ago | 0.4 ETH | ||||
5101034 | 2528 days ago | 0.18 ETH | ||||
5101034 | 2528 days ago | 3 ETH | ||||
5101033 | 2528 days ago | 0.05 ETH | ||||
5101032 | 2528 days ago | 0.05 ETH |
Loading...
Loading
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.