ETH Price: $2,428.02 (-4.94%)

Transaction Decoder

Block:
3754772 at May-23-2017 02:32:05 PM +UTC
Transaction Fee:
0.004518793002153784 ETH $10.97
Gas Used:
202,318 Gas / 22.335101188 Gwei

Emitted Events:

1 Oraclize.Log1( sender=[Receiver] IDice, cid=CE9F574453E372D0D95BD9F622D67114E7B93CCE6FA62DE3D4843C1758D8CCEF, timestamp=0, datasource=nested, arg=[URL] ['json(https://api.random.org/json-rpc/1/invoke).result.random.data.0', '\n{"jsonrpc":"2.0","method":"generateSignedIntegers","params":{"apiKey":${[decrypt] BDC819nTYbEiByr/iwndzNdSJ9JGJGRWwOTnFLhrFcxtWh53H7szcqHaC+Z/6UKH6T6N57RiPNmBWGeFSmqURHUqCSyN8vmUjVj9gEi7HmCoQlLSpx8QJTV9OxhFf43u8Vn7DugZcgyVcPEkEs2lTP1BXiAd},"n":1,"min":1,"max":100,"replacement":true,"base":10${[identity] "}"},"id":1${[identity] "}"}'], gaslimit=250000, proofType=System.Byte[], gasPrice=0 )
2 IDice.LogBet( BetID=CE9F574453E372D0D95BD9F622D67114E7B93CCE6FA62DE3D4843C1758D8CCEF, PlayerAddress=[Sender] 0x33664a1f6855a686e44b3f7d2ce4ba0ef89bc1c0, RewardValue=3252173913043478260, ProfitValue=1652173913043478260, BetValue=1600000000000000000, PlayerNumber=47 )

Account State Difference:

  Address   Before After State Difference Code
0x001a589D...86b2c6AD0 3.3278055 Eth3.333098 Eth0.0052925
0x33664A1F...ef89bc1C0
17.617218347958021322 Eth
Nonce: 152
16.012699554955867538 Eth
Nonce: 153
1.604518793002153784
0xe6517b76...26bCb1AaE
(iDice: Contract)
145.299489329485786729 Eth146.894196829485786729 Eth1.5947075
(Ethermine)
639.716462359798218339 Eth639.720981152800372123 Eth0.004518793002153784

Execution Trace

ETH 1.6 IDice.CALL( )
  • OraclizeAddrResolver.CALL( )
  • Oraclize.getPrice( _datasource=nested, _gaslimit=250000 ) => ( _dsprice=5292500000000000 )
    • Null: 0x000...004.6e657374( )
    • ETH 0.0052925 Oraclize.query_withGasLimit( _timestamp=0, _datasource=nested, _arg=[URL] ['json(https://api.random.org/json-rpc/1/invoke).result.random.data.0', '\n{"jsonrpc":"2.0","method":"generateSignedIntegers","params":{"apiKey":${[decrypt] BDC819nTYbEiByr/iwndzNdSJ9JGJGRWwOTnFLhrFcxtWh53H7szcqHaC+Z/6UKH6T6N57RiPNmBWGeFSmqURHUqCSyN8vmUjVj9gEi7HmCoQlLSpx8QJTV9OxhFf43u8Vn7DugZcgyVcPEkEs2lTP1BXiAd},"n":1,"min":1,"max":100,"replacement":true,"base":10${[identity] "}"},"id":1${[identity] "}"}'], _gaslimit=250000 ) => ( _id=CE9F574453E372D0D95BD9F622D67114E7B93CCE6FA62DE3D4843C1758D8CCEF )
      • Null: 0x000...004.6e657374( )
      • AmIOnTheFork.CALL( )
      • Null: 0x000...004.6e657374( )
      • Null: 0x000...004.5b55524c( )
        File 1 of 4: IDice
        pragma solidity ^0.4.2;
        
        // <ORACLIZE_API>
        /*
        Copyright (c) 2015-2016 Oraclize SRL
        Copyright (c) 2016 Oraclize LTD
        
        
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        
        
        The above copyright notice and this permission notice shall be included in
        all copies or substantial portions of the Software.
        
        
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        THE SOFTWARE.
        */
        
        //please import oraclizeAPI_pre0.4.sol when solidity < 0.4.0
        
        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);
        }
        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 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);
                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);
                    return true;
                }
                if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet
                    OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
                    return true;
                }
                if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet
                    OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
                    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_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_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 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 >= 48)&&(b1 <= 57)) b1 -= 48;
                    if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
                    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;
                }
        }
        // </ORACLIZE_API>
        
        // Etheroll Functions
        contract DSSafeAddSub {
            function safeToAdd(uint a, uint b) internal returns (bool) {
                return (a + b >= a);
            }
            function safeAdd(uint a, uint b) internal returns (uint) {
                if (!safeToAdd(a, b)) throw;
                return a + b;
            }
        
            function safeToSubtract(uint a, uint b) internal returns (bool) {
                return (b <= a);
            }
        
            function safeSub(uint a, uint b) internal returns (uint) {
                if (!safeToSubtract(a, b)) throw;
                return a - b;
            }
        }
        
        contract IDice is usingOraclize, DSSafeAddSub {
        
            /*
             * checks player profit and number is within range
            */
            modifier betIsValid(uint _betSize, uint _playerNumber) {
                if(((((_betSize * (100-(safeSub(_playerNumber,1)))) / (safeSub(_playerNumber,1))+_betSize))*houseEdge/houseEdgeDivisor)-_betSize > maxProfit || _betSize < minBet || _playerNumber < minNumber || _playerNumber > maxNumber) throw;
        		_;
            }
        
            /*
             * checks game is currently active
            */
            modifier gameIsActive {
                if(gamePaused == true) throw;
        		_;
            }
        
            /*
             * checks payouts are currently active
            */
            modifier payoutsAreActive {
                if(payoutsPaused == true) throw;
        		_;
            }
        
            /*
             * checks only Oraclize address is calling
            */
            modifier onlyOraclize {
                if (msg.sender != oraclize_cbAddress()) throw;
                _;
            }
        
            /*
             * checks only owner address is calling
            */
            modifier onlyOwner {
                 if (msg.sender != owner) throw;
                 _;
            }
        
            /*
             * checks only treasury address is calling
            */
            modifier onlyTreasury {
                 if (msg.sender != treasury) throw;
                 _;
            }
        
            /*
             * game vars
            */
        
            uint constant public maxBetDivisor = 1000000;
            uint constant public houseEdgeDivisor = 1000;
            uint constant public maxNumber = 99;
            uint constant public minNumber = 2;
        	bool public gamePaused;
            uint32 public gasForOraclize;
            address public owner;
            bool public payoutsPaused;
            address public treasury;
            uint public contractBalance;
            uint public houseEdge;
            uint public maxProfit;
            uint public maxProfitAsPercentOfHouse;
            uint public minBet;
            int public totalBets;
            uint public totalUserProfit;
            uint public maxPendingPayouts;
        
            /*
             * player vars
            */
            mapping (bytes32 => address) playerAddress;
            mapping (bytes32 => address) playerTempAddress;
            mapping (bytes32 => bytes32) playerBetId;
            mapping (bytes32 => uint) playerBetValue;
            mapping (bytes32 => uint) playerTempBetValue;
            mapping (bytes32 => uint) playerRandomResult;
            mapping (bytes32 => uint) playerDieResult;
            mapping (bytes32 => uint) playerNumber;
            mapping (address => uint) playerPendingWithdrawals;
            mapping (bytes32 => uint) playerProfit;
            mapping (bytes32 => uint) playerTempReward;
        
        
            /*
             * events
            */
            /* log bets + output to web3 for precise 'payout on win' field in UI */
            event LogBet(bytes32 indexed BetID, address indexed PlayerAddress, uint indexed RewardValue, uint ProfitValue, uint BetValue, uint PlayerNumber);
            /* output to web3 UI on bet result*/
            /* Status: 0=lose, 1=win, 2=win + failed send, 3=refund, 4=refund + failed send*/
        	event LogResult(bytes32 indexed BetID, address indexed PlayerAddress, uint indexed PlayerNumber, uint DiceResult, uint Value, int Status, bytes Proof);
            /* log manual refunds */
            event LogRefund(bytes32 indexed BetID, address indexed PlayerAddress, uint indexed RefundValue);
            /* log owner transfers */
            event LogOwnerTransfer(address indexed SentToAddress, uint indexed AmountTransferred);
        
        
            /*
             * init
            */
            function IDice() {
        
                owner = msg.sender;
                treasury = msg.sender;
        
                // This setnetwork is unncessary
                oraclize_setNetwork(networkID_auto);
                /* use TLSNotary for oraclize call */
        		oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS);
        
                /* init 990 = 99% (1% houseEdge)*/
                ownerSetHouseEdge(935);
        
                // 25,000 = 2.5% is our max profit of the house
                ownerSetMaxProfitAsPercentOfHouse(25000);
                /* init min bet (0.2 ether) */
        
                ownerSetMinBet(200000000000000000);
                /* init gas for oraclize */
                gasForOraclize = 250000;
        
            }
        
            /*
             * public function
             * player submit bet
             * only if game is active & bet is valid can query oraclize and set player vars
            */
            function playerRollDice(uint rollUnder) public
                payable
                gameIsActive
                betIsValid(msg.value, rollUnder)
        	{
        
                /*
                * assign partially encrypted query to oraclize
                * only the apiKey is encrypted
                * integer query is in plain text
                */
                bytes32 rngId = oraclize_query("nested", "[URL] ['json(https://api.random.org/json-rpc/1/invoke).result.random.data.0', '\\n{\"jsonrpc\":\"2.0\",\"method\":\"generateSignedIntegers\",\"params\":{\"apiKey\":${[decrypt] BDC819nTYbEiByr/iwndzNdSJ9JGJGRWwOTnFLhrFcxtWh53H7szcqHaC+Z/6UKH6T6N57RiPNmBWGeFSmqURHUqCSyN8vmUjVj9gEi7HmCoQlLSpx8QJTV9OxhFf43u8Vn7DugZcgyVcPEkEs2lTP1BXiAd},\"n\":1,\"min\":1,\"max\":100,\"replacement\":true,\"base\":10${[identity] \"}\"},\"id\":1${[identity] \"}\"}']", gasForOraclize);
                /* total number of bets (display purpose only) */
                totalBets += 1;
                /* map bet id to this oraclize query */
        		playerBetId[rngId] = rngId;
                /* map player lucky number to this oraclize query */
        		playerNumber[rngId] = rollUnder;
                /* map value of wager to this oraclize query */
                playerBetValue[rngId] = msg.value;
                /* map player address to this oraclize query */
                playerAddress[rngId] = msg.sender;
                /* safely map player reward to this oraclize query */
                playerProfit[rngId] = ((((msg.value * (100-(safeSub(rollUnder,1)))) / (safeSub(rollUnder,1))+msg.value))*houseEdge/houseEdgeDivisor)-msg.value;
                /* safely increase maxPendingPayouts liability - calc all pending payouts under assumption they win */
                maxPendingPayouts = safeAdd(maxPendingPayouts, playerProfit[rngId]);
                /* check contract can payout on win */
                if(maxPendingPayouts >= contractBalance) throw;
                /* provides accurate numbers for web3 and manual refunds in case of no oraclize __callback */
                LogBet(playerBetId[rngId], playerAddress[rngId], safeAdd(playerBetValue[rngId], playerProfit[rngId]), playerProfit[rngId], playerBetValue[rngId], playerNumber[rngId]);
        
            }
        
        
            /*
            * semi-public function - only oraclize can call
            */
            /*TLSNotary for oraclize call */
        	function __callback(bytes32 myid, string result, bytes proof) public
            //function __callback(bytes32 myid, string result) public
        		onlyOraclize
        		payoutsAreActive
        	{
        
                /* player address mapped to query id does not exist */
                if (playerAddress[myid]==0x0) throw;
        
        	    /* map result to player */
                playerRandomResult[myid] = parseInt(result);
        
                /* provably-fair random integer for player bounded to 1-100 inclusive
                *  sha3 the result from random.org and proof (IPFS address of TLSNotary proof)
                */
                playerDieResult[myid] = uint(sha3(playerRandomResult[myid], proof)) % (100 - 1) + 1;
        
                /* get the playerAddress for this query id */
                playerTempAddress[myid] = playerAddress[myid];
                /* delete playerAddress for this query id */
                delete playerAddress[myid];
        
                /* map the playerProfit for this query id */
                playerTempReward[myid] = playerProfit[myid];
                /* set  playerProfit for this query id to 0 */
                playerProfit[myid] = 0;
        
                /* safely reduce maxPendingPayouts liability */
                maxPendingPayouts = safeSub(maxPendingPayouts, playerTempReward[myid]);
        
                /* map the playerBetValue for this query id */
                playerTempBetValue[myid] = playerBetValue[myid];
                /* set  playerBetValue for this query id to 0 */
                playerBetValue[myid] = 0;
        
                /*
                * refund
                * if result from oraclize is 0 refund only the original bet value
                * if refund fails save refund value to playerPendingWithdrawals
                */
                if(playerDieResult[myid]==0){
        
                     LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempBetValue[myid], 3, proof);
                    //LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempBetValue[myid], 3);
        
                    /*
                    * send refund - external call to an untrusted contract
                    * if send fails map refund value to playerPendingWithdrawals[address]
                    * for withdrawal later via playerWithdrawPendingTransactions
                    */
                    if(!playerTempAddress[myid].send(playerTempBetValue[myid])){
                        LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempBetValue[myid], 4, proof);
                        //LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempBetValue[myid], 4);
                        /* if send failed let player withdraw via playerWithdrawPendingTransactions */
                        playerPendingWithdrawals[playerTempAddress[myid]] = safeAdd(playerPendingWithdrawals[playerTempAddress[myid]], playerTempBetValue[myid]);
                    }
        
                    return;
                }
        
                /*
                * pay winner
                * update contract balance to calculate new max bet
                * send reward
                * if send of reward fails save value to playerPendingWithdrawals
                */
                if(playerDieResult[myid] < playerNumber[myid]){
        
                    /* safely reduce contract balance by player profit */
                    contractBalance = safeSub(contractBalance, playerTempReward[myid]);
        
                    /* safely calculate total payout as player profit plus original wager */
                    playerTempReward[myid] = safeAdd(playerTempReward[myid], playerTempBetValue[myid]);
        
                    totalUserProfit = totalUserProfit + playerTempReward[myid]; // total profits
        
                    LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempReward[myid], 1, proof);
                    //LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempReward[myid], 1);
        
                    /* update maximum profit */
                    setMaxProfit();
        
                    /*
                    * send win - external call to an untrusted contract
                    * if send fails map reward value to playerPendingWithdrawals[address]
                    * for withdrawal later via playerWithdrawPendingTransactions
                    */
                    if(!playerTempAddress[myid].send(playerTempReward[myid])){
                        LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempReward[myid], 2, proof);
                        //LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempReward[myid], 2);
                        /* if send failed let player withdraw via playerWithdrawPendingTransactions */
                        playerPendingWithdrawals[playerTempAddress[myid]] = safeAdd(playerPendingWithdrawals[playerTempAddress[myid]], playerTempReward[myid]);
                    }
        
                    return;
                }
        
                /*
                * no win
                * send 1 wei to a losing bet
                * update contract balance to calculate new max bet
                */
                if(playerDieResult[myid] >= playerNumber[myid]){
        
                    LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempBetValue[myid], 0, proof);
                    //LogResult(playerBetId[myid], playerTempAddress[myid], playerNumber[myid], playerDieResult[myid], playerTempBetValue[myid], 0);
        
                    /*
                    *  safe adjust contractBalance
                    *  setMaxProfit
                    *  send 1 wei to losing bet
                    */
                    contractBalance = safeAdd(contractBalance, (playerTempBetValue[myid]-1));
        
                    /* update maximum profit */
                    setMaxProfit();
        
                    /*
                    * send 1 wei - external call to an untrusted contract
                    */
                    if(!playerTempAddress[myid].send(1)){
                        /* if send failed let player withdraw via playerWithdrawPendingTransactions */
                       playerPendingWithdrawals[playerTempAddress[myid]] = safeAdd(playerPendingWithdrawals[playerTempAddress[myid]], 1);
                    }
        
                    return;
        
                }
        
            }
        
            /*
            * public function
            * in case of a failed refund or win send
            */
            function playerWithdrawPendingTransactions() public
                payoutsAreActive
                returns (bool)
             {
                uint withdrawAmount = playerPendingWithdrawals[msg.sender];
                playerPendingWithdrawals[msg.sender] = 0;
                /* external call to untrusted contract */
                if (msg.sender.call.value(withdrawAmount)()) {
                    return true;
                } else {
                    /* if send failed revert playerPendingWithdrawals[msg.sender] = 0; */
                    /* player can try to withdraw again later */
                    playerPendingWithdrawals[msg.sender] = withdrawAmount;
                    return false;
                }
            }
        
            /* check for pending withdrawals  */
            function playerGetPendingTxByAddress(address addressToCheck) public constant returns (uint) {
                return playerPendingWithdrawals[addressToCheck];
            }
        
            /*
            * internal function
            * sets max profit
            */
            function setMaxProfit() internal {
                maxProfit = (contractBalance*maxProfitAsPercentOfHouse)/maxBetDivisor;
            }
        
            /*
            * owner/treasury address only functions
            */
            function ()
                payable
            {
                playerRollDice(47);
            }
        
            function ownerAddBankroll ()
            payable
            onlyTreasury
            {
                /* safely update contract balance */
                contractBalance = safeAdd(contractBalance, msg.value);
                /* update the maximum profit */
                setMaxProfit();
            }
        
            /* set gas for oraclize query */
            function ownerSetOraclizeSafeGas(uint32 newSafeGasToOraclize) public
        		onlyOwner
        	{
            	gasForOraclize = newSafeGasToOraclize;
            }
        
            /* only owner address can set houseEdge */
            function ownerSetHouseEdge(uint newHouseEdge) public
        		onlyOwner
            {
                houseEdge = newHouseEdge;
            }
        
            /* only owner address can set maxProfitAsPercentOfHouse */
            function ownerSetMaxProfitAsPercentOfHouse(uint newMaxProfitAsPercent) public
        		onlyOwner
            {
                /* restrict to maximum profit of 5% of total house balance*/
                if(newMaxProfitAsPercent > 50000) throw;
                maxProfitAsPercentOfHouse = newMaxProfitAsPercent;
                setMaxProfit();
            }
        
            /* only owner address can set minBet */
            function ownerSetMinBet(uint newMinimumBet) public
        		onlyOwner
            {
                minBet = newMinimumBet;
            }
        
            /* only owner address can transfer ether */
            function ownerTransferEther(address sendTo, uint amount) public
        		onlyOwner
            {
                /* safely update contract balance when sending out funds*/
                contractBalance = safeSub(contractBalance, amount);
                /* update max profit */
                setMaxProfit();
                if(!sendTo.send(amount)) throw;
                LogOwnerTransfer(sendTo, amount);
            }
        
            /* only owner address can do manual refund
            * used only if bet placed + oraclize failed to __callback
            * filter LogBet by address and/or playerBetId:
            * LogBet(playerBetId[rngId], playerAddress[rngId], safeAdd(playerBetValue[rngId], playerProfit[rngId]), playerProfit[rngId], playerBetValue[rngId], playerNumber[rngId]);
            * check the following logs do not exist for playerBetId and/or playerAddress[rngId] before refunding:
            * LogResult or LogRefund
            * if LogResult exists player should use the withdraw pattern playerWithdrawPendingTransactions
            */
            function ownerRefundPlayer(bytes32 originalPlayerBetId, address sendTo, uint originalPlayerProfit, uint originalPlayerBetValue) public
        		onlyOwner
            {
                /* safely reduce pendingPayouts by playerProfit[rngId] */
                maxPendingPayouts = safeSub(maxPendingPayouts, originalPlayerProfit);
                /* send refund */
                if(!sendTo.send(originalPlayerBetValue)) throw;
                /* log refunds */
                LogRefund(originalPlayerBetId, sendTo, originalPlayerBetValue);
            }
        
            /* only owner address can set emergency pause #1 */
            function ownerPauseGame(bool newStatus) public
        		onlyOwner
            {
        		gamePaused = newStatus;
            }
        
            /* only owner address can set emergency pause #2 */
            function ownerPausePayouts(bool newPayoutStatus) public
        		onlyOwner
            {
        		payoutsPaused = newPayoutStatus;
            }
        
            /* only owner address can set treasury address */
            function ownerSetTreasury(address newTreasury) public
        		onlyOwner
        	{
                treasury = newTreasury;
            }
        
            /* only owner address can set owner address */
            function ownerChangeOwner(address newOwner) public
        		onlyOwner
        	{
                owner = newOwner;
            }
        
            /* only owner address can suicide - emergency */
            function ownerkill() public
        		onlyOwner
        	{
        		suicide(owner);
        	}
        
        
        }

        File 2 of 4: Oraclize
        /*
        Copyright (c) 2015-2016 Oraclize srl, Thomas Bertani
        */
        
        contract AmIOnTheFork{
            function forked() constant returns(bool);
        }
        
        
        contract Oraclize {
            mapping (address => uint) reqc;
            
            address public cbAddress = 0x26588a9301b0428d95e6fc3a5024fce8bec12d51;
            
            address constant AmIOnTheForkAddress = 0x2bd2326c993dfaef84f696526064ff22eba5b362;
            
            event Log1(address sender, bytes32 cid, uint timestamp, string datasource, string arg, uint gaslimit, byte proofType, uint gasPrice);
            event Log2(address sender, bytes32 cid, uint timestamp, string datasource, string arg1, string arg2, uint gaslimit, byte proofType, uint gasPrice);
            
            address owner;
            
            modifier onlyadmin {
                if ((msg.sender != owner)&&(msg.sender != cbAddress)) throw;
                _
            }
            
            function addDSource(string dsname, uint multiplier) {
                addDSource(dsname, 0x00, multiplier);
            }
            
            function addDSource(string dsname, byte proofType, uint multiplier) onlyadmin {
                bytes32 dsname_hash = sha3(dsname, proofType);
                dsources[dsources.length++] = dsname_hash;
                price_multiplier[dsname_hash] = multiplier;
            }
        
            mapping (bytes32 => bool) coupons;
            bytes32 coupon;
            
            function createCoupon(string _code) onlyadmin {
                coupons[sha3(_code)] = true;
            }
            
            function deleteCoupon(string _code) onlyadmin {
                coupons[sha3(_code)] = false;
            }
            
            function multisetProofType(uint[] _proofType, address[] _addr) onlyadmin {
                for (uint i=0; i<_addr.length; i++) addr_proofType[_addr[i]] = byte(_proofType[i]);
            }
            
            function multisetCustomGasPrice(uint[] _gasPrice, address[] _addr) onlyadmin {
                for (uint i=0; i<_addr.length; i++) addr_gasPrice[_addr[i]] = _gasPrice[i];
            }
        
            uint gasprice = 20000000000;
            
            function setGasPrice(uint newgasprice) onlyadmin {
                gasprice = newgasprice;
            }
            
            function setBasePrice(uint new_baseprice) onlyadmin { //0.001 usd in ether
                baseprice = new_baseprice;
                for (uint i=0; i<dsources.length; i++) price[dsources[i]] = new_baseprice*price_multiplier[dsources[i]];
            }
        
            function setBasePrice(uint new_baseprice, bytes proofID) onlyadmin { //0.001 usd in ether
                baseprice = new_baseprice;
                for (uint i=0; i<dsources.length; i++) price[dsources[i]] = new_baseprice*price_multiplier[dsources[i]];
            }
            
            function withdrawFunds(address _addr) onlyadmin {
                _addr.send(this.balance);
            }
            
            function() onlyadmin {}
            
            function Oraclize() {
                owner = msg.sender;
            }
            
            modifier costs(string datasource, uint gaslimit) {
                uint price = getPrice(datasource, gaslimit, msg.sender);
                if (msg.value >= price){
                    uint diff = msg.value - price;
                    if (diff > 0) msg.sender.send(diff);
                    _
                } else throw;
            }
        
            mapping (address => byte) addr_proofType;
            mapping (address => uint) addr_gasPrice;
            uint public baseprice;
            mapping (bytes32 => uint) price;
            mapping (bytes32 => uint) price_multiplier;
            bytes32[] dsources;
            function useCoupon(string _coupon) {
                coupon = sha3(_coupon);
            }
            
            function setProofType(byte _proofType) {
                addr_proofType[msg.sender] = _proofType;
            }
            
            function setCustomGasPrice(uint _gasPrice) {
                addr_gasPrice[msg.sender] = _gasPrice;
            }
            
            function getPrice(string _datasource) public returns (uint _dsprice) {
                return getPrice(_datasource, msg.sender);
            }
            
            function getPrice(string _datasource, uint _gaslimit) public returns (uint _dsprice) {
                return getPrice(_datasource, _gaslimit, msg.sender);
            }
            
            function getPrice(string _datasource, address _addr) private returns (uint _dsprice) {
                return getPrice(_datasource, 200000, _addr);
            }
            
            function getPrice(string _datasource, uint _gaslimit, address _addr) private returns (uint _dsprice) {
                if ((_gaslimit <= 200000)&&(reqc[_addr] == 0)&&(tx.origin != cbAddress)) return 0;
                if ((coupon != 0)&&(coupons[coupon] == true)) return 0;
                _dsprice = price[sha3(_datasource, addr_proofType[_addr])];
                uint gasprice_ = addr_gasPrice[_addr];
                if (gasprice_ == 0) gasprice_ = gasprice; 
                _dsprice += _gaslimit*gasprice_;
                return _dsprice;
            }
            
            function query(string _datasource, string _arg) returns (bytes32 _id) {
                return query1(0, _datasource, _arg, 200000);
            }
            
            function query1(string _datasource, string _arg) returns (bytes32 _id) {
                return query1(0, _datasource, _arg, 200000);
            }
            
            function query2(string _datasource, string _arg1, string _arg2) returns (bytes32 _id) {
                return query2(0, _datasource, _arg1, _arg2, 200000);
            }
            
            function query(uint _timestamp, string _datasource, string _arg) returns (bytes32 _id) {
                return query1(_timestamp, _datasource, _arg, 200000);
            }
            
            function query1(uint _timestamp, string _datasource, string _arg) returns (bytes32 _id) {
                return query1(_timestamp, _datasource, _arg, 200000);
            }
            
            function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) returns (bytes32 _id) {
                return query2(_timestamp, _datasource, _arg1, _arg2, 200000);
            }
            
            function query(uint _timestamp, string _datasource, string _arg, uint _gaslimit) returns (bytes32 _id) {
                return query1(_timestamp, _datasource, _arg, _gaslimit);
            }
            
            function query1(uint _timestamp, string _datasource, string _arg, uint _gaslimit) costs(_datasource, _gaslimit) returns (bytes32 _id) {
        	if ((_timestamp > now+3600*24*60)||(_gaslimit > block.gaslimit)) throw;
        	bool forkFlag = AmIOnTheFork(AmIOnTheForkAddress).forked();
                _id = sha3(forkFlag, this, msg.sender, reqc[msg.sender]);
                reqc[msg.sender]++;
                Log1(msg.sender, _id, _timestamp, _datasource, _arg, _gaslimit, addr_proofType[msg.sender], addr_gasPrice[msg.sender]);
                return _id;
            }
            
            function query2(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) costs(_datasource, _gaslimit) returns (bytes32 _id) {
        	if ((_timestamp > now+3600*24*60)||(_gaslimit > block.gaslimit)) throw;
        	bool forkFlag = AmIOnTheFork(AmIOnTheForkAddress).forked();
                _id = sha3(forkFlag, this, msg.sender, reqc[msg.sender]);
                reqc[msg.sender]++;
                Log2(msg.sender, _id, _timestamp, _datasource, _arg1, _arg2, _gaslimit, addr_proofType[msg.sender], addr_gasPrice[msg.sender]);
                return _id;
            }
            
            function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) returns (bytes32 _id) {
                return query(_timestamp, _datasource, _arg, _gaslimit);
            }
            
            function query1_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) returns (bytes32 _id) {
                return query1(_timestamp, _datasource, _arg, _gaslimit);
            }
            
            function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) returns (bytes32 _id) {
                return query2(_timestamp, _datasource, _arg1, _arg2, _gaslimit);
            }
        }

        File 3 of 4: OraclizeAddrResolver
        /*
          Copyright (c) 2015-2016 Oraclize SRL
          Copyright (c) 2016 Oraclize LTD
        */
        
        contract OraclizeAddrResolver {
        
            address public addr;
        
            address owner;
        
            function OraclizeAddrResolver(){
                owner = msg.sender;
            }
        
            function changeOwner(address newowner){
                if (msg.sender != owner) throw;
                owner = newowner;
            }
        
            function getAddress() returns (address oaddr){
                return addr;
            }
        
            function setAddr(address newaddr){
                if (msg.sender != owner) throw;
                addr = newaddr;
            }
        
        }

        File 4 of 4: AmIOnTheFork
        contract AmIOnTheFork {
            bool public forked = false;
            address constant darkDAO = 0x304a554a310c7e546dfe434669c62820b7d83490;
            // Check the fork condition during creation of the contract.
            // This function should be called between block 1920000 and 1921200.
            // Approximately between 2016-07-20 12:00:00 UTC and 2016-07-20 17:00:00 UTC.
            // After that the status will be locked in.
            function update() {
                if (block.number >= 1920000 && block.number <= 1921200) {
                    forked = darkDAO.balance < 3600000 ether;
                }
            }
            function() {
                throw;
            }
        }