Sponsored Link:   ARNA Genomics - FIRST BLOCKCHAIN BIOTECH ECOSYSTEM. Join ICO Now!
Overview
ETH Balance: 0 Ether
ETH USD Value: $0
No Of Transactions: 169 txns
Misc
Address Watch Add To Watch List
  Latest 25 txns from a total Of 169 transactions View All

TxHash Age From To Value [TxFee]
0x256ada037e2d9242d384e1e74861f2dd952c10502346420829dd9dd4f4e47814252 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00054448
0xb4ac1d8e4028f75ad52b33337ed0586c4e46933f2a5519c6d540ee3cd04c92cc253 days 9 hrs ago0xa4f970e6425e316984208ca1ee95ca618c11a34d  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.000560388
0xae4218ab7fa99a81a5e2d2fc8b1220e4d7f61362fd15c9ab1a7ddfb76fe32ae6253 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00258442
0xb3aafa9a7154016976d946d3c9577274af3e6863f4ffaadee7984138879881c0254 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00308158
0xb69f99bc2049f32aa98d318898e2ac16703bcd52ed10e23702452d54be5684a3255 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.0032408
0x9ac77fcd000e97a6ecfb1d9dd735eb65f74439ccb136a2fd286025ca26b5a112256 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00345734
0x89b5caafb376354f4cc6ffc17a85389cf941e67bb72b1fac97374ab24ad5884a257 days 4 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001547469
0xffc14c458ec738e9c5c1048b3b936752ccd586390473b2ae340a849d8d3f2fa8257 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00409352
0xa403fef0a6dedd640671a1518cbf1348cc6e3b4612a5a5cd7bd73e9802017e2b257 days 17 hrs ago0x76ebd82371bba88335d1003115f716831b4173ad  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001308321
0xfbdd1381e9e9ba3dd3a7e9a2f3d4df38097b1a50643994ed26b4c7c772009ad8258 days 7 hrs ago0x2e3f263a11be13bdf59207c3ed87871db331b78e  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00525
0xb555f5a538cbf84912a28f632eb54f046c94d151b08e68274d79598aed6b2a6f258 days 8 hrs ago0x2e3f263a11be13bdf59207c3ed87871db331b78e  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00525
0x39d2ce3eb34ff170eb4d02b1c18c88285da4946e3ba6f7b4c75f7e46ecfcd84c258 days 8 hrs ago0x2e3f263a11be13bdf59207c3ed87871db331b78e  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00525
0x8db2d02bfe4ea1ed70cac21754bb5150d20580f5b0c9db93eba2d6ae96273d64258 days 8 hrs ago0x2e3f263a11be13bdf59207c3ed87871db331b78e  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00525
0x9afcc3ebf67f92f637599a0ac0510420fec20e733ad800c435ac5922051ab95b258 days 8 hrs ago0x2e3f263a11be13bdf59207c3ed87871db331b78e  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001777524
0x4486db57afd96a92ad899d5d29cddd32f3090a2f6d27582d0f6ee4004cce9a4d258 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.00457328
0xb8b9459b103e7cccf1c3a81a409b444af08503952202ad02afe4de02c06ed403259 days 10 hrs ago0x9ec5ea5015bd19c265990ab0a71b84611739d1ed  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001642284
0xe08525737e166cbcb123619311ae305a00ae48354e0d5c8ade39a904994d4a12259 days 10 hrs agoOraclize  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.0048745
0x6b7f184090bdde99378472c42984ef6e806b4ca1dfaabc78eba1aee977cd814b259 days 13 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0.1 Ether0.001898505
0x38926c1db84839b29ba5d07ff4820c8acb30dc8ef130765d2a4d2a2e36db5764259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001503999
0x46f67eec8e9f9003d4f87cd21bc08be640fb24c1ae05d01383d5c3cdb70519e3259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0.2 Ether0.003136455
0x38d6fcc57e4676528410c9932766d3597ff162381682d6d4ec9418a899877996259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0.4 Ether0.003141999
0x7250d4977aadcd8feebf455d65d1ee0b5aab3756af37f398e7a5a39970df3c8a259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001503999
0xf4418db97aaf605ea6a0f0b331fc41b3767488e6f26a2d47e9ced4b0cd41d110259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0.2 Ether0.003136455
0xb297b0fa05f6568e3156f3a0cef3250e0ae3d84d276e359fe94f5d38bf1c9957259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0.4 Ether0.003141999
0x49d3f922bbe46a35725e805d1844fa69555b600a577fe8092abd2e738df99fe8259 days 15 hrs ago0x47b5ed2279478151d1631014aa90f876fec4a136  IN   0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0 Ether0.001503999
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
  Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0xb4ac1d8e4028f75ad52b33337ed0586c4e46933f2a5519c6d540ee3cd04c92cc3328309253 days 9 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0xa4f970e6425e316984208ca1ee95ca618c11a34d5.447751185880606421 Ether
0xae4218ab7fa99a81a5e2d2fc8b1220e4d7f61362fd15c9ab1a7ddfb76fe32ae63328134253 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02757995226730308 Ether
0xb3aafa9a7154016976d946d3c9577274af3e6863f4ffaadee7984138879881c03322186254 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02777995226730308 Ether
0xb69f99bc2049f32aa98d318898e2ac16703bcd52ed10e23702452d54be5684a33316221255 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02797995226730308 Ether
0x9ac77fcd000e97a6ecfb1d9dd735eb65f74439ccb136a2fd286025ca26b5a1123310159256 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02817995226730308 Ether
0x89b5caafb376354f4cc6ffc17a85389cf941e67bb72b1fac97374ab24ad5884a3305692257 days 4 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.098082847384698213 Ether
0xffc14c458ec738e9c5c1048b3b936752ccd586390473b2ae340a849d8d3f2fa83304225257 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02857995226730308 Ether
0xa403fef0a6dedd640671a1518cbf1348cc6e3b4612a5a5cd7bd73e9802017e2b3302499257 days 17 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x76ebd82371bba88335d1003115f716831b4173ad6.66106900765060247 Ether
0x9afcc3ebf67f92f637599a0ac0510420fec20e733ad800c435ac5922051ab95b3298872258 days 8 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x2e3f263a11be13bdf59207c3ed87871db331b78e0.26877157618606417 Ether
0x4486db57afd96a92ad899d5d29cddd32f3090a2f6d27582d0f6ee4004cce9a4d3298230258 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02786923226730308 Ether
0xb8b9459b103e7cccf1c3a81a409b444af08503952202ad02afe4de02c06ed4033292200259 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x9ec5ea5015bd19c265990ab0a71b84611739d1ed0.539693526307683216 Ether
0xe08525737e166cbcb123619311ae305a00ae48354e0d5c8ade39a904994d4a123292165259 days 10 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x001a589dda0d6be37632925eaf1256986b2c6ad00.02826923226730308 Ether
0x38926c1db84839b29ba5d07ff4820c8acb30dc8ef130765d2a4d2a2e36db57643290992259 days 15 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.57 Ether
0x7250d4977aadcd8feebf455d65d1ee0b5aab3756af37f398e7a5a39970df3c8a3290912259 days 15 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.57 Ether
0x49d3f922bbe46a35725e805d1844fa69555b600a577fe8092abd2e738df99fe83290879259 days 15 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.57 Ether
0x7af21c1ff81624612d3ebfa18c64acde24dd108f9b125e2f4abd9dfa0d74e8bb3290848259 days 15 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0xe2635096707772ffd63cdce27caf8cf66908edfc4ecf65b47cc5c4f9aad943633288080260 days 2 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x532c278d4e91f12de1b87588d530e1f766d4f4253.531398621307659734 Ether
0xd82557a5fc7a3c1ffdd5a3f582634130eafcbdc19e3692130ab9fd6e2ca9d5433287910260 days 3 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x6415a1a3f9ba496c075dbcfdea5b33ebb0b1088e166489ec2d76be047e98e4e93287888260 days 3 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x4d80af3c75f867e7a86fdc76721173ef5625bf2ce6581158612149c6b24707503287695260 days 4 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x87857536166fc9551ec224a55256cf769367e98b972bb78e14b4efe3d5c257da3287676260 days 4 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x676b5588789767d0d2b4e8377a74d1d40877766f9c266a66e8791700ec3f7bb33287651260 days 4 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x7383e6bab633cd3296d21d21f65af91cfe2aa03d6ca89218c0e9d97103078e923287614260 days 4 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x8eeb275535dae6c1ff2edab5bf8bc98f6a3876f1c7bb4bdc1b5cc3fb2259b4df3287596260 days 4 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
0x4e2fb144aac78f28c907cbf72b177055c8bcc5c269fb7542e164d3121e0bff3c3287316260 days 6 hrs ago0x807a3ef8a8dbdd7fc9863df695bbe8691e450e8e0x47b5ed2279478151d1631014aa90f876fec4a1360.095 Ether
[ Download CSV Export  ] 
Contract SUICIDE called at TxHash 0xb4ac1d8e4028f75ad52b33337ed0586c4e46933f2a5519c6d540ee3cd04c92cc

Contract Name: Pray4Prey
Compiler Version: v0.4.9+commit.364da425
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts
// <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.
*/

pragma solidity ^0.4.0;//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 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) 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(0x20e12a1f859b3feae5fb2a0a32c18f5a65555bbf)>0){ //ether.camp ide
            OAR = OraclizeAddrResolverI(0x20e12a1f859b3feae5fb2a0a32c18f5a65555bbf);
            return true;
        }
        if (getCodeSize(0x93bbbe5ce77034e3095f0479919962a903f898ad)>0){ //norsborg testnet
            OAR = OraclizeAddrResolverI(0x93bbbe5ce77034e3095f0479919962a903f898ad);
            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_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);
    }
    
    

}
// </ORACLIZE_API>



library strings {
    struct slice {
        uint _len;
        uint _ptr;
    }

    function memcpy(uint dest, uint src, uint len) private {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /**
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal returns (slice) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    /**
     * @dev Returns the length of a null-terminated bytes32 string.
     * @param self The value to find the length of.
     * @return The length of the string, from 0 to 32.
     */
    function len(bytes32 self) internal returns (uint) {
        uint ret;
        if (self == 0)
            return 0;
        if (self & 0xffffffffffffffffffffffffffffffff == 0) {
            ret += 16;
            self = bytes32(uint(self) / 0x100000000000000000000000000000000);
        }
        if (self & 0xffffffffffffffff == 0) {
            ret += 8;
            self = bytes32(uint(self) / 0x10000000000000000);
        }
        if (self & 0xffffffff == 0) {
            ret += 4;
            self = bytes32(uint(self) / 0x100000000);
        }
        if (self & 0xffff == 0) {
            ret += 2;
            self = bytes32(uint(self) / 0x10000);
        }
        if (self & 0xff == 0) {
            ret += 1;
        }
        return 32 - ret;
    }

    /**
     * @dev Returns a slice containing the entire bytes32, interpreted as a
     *      null-termintaed utf-8 string.
     * @param self The bytes32 value to convert to a slice.
     * @return A new slice containing the value of the input argument up to the
     *         first null.
     */
    function toSliceB32(bytes32 self) internal returns (slice ret) {
        // Allocate space for `self` in memory, copy it there, and point ret at it
        assembly {
            let ptr := mload(0x40)
            mstore(0x40, add(ptr, 0x20))
            mstore(ptr, self)
            mstore(add(ret, 0x20), ptr)
        }
        ret._len = len(self);
    }

    /**
     * @dev Returns a new slice containing the same data as the current slice.
     * @param self The slice to copy.
     * @return A new slice containing the same data as `self`.
     */
    function copy(slice self) internal returns (slice) {
        return slice(self._len, self._ptr);
    }

    /**
     * @dev Copies a slice to a new string.
     * @param self The slice to copy.
     * @return A newly allocated string containing the slice's text.
     */
    function toString(slice self) internal returns (string) {
        var ret = new string(self._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        memcpy(retptr, self._ptr, self._len);
        return ret;
    }

    /**
     * @dev Returns the length in runes of the slice. Note that this operation
     *      takes time proportional to the length of the slice; avoid using it
     *      in loops, and call `slice.empty()` if you only need to know whether
     *      the slice is empty or not.
     * @param self The slice to operate on.
     * @return The length of the slice in runes.
     */
    function len(slice self) internal returns (uint) {
        // Starting at ptr-31 means the LSB will be the byte we care about
        var ptr = self._ptr - 31;
        var end = ptr + self._len;
        for (uint len = 0; ptr < end; len++) {
            uint8 b;
            assembly { b := and(mload(ptr), 0xFF) }
            if (b < 0x80) {
                ptr += 1;
            } else if(b < 0xE0) {
                ptr += 2;
            } else if(b < 0xF0) {
                ptr += 3;
            } else if(b < 0xF8) {
                ptr += 4;
            } else if(b < 0xFC) {
                ptr += 5;
            } else {
                ptr += 6;
            }
        }
        return len;
    }

    /**
     * @dev Returns true if the slice is empty (has a length of 0).
     * @param self The slice to operate on.
     * @return True if the slice is empty, False otherwise.
     */
    function empty(slice self) internal returns (bool) {
        return self._len == 0;
    }

    /**
     * @dev Returns a positive number if `other` comes lexicographically after
     *      `self`, a negative number if it comes before, or zero if the
     *      contents of the two slices are equal. Comparison is done per-rune,
     *      on unicode codepoints.
     * @param self The first slice to compare.
     * @param other The second slice to compare.
     * @return The result of the comparison.
     */
    function compare(slice self, slice other) internal returns (int) {
        uint shortest = self._len;
        if (other._len < self._len)
            shortest = other._len;

        var selfptr = self._ptr;
        var otherptr = other._ptr;
        for (uint idx = 0; idx < shortest; idx += 32) {
            uint a;
            uint b;
            assembly {
                a := mload(selfptr)
                b := mload(otherptr)
            }
            if (a != b) {
                // Mask out irrelevant bytes and check again
                uint mask = ~(2 ** (8 * (32 - shortest + idx)) - 1);
                var diff = (a & mask) - (b & mask);
                if (diff != 0)
                    return int(diff);
            }
            selfptr += 32;
            otherptr += 32;
        }
        return int(self._len) - int(other._len);
    }

    /**
     * @dev Returns true if the two slices contain the same text.
     * @param self The first slice to compare.
     * @param self The second slice to compare.
     * @return True if the slices are equal, false otherwise.
     */
    function equals(slice self, slice other) internal returns (bool) {
        return compare(self, other) == 0;
    }

    /**
     * @dev Extracts the first rune in the slice into `rune`, advancing the
     *      slice to point to the next rune and returning `self`.
     * @param self The slice to operate on.
     * @param rune The slice that will contain the first rune.
     * @return `rune`.
     */
    function nextRune(slice self, slice rune) internal returns (slice) {
        rune._ptr = self._ptr;

        if (self._len == 0) {
            rune._len = 0;
            return rune;
        }

        uint len;
        uint b;
        // Load the first byte of the rune into the LSBs of b
        assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) }
        if (b < 0x80) {
            len = 1;
        } else if(b < 0xE0) {
            len = 2;
        } else if(b < 0xF0) {
            len = 3;
        } else {
            len = 4;
        }

        // Check for truncated codepoints
        if (len > self._len) {
            rune._len = self._len;
            self._ptr += self._len;
            self._len = 0;
            return rune;
        }

        self._ptr += len;
        self._len -= len;
        rune._len = len;
        return rune;
    }

    /**
     * @dev Returns the first rune in the slice, advancing the slice to point
     *      to the next rune.
     * @param self The slice to operate on.
     * @return A slice containing only the first rune from `self`.
     */
    function nextRune(slice self) internal returns (slice ret) {
        nextRune(self, ret);
    }

    /**
     * @dev Returns the number of the first codepoint in the slice.
     * @param self The slice to operate on.
     * @return The number of the first codepoint in the slice.
     */
    function ord(slice self) internal returns (uint ret) {
        if (self._len == 0) {
            return 0;
        }

        uint word;
        uint len;
        uint div = 2 ** 248;

        // Load the rune into the MSBs of b
        assembly { word:= mload(mload(add(self, 32))) }
        var b = word / div;
        if (b < 0x80) {
            ret = b;
            len = 1;
        } else if(b < 0xE0) {
            ret = b & 0x1F;
            len = 2;
        } else if(b < 0xF0) {
            ret = b & 0x0F;
            len = 3;
        } else {
            ret = b & 0x07;
            len = 4;
        }

        // Check for truncated codepoints
        if (len > self._len) {
            return 0;
        }

        for (uint i = 1; i < len; i++) {
            div = div / 256;
            b = (word / div) & 0xFF;
            if (b & 0xC0 != 0x80) {
                // Invalid UTF-8 sequence
                return 0;
            }
            ret = (ret * 64) | (b & 0x3F);
        }

        return ret;
    }

    /**
     * @dev Returns the keccak-256 hash of the slice.
     * @param self The slice to hash.
     * @return The hash of the slice.
     */
    function keccak(slice self) internal returns (bytes32 ret) {
        assembly {
            ret := sha3(mload(add(self, 32)), mload(self))
        }
    }

    /**
     * @dev Returns true if `self` starts with `needle`.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return True if the slice starts with the provided text, false otherwise.
     */
    function startsWith(slice self, slice needle) internal returns (bool) {
        if (self._len < needle._len) {
            return false;
        }

        if (self._ptr == needle._ptr) {
            return true;
        }

        bool equal;
        assembly {
            let len := mload(needle)
            let selfptr := mload(add(self, 0x20))
            let needleptr := mload(add(needle, 0x20))
            equal := eq(sha3(selfptr, len), sha3(needleptr, len))
        }
        return equal;
    }

    /**
     * @dev If `self` starts with `needle`, `needle` is removed from the
     *      beginning of `self`. Otherwise, `self` is unmodified.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return `self`
     */
    function beyond(slice self, slice needle) internal returns (slice) {
        if (self._len < needle._len) {
            return self;
        }

        bool equal = true;
        if (self._ptr != needle._ptr) {
            assembly {
                let len := mload(needle)
                let selfptr := mload(add(self, 0x20))
                let needleptr := mload(add(needle, 0x20))
                equal := eq(sha3(selfptr, len), sha3(needleptr, len))
            }
        }

        if (equal) {
            self._len -= needle._len;
            self._ptr += needle._len;
        }

        return self;
    }

    /**
     * @dev Returns true if the slice ends with `needle`.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return True if the slice starts with the provided text, false otherwise.
     */
    function endsWith(slice self, slice needle) internal returns (bool) {
        if (self._len < needle._len) {
            return false;
        }

        var selfptr = self._ptr + self._len - needle._len;

        if (selfptr == needle._ptr) {
            return true;
        }

        bool equal;
        assembly {
            let len := mload(needle)
            let needleptr := mload(add(needle, 0x20))
            equal := eq(sha3(selfptr, len), sha3(needleptr, len))
        }

        return equal;
    }

    /**
     * @dev If `self` ends with `needle`, `needle` is removed from the
     *      end of `self`. Otherwise, `self` is unmodified.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return `self`
     */
    function until(slice self, slice needle) internal returns (slice) {
        if (self._len < needle._len) {
            return self;
        }

        var selfptr = self._ptr + self._len - needle._len;
        bool equal = true;
        if (selfptr != needle._ptr) {
            assembly {
                let len := mload(needle)
                let needleptr := mload(add(needle, 0x20))
                equal := eq(sha3(selfptr, len), sha3(needleptr, len))
            }
        }

        if (equal) {
            self._len -= needle._len;
        }

        return self;
    }

    // Returns the memory address of the first byte of the first occurrence of
    // `needle` in `self`, or the first byte after `self` if not found.
    function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;
        uint idx;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 68 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    let end := add(selfptr, sub(selflen, needlelen))
                    ptr := selfptr
                    loop:
                    jumpi(exit, eq(and(mload(ptr), mask), needledata))
                    ptr := add(ptr, 1)
                    jumpi(loop, lt(sub(ptr, 1), end))
                    ptr := add(selfptr, selflen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr;
                for (idx = 0; idx <= selflen - needlelen; idx++) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr;
                    ptr += 1;
                }
            }
        }
        return selfptr + selflen;
    }

    // Returns the memory address of the first byte after the last occurrence of
    // `needle` in `self`, or the address of `self` if not found.
    function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 69 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    ptr := add(selfptr, sub(selflen, needlelen))
                    loop:
                    jumpi(ret, eq(and(mload(ptr), mask), needledata))
                    ptr := sub(ptr, 1)
                    jumpi(loop, gt(add(ptr, 1), selfptr))
                    ptr := selfptr
                    jump(exit)
                    ret:
                    ptr := add(ptr, needlelen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr + (selflen - needlelen);
                while (ptr >= selfptr) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr + needlelen;
                    ptr -= 1;
                }
            }
        }
        return selfptr;
    }

    /**
     * @dev Modifies `self` to contain everything from the first occurrence of
     *      `needle` to the end of the slice. `self` is set to the empty slice
     *      if `needle` is not found.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function find(slice self, slice needle) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len -= ptr - self._ptr;
        self._ptr = ptr;
        return self;
    }

    /**
     * @dev Modifies `self` to contain the part of the string from the start of
     *      `self` to the end of the first occurrence of `needle`. If `needle`
     *      is not found, `self` is set to the empty slice.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function rfind(slice self, slice needle) internal returns (slice) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len = ptr - self._ptr;
        return self;
    }

    /**
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and `token` to everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function split(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = self._ptr;
        token._len = ptr - self._ptr;
        if (ptr == self._ptr + self._len) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
            self._ptr = ptr + needle._len;
        }
        return token;
    }

    /**
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and returning everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` up to the first occurrence of `delim`.
     */
    function split(slice self, slice needle) internal returns (slice token) {
        split(self, needle, token);
    }

    /**
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and `token` to everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function rsplit(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = ptr;
        token._len = self._len - (ptr - self._ptr);
        if (ptr == self._ptr) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
        }
        return token;
    }

    /**
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and returning everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` after the last occurrence of `delim`.
     */
    function rsplit(slice self, slice needle) internal returns (slice token) {
        rsplit(self, needle, token);
    }

    /**
     * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return The number of occurrences of `needle` found in `self`.
     */
    function count(slice self, slice needle) internal returns (uint count) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len;
        while (ptr <= self._ptr + self._len) {
            count++;
            ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len;
        }
    }

    /**
     * @dev Returns True if `self` contains `needle`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return True if `needle` is found in `self`, false otherwise.
     */
    function contains(slice self, slice needle) internal returns (bool) {
        return rfindPtr(self._len, self._ptr, needle._len, needle._ptr) != self._ptr;
    }

    /**
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice self, slice other) internal returns (string) {
        var ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }

    /**
     * @dev Joins an array of slices, using `self` as a delimiter, returning a
     *      newly allocated string.
     * @param self The delimiter to use.
     * @param parts A list of slices to join.
     * @return A newly allocated string containing all the slices in `parts`,
     *         joined with `self`.
     */
    function join(slice self, slice[] parts) internal returns (string) {
        if (parts.length == 0)
            return "";

        uint len = self._len * (parts.length - 1);
        for(uint i = 0; i < parts.length; i++)
            len += parts[i]._len;

        var ret = new string(len);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        for(i = 0; i < parts.length; i++) {
            memcpy(retptr, parts[i]._ptr, parts[i]._len);
            retptr += parts[i]._len;
            if (i < parts.length - 1) {
                memcpy(retptr, self._ptr, self._len);
                retptr += self._len;
            }
        }

        return ret;
    }
}


contract mortal {
	address owner;

	function mortal() {
		owner = msg.sender;
	}

	function kill() internal {
		suicide(owner);
	}
}

contract Pray4Prey is mortal, usingOraclize {
	using strings
	for * ;

	struct Animal {
		uint8 animalType;
		uint128 value;
		address owner;
	}

	/** array holding ids of the curret animals*/
	uint32[] public ids;
	/** the id to be given to the net animal **/
	uint32 public nextId;
	/** the id of the oldest animal */
	uint32 public oldest;
	/** the animal belonging to a given id */
	mapping(uint32 => Animal) animals;
	/** the cost of each animal type */
	uint128[] public costs;
	/** the value of each animal type (cost - fee), so it's not necessary to compute it each time*/
	uint128[] public values;
	/** the fee to be paid each time an animal is bought in percent*/
	uint8  fee;

	/** total number of animals in the game 
	(!=sum of the lengths of the prey animals arrays, since those arrays contain holes) */
	uint16 public numAnimals;
	/** The maximum of animals allowed in the game */
	uint16 public maxAnimals;
	/** number of animals per type */
	mapping(uint8 => uint16) public numAnimalsXType;


	/** the query string getting the random numbers from oraclize**/
	string  randomQuery;
	/** the type of the oraclize query**/
	string  queryType;
	/** the timestamp of the next attack **/
	uint public nextAttackTimestamp;
	/** gas provided for oraclize callback (attack)**/
	uint32 public oraclizeGas;
	/** the id of the next oraclize callback*/
	bytes32 nextAttackId;


	/** is fired when new animals are purchased (who bought how many animals of which type?) */
	event newPurchase(address player, uint8 animalType, uint8 amount, uint32 startId);
	/** is fired when a player leaves the game */
	event newExit(address player, uint256 totalBalance);
	/** is fired when an attack occures */
	event newAttack(uint32[] killedAnimals);


	/** expected parameters: the costs per animal type and the game fee in percent 
	 *   assumes that the cheapest animal is stored in [0]
	 */
	function Pray4Prey() {
		costs = [100000000000000000,200000000000000000,500000000000000000,1000000000000000000,5000000000000000000];
		fee = 5;
		for (uint8 i = 0; i < costs.length; i++) {
			values.push(costs[i] - costs[i] / 100 * fee);
		}
		maxAnimals = 300;
		randomQuery = "10 random numbers between 1 and 1000";
		queryType = "WolframAlpha";
		oraclizeGas = 400000;
		nextId = 1;
		oldest = 1;
	}

	/** The fallback function runs whenever someone sends ether
	   Depending of the value of the transaction the sender is either granted a prey or 
	   the transaction is discarded and no ether accepted
	   In the first case fees have to be paid*/
	function() payable {
		for (uint8 i = 0; i < costs.length; i++)
			if (msg.value == costs[i])
				addAnimals(i);

		if (msg.value == 1000000000000000)
			exit();
		else
			throw;

	}

	/** buy animals of a given type 
	 *  as many animals as possible are bought with msg.value
	 */
	function addAnimals(uint8 animalType) payable {
		giveAnimals(animalType, msg.sender);
	}
	
	/** buy animals of a given type forsomeone else
	 *  as many animals as possible are bought with msg.value
	 */
	function giveAnimals(uint8 animalType, address receiver) payable {
		uint8 amount = uint8(msg.value / costs[animalType]);
		if (animalType >= costs.length || msg.value < costs[animalType] ||  numAnimals + amount >= maxAnimals) throw;
		//if type exists, enough ether was transferred and there are less than maxAnimals animals in the game
		for (uint8 j = 0; j < amount; j++) {
			addAnimal(animalType, receiver);
		}
		numAnimalsXType[animalType] += amount;
		newPurchase(receiver, animalType, amount, nextId-amount);
	}

	/**
	 *  adds a single animal of the given type
	 */
	function addAnimal(uint8 animalType, address receiver) internal {
		if (numAnimals < ids.length)
			ids[numAnimals] = nextId;
		else
			ids.push(nextId);
		animals[nextId] = Animal(animalType, values[animalType], receiver);
		nextId++;
		numAnimals++;
	}
	


	/** leave the game
	 * pays out the sender's winBalance and removes him and his animals from the game
	 * */
	function exit() {
		uint balance = cleanUp(msg.sender); //delete the animals
		newExit(msg.sender, balance); //fire the event to notify the client
		if (!msg.sender.send(balance)) throw;
	}

	/**
	 * Deletes the animals of a given player
	 * */
	function cleanUp(address playerAddress) internal returns(uint playerBalance){
		uint32 lastId;
		for (uint16 i = 0; i < numAnimals; i++) {
			if (animals[ids[i]].owner == playerAddress) {
				//first delete all animals at the end of the array
				while (numAnimals > 0 && animals[ids[numAnimals - 1]].owner == playerAddress) {
					numAnimals--;
					lastId = ids[numAnimals];
					numAnimalsXType[animals[lastId].animalType]--;
					playerBalance+=animals[lastId].value;
					delete animals[lastId];
				}
				//if the last animal does not belong to the player, replace the players animal by this last one
				if (numAnimals > i + 1) {
				    playerBalance+=animals[ids[i]].value;
					replaceAnimal(i);
				}
			}
		}
	}


	/**
	 * Replaces the animal with the given id with the last animal in the array
	 * */
	function replaceAnimal(uint16 index) internal {
		numAnimalsXType[animals[ids[index]].animalType]--;
		numAnimals--;
		uint32 lastId = ids[numAnimals];
		animals[ids[index]] = animals[lastId];
		ids[index] = lastId;
		delete ids[numAnimals];
	}


	/**
	 * manually triggers the attack. cannot be called afterwards, except
	 * by the owner if and only if the attack wasn't launched as supposed, signifying
	 * an error ocurred during the last invocation of oraclize, or there wasn't enough ether to pay the gas
	 * */
	function triggerAttackManually(uint32 inseconds) {
		if (!(msg.sender == owner && nextAttackTimestamp < now + 300)) throw;
		triggerAttack(inseconds, (oraclizeGas + 10000 * numAnimals));
	}

	/**
	 * sends a query to oraclize in order to get random numbers in 'inseconds' seconds
	 */
	function triggerAttack(uint32 inseconds, uint128 gasAmount) internal {
		nextAttackTimestamp = now + inseconds;
		nextAttackId = oraclize_query(nextAttackTimestamp, queryType, randomQuery, gasAmount );
	}

	/**
	 * The actual predator attack.
	 * The predator kills up to 10 animals, but in case there are less than 100 animals in the game up to 10% get eaten.
	 * */
	function __callback(bytes32 myid, string result) {
		if (msg.sender != oraclize_cbAddress() || myid != nextAttackId) throw; // just to be sure the calling address is the Oraclize authorized one and the callback is the expected one   
		uint128 pot;
		uint16 random;
		uint16 howmany = numAnimals < 100 ? (numAnimals < 10 ? 1 : numAnimals / 10) : 10; //do not kill more than 10%, but at least one
		uint16[] memory randomNumbers = getNumbersFromString(result, ",", howmany);
		uint32[] memory killedAnimals = new uint32[](howmany);
		for (uint8 i = 0; i < howmany; i++) {
			random = mapToNewRange(randomNumbers[i], numAnimals);
			killedAnimals[i] = ids[random];
			pot += killAnimal(random);
		}
		uint128 neededGas = oraclizeGas + 10000*numAnimals;
		uint128 gasCost = uint128(neededGas * tx.gasprice);
		if (pot > gasCost)
			distribute(uint128(pot - gasCost)); //distribute the pot minus the oraclize gas costs
		triggerAttack(timeTillNextAttack(), neededGas);
		newAttack(killedAnimals);
	}

	/**
	 * the frequency of the shark attacks depends on the number of animals in the game. 
	 * many animals -> many shark attacks
	 * at least one attack in 24 hours
	 * */
	function timeTillNextAttack() constant internal returns(uint32) {
		return (86400 / (1 + numAnimals / 100));
	}


	/**
	 * kills the animal of the given type at the given index. 
	 * */
	function killAnimal(uint16 index) internal returns(uint128 animalValue) {
		animalValue = animals[ids[index]].value;
		replaceAnimal(index);
		if (ids[index] == oldest)
			oldest = 0;
	}

	/**
	 * finds the oldest animal
	 * */
	function findOldest() internal returns(uint128 animalValue) {
		oldest = ids[0];
		for (uint16 i = 1; i < numAnimals; i++){
			if(ids[i] < oldest)//the oldest animal has the lowest id
				oldest = ids[i];
		}
	}


	/** distributes the given amount among the surviving fishes*/
	function distribute(uint128 totalAmount) internal {
		//pay 10% to the oldest fish
		if (oldest == 0)
			findOldest();
		animals[oldest].value += totalAmount / 10;
		uint128 amount = totalAmount / 10 * 9;
		//distribute the rest according to their type
		uint128 valueSum;
		uint128[] memory shares = new uint128[](values.length);
		for (uint8 v = 0; v < values.length; v++) {
			if (numAnimalsXType[v] > 0) valueSum += values[v];
		}
		for (uint8 m = 0; m < values.length; m++) {
		    if(numAnimalsXType[m] > 0)
			    shares[m] =  amount * values[m] / valueSum / numAnimalsXType[m];
		}
		for (uint16 i = 0; i < numAnimals; i++) {
			animals[ids[i]].value += shares[animals[ids[i]].animalType];
		}

	}

	/**
	 * allows the owner to collect the accumulated fees
	 * sends the given amount to the owner's address if the amount does not exceed the
	 * fees (cannot touch the players' balances) minus 100 finney (ensure that oraclize fees can be paid)
	 * */
	function collectFees(uint128 amount) {
		if (!(msg.sender == owner)) throw;
		uint collectedFees = getFees();
		if (amount + 100 finney < collectedFees) {
			if (!owner.send(amount)) throw;
		}
	}

	/**
	 * pays out the players and kills the game.
	 * */
	function stop() {
		if (!(msg.sender == owner)) throw;
		for (uint16 i = 0; i < numAnimals; i++) {
			animals[ids[i]].owner.send(animals[ids[i]].value);
		}
		kill();
	}

	/**
	 * adds a new animal type to the game
	 * max. number of animal types: 100
	 * the cost may not be lower than costs[0]
	 * */
	function addAnimalType(uint128 cost) {
		if (!(msg.sender == owner)) throw;
		costs.push(cost);
		values.push(cost / 100 * fee);
	}

	function sellAnimal(uint32 animalId){
        if(msg.sender!=animals[animalId].owner) throw;
        uint128 val = animals[animalId].value;
        uint16 animalIndex;
        for(uint16 i = 0; i < ids.length; i++){
            if(ids[i]==animalId){
                animalIndex = i;
                break;
            }
        }
        replaceAnimal(animalIndex);
        if(!msg.sender.send(val)) throw;
    }

	/****************** GETTERS *************************/


	function getPlayerBalance(address playerAddress) constant returns(uint128 playerBalance) {
		for (uint16 i = 0; i < numAnimals; i++) {
			if (animals[ids[i]].owner == playerAddress) playerBalance += animals[ids[i]].value;
		}
	}
	
	function getAnimal(uint32 animalId) constant returns(uint8, uint128, address){
		return (animals[animalId].animalType,animals[animalId].value,animals[animalId].owner);
	}
	
	function get10Animals(uint16 startIndex) constant returns(uint32[10] animalIds, uint8[10] types, uint128[10] values, address[10] owners) {
		uint16 endIndex= startIndex+10 > numAnimals? numAnimals: startIndex+10;
		uint8 j = 0;
		uint32 id;
		for (uint16 i = startIndex; i < endIndex; i++){
			id=ids[i];
			animalIds[j] = id;
			types[j] = animals[id].animalType;
			values[j] = animals[id].value;
			owners[j] = animals[id].owner;
			j++;
		}
		
	}
	

	function getFees() constant returns(uint) {
		uint reserved = 0;
		for (uint16 j = 0; j < numAnimals; j++)
			reserved += animals[ids[j]].value;
		return address(this).balance - reserved;
	}


	/****************** SETTERS *************************/

	function setOraclizeGas(uint32 newGas) {
		if (!(msg.sender == owner)) throw;
		oraclizeGas = newGas;
	}

	function setMaxAnimals(uint16 number) {
		if (!(msg.sender == owner)) throw;
		maxAnimals = number;
	}


	/************* HELPERS ****************/

	/**
	 * maps a given number to the new range (old range 1000)
	 * */
	function mapToNewRange(uint number, uint range) constant internal returns(uint16 randomNumber) {
		return uint16(number * range / 1000);
	}

	/**
	 * converts a string of numbers being separated by a given delimiter into an array of numbers (#howmany) 
	 */
	function getNumbersFromString(string s, string delimiter, uint16 howmany) constant internal returns(uint16[] numbers) {
		strings.slice memory myresult = s.toSlice();
		strings.slice memory delim = delimiter.toSlice();
		numbers = new uint16[](howmany);
		for (uint8 i = 0; i < howmany; i++) {
			numbers[i] = uint16(parseInt(myresult.split(delim).toString()));
		}
		return numbers;
	}

}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"animalId","type":"uint32"}],"name":"sellAnimal","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"inseconds","type":"uint32"}],"name":"triggerAttackManually","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"numAnimalsXType","outputs":[{"name":"","type":"uint16"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"numAnimals","outputs":[{"name":"","type":"uint16"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint128"}],"name":"collectFees","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"animalId","type":"uint32"}],"name":"getAnimal","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint128"},{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oldest","outputs":[{"name":"","type":"uint32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oraclizeGas","outputs":[{"name":"","type":"uint32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"animalType","type":"uint8"}],"name":"addAnimals","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"costs","outputs":[{"name":"","type":"uint128"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"startIndex","type":"uint16"}],"name":"get10Animals","outputs":[{"name":"animalIds","type":"uint32[10]"},{"name":"types","type":"uint8[10]"},{"name":"values","type":"uint128[10]"},{"name":"owners","type":"address[10]"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"values","outputs":[{"name":"","type":"uint128"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"nextId","outputs":[{"name":"","type":"uint32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"cost","type":"uint128"}],"name":"addAnimalType","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newGas","type":"uint32"}],"name":"setOraclizeGas","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint16"}],"name":"setMaxAnimals","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maxAnimals","outputs":[{"name":"","type":"uint16"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"animalType","type":"uint8"},{"name":"receiver","type":"address"}],"name":"giveAnimals","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"getFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"playerAddress","type":"address"}],"name":"getPlayerBalance","outputs":[{"name":"playerBalance","type":"uint128"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"nextAttackTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ids","outputs":[{"name":"","type":"uint32"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"animalType","type":"uint8"},{"indexed":false,"name":"amount","type":"uint8"},{"indexed":false,"name":"startId","type":"uint32"}],"name":"newPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"totalBalance","type":"uint256"}],"name":"newExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"killedAnimals","type":"uint32[]"}],"name":"newAttack","type":"event"}]

  Contract Creation Code Switch To Opcodes View
606060405234156200000d57fe5b5b60005b60008054600160a060020a03191633600160a060020a03161790555b6040805160a08101825267016345785d8a000081526702c68af0bb14000060208201526706f05b59d3b2000091810191909152670de0b6b3a76400006060820152674563918244f4000060808201526200008c906006906005620002ac565b50506008805460ff1916600517905560005b60065460ff82161015620001a4576007805460018101620000c083826200036b565b91600052602060002090600291828204019190066010025b6008546006805460ff9283169260649291908816908110620000f657fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a03166001608060020a03168115156200013357fe5b040260068560ff168154811015156200014857fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a031603909190916101000a8154816001608060020a0302191690836001608060020a03160217905550505b6001016200009e565b6008805464ffff000000191664012c0000001790556040805160608101825260248082527f31302072616e646f6d206e756d62657273206265747765656e203120616e6420602083019081527f313030300000000000000000000000000000000000000000000000000000000092909301919091526200022791600a91620003a8565b5060408051808201909152600c8082527f576f6c6672616d416c706861000000000000000000000000000000000000000060209092019182526200026e91600b91620003a8565b50600d805463ffffffff1990811662061a80179091556004805467ffffffff00000000199216600117919091166401000000001790555b5062000480565b82805482825590600052602060002090600101600290048101928215620003595791602002820160005b838211156200032257835183826101000a8154816001608060020a0302191690836001604060020a031602179055509260200192601001602081600f01049283019260010302620002d6565b8015620003575782816101000a8154906001608060020a030219169055601001602081600f0104928301926001030262000322565b505b50620003679291506200042e565b5090565b815481835581811511620003a2576001016002900481600101600290048360005260206000209182019101620003a291906200045c565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003eb57805160ff19168380011785556200041b565b828001600101855582156200041b579182015b828111156200041b578251825591602001919060010190620003fe565b5b50620003679291506200045c565b5090565b6200045991905b80821115620003675780546001608060020a031916815560010162000435565b5090565b90565b6200045991905b8082111562000367576000815560010162000463565b5090565b90565b612e5980620004906000396000f300606060405236156101375763ffffffff60e060020a6000350416625b9b4881146101d057806307da68f5146101eb5780631402f031146101fd5780631e461e1714610218578063261959011461024557806327dc297e1461026c57806328acb002146102c557806337f9034d146102e357806338bbfa501461032f5780633c3c22b3146103c55780633e9836c6146103ee5780633ff8c9541461041757806349b3b29f146104275780634f3fd173146104565780635e383d211461054157806361b8ce8c146105705780636468c0991461059957806389ed0b30146105b75780639ead1478146105d2578063c49fef66146105eb578063cfe8c53514610612578063db8d55f11461062e578063e2734c9314610650578063e9fad8ee14610688578063f6b098f81461069a578063fac333ac146106bc575b6101ce5b60005b60065460ff821610156101a9576006805460ff831690811061015c57fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a03166001608060020a031634141561019f5761019f816106e8565b5b5b60010161013e565b3466038d7ea4c6800014156101c5576101c06106f6565b6101ca565b610000565b5b50565b005b34156101d857fe5b6101ce63ffffffff6004351661077c565b005b34156101f357fe5b6101ce61088d565b005b341561020557fe5b6101ce63ffffffff600435166109b6565b005b341561022057fe5b61022e60ff60043516610a14565b6040805161ffff9092168252519081900360200190f35b341561024d57fe5b61022e610a2a565b6040805161ffff9092168252519081900360200190f35b341561027457fe5b60408051602060046024803582810135601f81018590048502860185019096528585526101ce9583359593946044949392909201918190840183828082843750949650610a3995505050505050565b005b34156102cd57fe5b6101ce6001608060020a0360043516610ce0565b005b34156102eb57fe5b6102fc63ffffffff60043516610d64565b6040805160ff90941684526001608060020a039092166020840152600160a060020a031682820152519081900360600190f35b341561033757fe5b60408051602060046024803582810135601f81018590048502860185019096528585526101ce958335959394604494939290920191819084018382808284375050604080516020601f89358b01803591820183900483028401830190945280835297999881019791965091820194509250829150840183828082843750949650610da695505050505050565b005b34156103cd57fe5b6103d5610dac565b6040805163ffffffff9092168252519081900360200190f35b34156103f657fe5b6103d5610dc0565b6040805163ffffffff9092168252519081900360200190f35b6101ce60ff600435166106e8565b005b341561042f57fe5b61043a600435610dcc565b604080516001608060020a039092168252519081900360200190f35b341561045e57fe5b61046d61ffff60043516610e08565b60405180856101408083835b80518252602083111561049957601f199092019160209182019101610479565b505050919091019050846101408083835b8051825260208311156104ca57601f1990920191602091820191016104aa565b505050919091019050836101408083835b8051825260208311156104fb57601f1990920191602091820191016104db565b505050919091019050826101408083835b80518252602083111561052c57601f19909201916020918201910161050c565b50505090500194505050505060405180910390f35b341561054957fe5b61043a600435610fc3565b604080516001608060020a039092168252519081900360200190f35b341561057857fe5b6103d5610fff565b6040805163ffffffff9092168252519081900360200190f35b34156105a157fe5b6101ce6001608060020a036004351661100b565b005b34156105bf57fe5b6101ce63ffffffff600435166110d9565b005b34156105da57fe5b6101ce61ffff6004351661110d565b005b34156105f357fe5b61022e611146565b6040805161ffff9092168252519081900360200190f35b6101ce60ff60043516600160a060020a0360243516611157565b005b341561063657fe5b61063e6112ee565b60408051918252519081900360200190f35b341561065857fe5b61043a600160a060020a0360043516611387565b604080516001608060020a039092168252519081900360200190f35b341561069057fe5b6101ce6106f6565b005b34156106a257fe5b61063e61147f565b60408051918252519081900360200190f35b34156106c457fe5b6103d5600435611485565b6040805163ffffffff9092168252519081900360200190f35b6101ca8133611157565b5b50565b6000610701336114be565b60408051600160a060020a03331681526020810183905281519293507f313c40939ea55b1e0d953726a58438e52664c3dcda25b209f6de87d741e7ebb6929081900390910190a1604051600160a060020a0333169082156108fc029083906000818181858888f1935050505015156101ca57610000565b5b50565b63ffffffff81166000908152600560205260408120600101548190819033600160a060020a039081169116146107b157610000565b5063ffffffff831660009081526005602052604081205461010090046001608060020a031692505b60035461ffff82161015610845578363ffffffff1660038261ffff1681548110151561080157fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff1663ffffffff16141561083c57809150610845565b5b6001016107d9565b61084e82611759565b604051600160a060020a033316906001608060020a03851680156108fc02916000818181858888f19350505050151561088657610000565b5b50505050565b6000805433600160a060020a039081169116146108a957610000565b5060005b60085461ffff610100909104811690821610156109aa576005600060038361ffff168154811015156108db57fe5b90600052602060002090600891828204019190066004025b905463ffffffff6101009290920a9004168152602081019190915260400160009081206001015460038054600160a060020a03909216926108fc926005929061ffff871690811061094057fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff168252602082019290925260409081016000908120549151929091046001608060020a0316801593909302929190818181858888f150505050505b6001016108ad565b6101ca611997565b5b50565b60005433600160a060020a0390811691161480156109d957504261012c01600c54105b15156109e457610000565b600854600d546101ca91839161010090910461ffff908116612710021663ffffffff91821601166119a7565b5b50565b60096020526000908152604090205461ffff1681565b600854610100900461ffff1681565b600060006000610a47612c7f565b610a4f612c7f565b600060006000610a5d611aed565b600160a060020a031633600160a060020a0316141580610a7f5750600e548a14155b15610a8957610000565b600854606461010090910461ffff1610610aa457600a610ad1565b600854600a61010090910461ffff1610610ace57600854600a90610100900461ffff165b04610ad1565b60015b5b9550610b1589604060405190810160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525088611c01565b94508561ffff16604051805910610b295750595b908082528060200260200182016040525b509350600092505b8561ffff168360ff161015610bff57610b85858460ff16815181101515610b6557fe5b6020908102909101015160085461ffff9182169161010090910416611cc2565b965060038761ffff16815481101515610b9a57fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff16848460ff16815181101515610bd257fe5b63ffffffff909216602092830290910190910152610bef87611cd5565b880197505b600190920191610b42565b5050600854600d5461010090910461ffff908116612710021663ffffffff91821601163a81026001608060020a038082169089161115610c4457610c44818903611dac565b5b610c56610c506120e9565b836119a7565b60408051602080825286518183015286517f95217ec91f01e5519421b0a0dd9b060ef9b628dc77798b96c36521854d82d20d9388939283929183019181860191028083838215610cc1575b805182526020831115610cc157601f199092019160209182019101610ca1565b5050509050019250505060405180910390a15b50505050505050505050565b6000805433600160a060020a03908116911614610cfc57610000565b610d046112ee565b9050808267016345785d8a0000016001608060020a03161015610d5e5760008054604051600160a060020a03909116916001608060020a03851680156108fc02929091818181858888f193505050501515610d5e57610000565b5b5b5050565b63ffffffff81166000908152600560205260409020805460019091015460ff82169161010090046001608060020a031690600160a060020a03165b9193909250565b5b505050565b600454640100000000900463ffffffff1681565b600d5463ffffffff1681565b6006805482908110610dda57fe5b90600052602060002090600291828204019190066010025b915054906101000a90046001608060020a031681565b610e10612ca3565b610e18612ca3565b610e20612ca3565b610e28612ca3565b6000600060006000600860019054906101000a900461ffff1661ffff1689600a0161ffff1611610e5b5788600a01610e68565b600854610100900461ffff165b9350600092508890505b8361ffff168161ffff161015610fb7576003805461ffff8316908110610e9457fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff16915081888460ff16600a81101515610ecf57fe5b63ffffffff9283166020918202929092019190915290831660009081526005909152604090205460ff9081169088908516600a8110610f0a57fe5b60ff9283166020918202929092019190915263ffffffff841660009081526005909152604090205461010090046001608060020a03169087908516600a8110610f4f57fe5b6001608060020a039092166020928302919091015263ffffffff8316600090815260059091526040902060010154600160a060020a03168560ff8516600a8110610f9557fe5b600160a060020a0390921660209290920201526001909201915b600101610e72565b5b505050509193509193565b6007805482908110610dda57fe5b90600052602060002090600291828204019190066010025b915054906101000a90046001608060020a031681565b60045463ffffffff1681565b60005433600160a060020a0390811691161461102657610000565b60068054600181016110388382612d4b565b91600052602060002090600291828204019190066010025b81546001608060020a038086166101009390930a928302920219161790555060078054600181016110818382612d4b565b91600052602060002090600291828204019190066010025b60085460ff1660646001608060020a0386165b0402909190916101000a8154816001608060020a0302191690836001608060020a03160217905550505b50565b60005433600160a060020a039081169116146110f457610000565b600d805463ffffffff191663ffffffff83161790555b50565b60005433600160a060020a0390811691161461112857610000565b6008805464ffff0000001916630100000061ffff8416021790555b50565b6008546301000000900461ffff1681565b6000600060068460ff1681548110151561116d57fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a03166001608060020a0316348115156111aa57fe5b600654919004925060ff851610158061120557506006805460ff86169081106111cf57fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a03166001608060020a031634105b8061122b575060085461ffff630100000082048116610100909204811660ff8516011610155b1561123557610000565b5060005b8160ff168160ff16101561125a57611251848461211d565b5b600101611239565b60ff848116600081815260096020908152604091829020805461ffff8082169689169687011661ffff199091161790556004548251600160a060020a03891681529182019390935280820184905263ffffffff928316939093039091166060830152517faa7f6a618db3cb76bca4d47310fbd06ad8b2497046377d4e4404ce26aa7d8e9d9181900360800190a15b50505050565b600080805b60085461ffff61010090910481169082161015611372576005600060038361ffff1681548110151561132157fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff168252602082019290925260400160002054046001608060020a031691909101905b6001016112f3565b8130600160a060020a0316310392505b505090565b6000805b60085461ffff610100909104811690821610156114785782600160a060020a03166005600060038461ffff168154811015156113c357fe5b90600052602060002090600891828204019190066004025b905463ffffffff6101009290920a9004168152602081019190915260400160002060010154600160a060020a0316141561146f576005600060038361ffff1681548110151561142657fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff168252602082019290925260400160002054046001608060020a031691909101905b5b60010161138b565b5b50919050565b600c5481565b600380548290811061149357fe5b90600052602060002090600891828204019190066004025b915054906101000a900463ffffffff1681565b600080805b60085461ffff610100909104811690821610156117515783600160a060020a03166005600060038461ffff168154811015156114fb57fe5b90600052602060002090600891828204019190066004025b905463ffffffff6101009290920a9004168152602081019190915260400160002060010154600160a060020a03161415611746575b600854600061010090910461ffff161180156115db575083600160a060020a03166005600060036001600860019054906101000a900461ffff160361ffff1681548110151561159357fe5b90600052602060002090600891828204019190066004025b905463ffffffff6101009290920a9004168152602081019190915260400160002060010154600160a060020a0316145b156116c5576008805462ffff001981166101009182900461ffff90811660001901811683029190911792839055600380549093929092041690811061161c57fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff166000818152600560208181526040808420805460ff16855260098352908420805461ffff19811661ffff918216600019019091161790559284905252805470ffffffffffffffffffffffffffffffffff198116825560019091018054600160a060020a0319169055919091046001608060020a031693909301929150611548565b60085461ffff600183018116610100909204161115611746576005600060038361ffff168154811015156116f557fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff168252602082019290925260400160002054046001608060020a0316929092019161174681611759565b5b5b5b6001016114c3565b5b5050919050565b6000600960006005600060038661ffff1681548110151561177657fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff168252602080830193909352604091820160009081205460ff16855292840194909452919091019020805461ffff19811661ffff9182166000199081018316919091179092556008805462ffff001981169085900483169093018216840292909217918290556003805490939092041690811061181657fe5b90600052602060002090600891828204019190066004025b905463ffffffff6101009290920a9004166000818152600560208190526040822060038054949550909391929161ffff871690811061186957fe5b90600052602060002090600891828204019190066004025b905463ffffffff61010092830a90910416825260208201929092526040016000208254815460ff191660ff9091161780825583546001608060020a039084900416909202610100608860020a031990921691909117815560019182015491018054600160a060020a031916600160a060020a039092169190911790556003805482919061ffff851690811061191257fe5b90600052602060002090600891828204019190066004025b6101000a81548163ffffffff021916908363ffffffff1602179055506003600860019054906101000a900461ffff1661ffff1681548110151561196957fe5b90600052602060002090600891828204019190066004025b6101000a81549063ffffffff02191690555b5050565b600054600160a060020a0316ff5b565b4263ffffffff831601600c819055600b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611ae5949390929091830182828015611a435780601f10611a1857610100808354040283529160200191611a43565b820191906000526020600020905b815481529060010190602001808311611a2657829003601f168201915b5050600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815295509193509150830182828015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b5050505050846001608060020a03166122e6565b600e555b5050565b600154600090600160a060020a03161515611b0e57611b0c6000612605565b505b6001546040805160006020918201819052825160e060020a6338cc48310281529251600160a060020a03909416936338cc48319360048082019493918390030190829087803b1515611b5c57fe5b60325a03f11515611b6957fe5b505060408051805160028054600160a060020a031916600160a060020a0392831617908190556000602093840181905284517fc281d19e000000000000000000000000000000000000000000000000000000008152945191909216945063c281d19e9360048082019493918390030190829087803b1515611be657fe5b60325a03f11515611bf357fe5b5050604051519150505b5b90565b611c09612c7f565b611c11612d85565b611c19612d85565b6000611c24876127a5565b9250611c2f866127a5565b91508461ffff16604051805910611c435750595b908082528060200260200182016040525b509350600090505b8461ffff168160ff161015611cb757611c8b611c86611c81858563ffffffff6127ce16565b6127e9565b612845565b848260ff16815181101515611c9c57fe5b61ffff9092166020928302909101909101525b600101611c5c565b5b5050509392505050565b60006103e88383025b0490505b92915050565b60006005600060038461ffff16815481101515611cee57fe5b90600052602060002090600891828204019190066004025b905461010091820a900463ffffffff168252602082019290925260400160002054046001608060020a03169050611d3c82611759565b6004546003805464010000000090920463ffffffff169161ffff8516908110611d6157fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff1663ffffffff161415611da6576004805467ffffffff00000000191690555b5b919050565b60006000611db8612c7f565b60045460009081908190640100000000900463ffffffff161515611de057611dde61285a565b505b600a6001608060020a0388165b60045463ffffffff64010000000090910416600090815260056020526040902080546001608060020a03610100808304821695909404949094018416909202610100608860020a0319909216919091179055600a9088165b046009029550600780549050604051805910611e5e5750595b908082528060200260200182016040525b509350600092505b60075460ff84161015611eed5760ff831660009081526009602052604081205461ffff161115611ee1576007805460ff8516908110611eb257fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a0316850194505b5b600190920191611e77565b600091505b60075460ff83161015611fd45760ff821660009081526009602052604081205461ffff161115611fc85760ff82166000818152600960205260409020546007805461ffff909216926001608060020a038916928110611f4d57fe5b90600052602060002090600291828204019190066010025b9054906101000a90046001608060020a031688026001608060020a0316811515611f8b57fe5b046001608060020a0316811515611f9e57fe5b04848360ff16815181101515611fb057fe5b6001608060020a039092166020928302909101909101525b5b600190910190611ef2565b5060005b60085461ffff610100909104811690821610156120df57836005600060038461ffff1681548110151561200757fe5b90600052602060002090600891828204019190066004025b905463ffffffff6101009290920a9004168152602081019190915260400160002054815160ff90911690811061205157fe5b906020019060200201516005600060038461ffff1681548110151561207257fe5b90600052602060002090600891828204019190066004025b905463ffffffff61010092830a909104168252602082019290925260400160002080546001608060020a038382048116909401909316909102610100608860020a03199092169190911790555b600101611fd8565b5b50505050505050565b600854600090606490610100900461ffff165b0460010161ffff166201518081151561211157fe5b0462ffffff1690505b90565b600354600854610100900461ffff161015612192576004546008546003805463ffffffff909316929091610100900461ffff1690811061215957fe5b90600052602060002090600891828204019190066004025b6101000a81548163ffffffff021916908363ffffffff1602179055506121dd565b60038054600181016121a48382612dae565b91600052602060002090600891828204019190066004025b60045482546101009290920a63ffffffff9182168102910219909116179055505b604080516060810190915260ff831680825260078054602084019290811061220157fe5b90600052602060002090600291828204019190066010025b905461010091820a90046001608060020a039081168352600160a060020a038581166020948501526004805463ffffffff90811660009081526005875260409081902088518154988a015160ff1990991660ff90911617610100608860020a031916979095168602969096178455959094015160019283018054600160a060020a03191691909216179055825463ffffffff1981169085168201909416939093179091556008805462ffff001981169083900461ffff9081169094019093169091029190911790555b5050565b6001546000908190600160a060020a03161515612309576123076000612605565b505b6001546040805160006020918201819052825160e060020a6338cc48310281529251600160a060020a03909416936338cc48319360048082019493918390030190829087803b151561235757fe5b60325a03f1151561236457fe5b505060408051805160028054600160a060020a031916600160a060020a039283161790819055600060209384015283517f2ef3accc00000000000000000000000000000000000000000000000000000000815260248101899052600481019485528a5160448201528a51919092169450632ef3accc938a93899391928392606401918601908083838215612413575b80518252602083111561241357601f1990920191602091820191016123f3565b505050905090810190601f16801561243f5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151561245b57fe5b60325a03f1151561246857fe5b505060405151915050670de0b6b3a76400003a84020181111561248e57600091506125fb565b600260009054906101000a9004600160a060020a0316600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff1660e060020a02815260040180858152602001806020018060200184815260200183810383528681815181526020019150805190602001908083836000831461252d575b80518252602083111561252d57601f19909201916020918201910161250d565b505050905090810190601f1680156125595780820380516001836020036101000a031916815260200191505b5083810382528551815285516020918201918701908083838215612598575b80518252602083111561259857601f199092019160209182019101612578565b505050905090810190601f1680156125c45780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b15156125e257fe5b61235a5a03f115156125f057fe5b505060405151935050505b5b50949350505050565b60006000612626731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed612991565b1115612658575060018054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed178155611da6565b600061267773c03a2615d5efaf5f49f60b7bb6583eaec212fdf1612991565b11156126a9575060018054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf1178155611da6565b60006126c87320e12a1f859b3feae5fb2a0a32c18f5a65555bbf612991565b11156126fa575060018054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf178155611da6565b60006127197393bbbe5ce77034e3095f0479919962a903f898ad612991565b111561274b575060018054600160a060020a0319167393bbbe5ce77034e3095f0479919962a903f898ad178155611da6565b600061276a7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa612991565b111561279c575060018054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa178155611da6565b5060005b919050565b6127ad612d85565b50604080518082019091528151815260208281019082018190525b50919050565b6127d6612d85565b6127e1838383612999565b505b92915050565b6127f1612c7f565b6127f9612c7f565b6000836000015160405180591061280d5750595b908082528060200260200182016040525b50915060208201905061283a8185602001518660000151612a0d565b8192505b5050919050565b6000612852826000612a56565b90505b919050565b600060006003600081548110151561286e57fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff16600460046101000a81548163ffffffff021916908363ffffffff160217905550600190505b60085461ffff6101009091048116908216101561298c576004546003805464010000000090920463ffffffff169161ffff84169081106128f657fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff1663ffffffff161015612983576003805461ffff831690811061293b57fe5b90600052602060002090600891828204019190066004025b9054906101000a900463ffffffff16600460046101000a81548163ffffffff021916908363ffffffff1602179055505b5b6001016128ba565b5b5090565b803b5b919050565b6129a1612d85565b60006129bf8560000151866020015186600001518760200151612bd8565b602080870180519186019190915280518203855286519051919250018114156129eb5760008552612a01565b8351835186519101900385528351810160208601525b8291505b509392505050565b60005b60208210612a325782518452602093840193909201915b602082039150612a10565b6001826020036101000a039050801983511681855116818117865250505b50505050565b6000612a60612c7f565b5082600080805b8351811015612bb85783517f300000000000000000000000000000000000000000000000000000000000000090859083908110612aa057fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015612b16575083517f390000000000000000000000000000000000000000000000000000000000000090859083908110612af657fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b15612b70578115612b3557851515612b2d57612bb8565b600019909501945b5b600a8302925060308482815181101515612b4c57fe5b90602001015160f860020a900460f860020a0260f860020a90040383019250612bae565b8381815181101515612b7e57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602e60f860020a021415612bae57600191505b5b5b600101612a67565b6000861115612bca5785600a0a830292505b8294505b5050505092915050565b600080808080888711612c6b5760208711612c2f5760018760200360080260020a031980875116888b038a018a96505b818388511614612c24576001870196819010612c08578b8b0196505b505050839450612c73565b8686209150879350600092505b8689038311612c6b575085832081811415612c5957839450612c73565b6001840193505b600190920191612c3c565b5b5b88880194505b50505050949350505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b61014060405190810160405280600a905b600081526000199091019060200181612cb45790505090565b61014060405190810160405280600a905b600081526000199091019060200181612cb45790505090565b61014060405190810160405280600a905b600081526000199091019060200181612cb45790505090565b61014060405190810160405280600a905b600081526000199091019060200181612cb45790505090565b815481835581811511610da6576001016002900481600101600290048360005260206000209182019101610da69190612e0c565b5b505050565b604080518082019091526000808252602082015290565b60408051602081019091526000815290565b815481835581811511610da6576007016008900481600701600890048360005260206000209182019101610da69190612e0c565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b611bfd91905b8082111561298c5760008155600101612e12565b5090565b905600a165627a7a72305820442b2c9e56c74644db00ee23edf73b5ca6389e279110cbc82f4b5e8bede706ef0029

   Swarm Source:
bzzr://442b2c9e56c74644db00ee23edf73b5ca6389e279110cbc82f4b5e8bede706ef
View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.