Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|
0x315e84d3e760d3bad495c4830d4a27da660731a368684c3fd288f37418f74b3f | 5470222 | 1047 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.00224436 | |
0x650e9afe5b8b72d67ab0724351b80c8ac9e76c2a8820321940e7df2e97cdbffd | 5470222 | 1047 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.0017439 | |
0x7bc09f0ea7316b5aaaf757968dd25f31871a8fba586a585eb6a6ef6b9758c4b8 | 5470222 | 1047 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.00171946 | |
0x60858f04ff4e2746049d4c622a5fa8b8474ff85aa5bebb37a3c6ac5ac0bb3402 | 5470222 | 1047 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.00184904 | |
0xc35b25ea0805110a4d3e00cacb0613c281f634e933a9e44c7d8ce1132d324263 | 5470222 | 1047 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.0018498 | |
0xba8ac7c286e8d393a1577f241e40940b03b8b708f1cbb95e2f3e1c41108ed096 | 5464454 | 1048 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.0016192 | |
0xf51b6745e88371ff7fbc4962ba94b753b4994b01b0cf0af232236b3c8f7e4081 | 5464453 | 1048 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.00161996 | |
0x1a4bdf4f40b33bd6504c541d23d72b46fac0d33521d95e2f1a50f41a96963f08 | 5464451 | 1048 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.0016192 | |
0x9dd5f037aa440e9c50847dcf11198177d34470602eed92b06201314b1d257f54 | 5464451 | 1048 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.00159476 | |
0xe60dd36f905cac63f7ebc9dd57e8a207bf76948df0f1b4230085af55c2b6fa27 | 5464448 | 1048 days 6 hrs ago | Oraclize | IN | 0xa1f58f081c67dfd9ef93955c06877cbf357b5c56 | 0 Ether | 0.0016192 |
[ Download CSV Export ]
Latest 13 internal transactions
[ Download CSV Export ]
Contract Name:
DogRace
Compiler Version
v0.4.19+commit.c4cbbb05
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-04-17 */ pragma solidity ^0.4.19; // File: contracts/SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } // File: contracts/oraclizeLib.sol // <ORACLIZE_API_LIB> /* 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; 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 setProofType(byte _proofType); function setConfig(bytes32 _config); function setCustomGasPrice(uint _gasPrice); } contract OraclizeAddrResolverI { function getAddress() returns (address _addr); } library oraclizeLib { //byte constant internal proofType_NONE = 0x00; function proofType_NONE() constant returns (byte) { return 0x00; } //byte constant internal proofType_TLSNotary = 0x10; function proofType_TLSNotary() constant returns (byte) { return 0x10; } //byte constant internal proofStorage_IPFS = 0x01; function proofStorage_IPFS() constant returns (byte) { return 0x01; } // *******TRUFFLE + BRIDGE********* //OraclizeAddrResolverI constant public OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475); // *****REALNET DEPLOYMENT****** OraclizeAddrResolverI constant public OAR = oraclize_setNetwork(); // constant means dont store and re-eval on each call function getOAR() constant returns (OraclizeAddrResolverI) { return OAR; } OraclizeI constant public oraclize = OraclizeI(OAR.getAddress()); function getCON() constant returns (OraclizeI) { return oraclize; } function oraclize_setNetwork() public returns(OraclizeAddrResolverI){ if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet return OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed); } if (getCodeSize(0xb9b00A7aE2e1D3557d7Ec7e0633e25739A6B510e)>0) { // ropsten custom ethereum bridge return OraclizeAddrResolverI(0xb9b00A7aE2e1D3557d7Ec7e0633e25739A6B510e); } if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet return OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1); } if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet return OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e); } if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet return OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48); } if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge return OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475); } if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide return OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF); } if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity return OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA); } } function oraclize_getPrice(string datasource) public returns (uint){ return oraclize.getPrice(datasource); } function oraclize_getPrice(string datasource, uint gaslimit) public returns (uint){ return oraclize.getPrice(datasource, gaslimit); } function oraclize_query(string datasource, string arg) public returns (bytes32 id){ return oraclize_query(0, datasource, arg); } function oraclize_query(uint timestamp, string datasource, string arg) public 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(string datasource, string arg, uint gaslimit) public returns (bytes32 id){ return oraclize_query(0, datasource, arg, gaslimit); } function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) public 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 arg1, string arg2) public returns (bytes32 id){ return oraclize_query(0, datasource, arg1, arg2); } function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) public 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(string datasource, string arg1, string arg2, uint gaslimit) public returns (bytes32 id){ return oraclize_query(0, datasource, arg1, arg2, gaslimit); } function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) public 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[] argN) internal returns (bytes32 id){ return oraclize_query(0, datasource, argN); } function oraclize_query(uint timestamp, string datasource, string[] argN) 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(string datasource, string[] argN, uint gaslimit) internal returns (bytes32 id){ return oraclize_query(0, datasource, argN, gaslimit); } function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) 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_cbAddress() public constant returns (address){ return oraclize.cbAddress(); } function oraclize_setProof(byte proofP) public { return oraclize.setProofType(proofP); } function oraclize_setCustomGasPrice(uint gasPrice) public { return oraclize.setCustomGasPrice(gasPrice); } function oraclize_setConfig(bytes32 config) public { return oraclize.setConfig(config); } function getCodeSize(address _addr) public returns(uint _size) { assembly { _size := extcodesize(_addr) } } function parseAddr(string _a) public returns (address){ bytes memory tmp = bytes(_a); uint160 iaddr = 0; uint160 b1; uint160 b2; for (uint i=2; i<2+2*20; i+=2){ iaddr *= 256; b1 = uint160(tmp[i]); b2 = uint160(tmp[i+1]); if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87; else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55; else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48; if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87; else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55; else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48; iaddr += (b1*16+b2); } return address(iaddr); } function strCompare(string _a, string _b) public 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) public 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) public constant returns (uint) { return parseInt(_a, 0); } // parseInt(parseFloat*10^_b) function parseInt(string _a, uint _b) public constant returns (uint) { bytes memory bresult = bytes(_a); uint mint = 0; bool decimals = false; for (uint i=0; i<bresult.length; i++){ if ((bresult[i] >= 48)&&(bresult[i] <= 57)){ if (decimals){ if (_b == 0) break; else _b--; } mint *= 10; mint += uint(bresult[i]) - 48; } else if (bresult[i] == 46) decimals = true; } if (_b > 0) mint *= 10**_b; return mint; } function uint2str(uint i) internal returns (string){ if (i == 0) return "0"; uint j = i; uint len; while (j != 0){ len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (i != 0){ bstr[k--] = byte(48 + i % 10); i /= 10; } return string(bstr); } function stra2cbor(string[] arr) internal returns (bytes) { uint arrlen = arr.length; // get correct cbor output length uint outputlen = 0; bytes[] memory elemArray = new bytes[](arrlen); for (uint i = 0; i < arrlen; i++) { elemArray[i] = (bytes(arr[i])); outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types } uint ctr = 0; uint cborlen = arrlen + 0x80; outputlen += byte(cborlen).length; bytes memory res = new bytes(outputlen); while (byte(cborlen).length > ctr) { res[ctr] = byte(cborlen)[ctr]; ctr++; } for (i = 0; i < arrlen; i++) { res[ctr] = 0x5F; ctr++; for (uint x = 0; x < elemArray[i].length; x++) { // if there's a bug with larger strings, this may be the culprit if (x % 23 == 0) { uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x; elemcborlen += 0x40; uint lctr = ctr; while (byte(elemcborlen).length > ctr - lctr) { res[ctr] = byte(elemcborlen)[ctr - lctr]; ctr++; } } res[ctr] = elemArray[i][x]; ctr++; } res[ctr] = 0xFF; ctr++; } return res; } function b2s(bytes _b) internal returns (string) { bytes memory output = new bytes(_b.length * 2); uint len = output.length; assembly { let i := 0 let mem := 0 loop: // isolate octet 0x1000000000000000000000000000000000000000000000000000000000000000 exp(0x10, mod(i, 0x40)) // change offset only if needed jumpi(skip, gt(mod(i, 0x40), 0)) // save offset mem for reuse mem := mload(add(_b, add(mul(0x20, div(i, 0x40)), 0x20))) skip: mem mul div dup1 // check if alpha or numerical, jump if numerical 0x0a swap1 lt num jumpi // offset alpha char correctly 0x0a swap1 sub alp: 0x61 add jump(end) num: 0x30 add end: add(output, add(0x20, i)) mstore8 i := add(i, 1) jumpi(loop, gt(len, i)) } return string(output); } } // </ORACLIZE_API_LIB> // File: contracts/DogRace.sol //contract DogRace is usingOraclize { contract DogRace { using SafeMath for uint256; string public constant version = "0.0.5"; uint public constant min_bet = 0.1 ether; uint public constant max_bet = 1 ether; uint public constant house_fee_pct = 5; uint public constant claim_period = 30 days; address public owner; // owner address // Currencies: BTC, ETH, LTC, BCH, XRP uint8 constant dogs_count = 5; // Race states and timing struct chronus_struct { bool betting_open; // boolean: check if betting is open bool race_start; // boolean: check if race has started bool race_end; // boolean: check if race has ended bool race_voided; // boolean: check if race has been voided uint starting_time; // timestamp of when the race starts uint betting_duration; // duration of betting period uint race_duration; // duration of the race } // Single bet information struct bet_info { uint8 dog; // Dog on which the bet is made uint amount; // Amount of the bet } // Dog pool information struct pool_info { uint bets_total; // total bets amount uint pre; // start price uint post; // ending price int delta; // price delta bool post_check; // differentiating pre and post prices in oraclize callback bool winner; // has respective dog won the race? } // Bettor information struct bettor_info { uint bets_total; // total bets amount bool rewarded; // if reward was paid to the bettor bet_info[] bets; // array of bets } mapping (bytes32 => uint) oraclize_query_ids; // mapping oraclize query IDs => dogs mapping (address => bettor_info) bettors; // mapping bettor address => bettor information pool_info[dogs_count] pools; // pools for each currency chronus_struct chronus; // states and timing uint public bets_total = 0; // total amount of bets uint public reward_total = 0; // total amount to be distributed among winners uint public winning_bets_total = 0; // total amount of bets in winning pool(s) uint prices_remaining = dogs_count; // variable to check if all prices are received at the end of the race int max_delta = int256((uint256(1) << 255)); // winner dog(s) delta; initialize to minimal int value // tracking events event OraclizeQuery(string description); event PriceTicker(uint dog, uint price); event Bet(address from, uint256 _value, uint dog); event Reward(address to, uint256 _value); event HouseFee(uint256 _value); // constructor function DogRace() public { owner = msg.sender; oraclizeLib.oraclize_setCustomGasPrice(20000000000 wei); // 20GWei } // modifiers for restricting access to methods modifier onlyOwner { require(owner == msg.sender); _; } modifier duringBetting { require(chronus.betting_open); _; } modifier beforeBetting { require(!chronus.betting_open && !chronus.race_start); _; } modifier afterRace { require(chronus.race_end); _; } // ======== Bettor interface =============================================================================================== // place a bet function place_bet(uint8 dog) external duringBetting payable { require(msg.value >= min_bet && msg.value <= max_bet && dog < dogs_count); bet_info memory current_bet; // Update bettors info current_bet.amount = msg.value; current_bet.dog = dog; bettors[msg.sender].bets.push(current_bet); bettors[msg.sender].bets_total = bettors[msg.sender].bets_total.add(msg.value); // Update pools info pools[dog].bets_total = pools[dog].bets_total.add(msg.value); bets_total = bets_total.add(msg.value); Bet(msg.sender, msg.value, dog); } // fallback method for accepting payments function () private payable {} // method to check the reward amount function check_reward() afterRace external constant returns (uint) { return bettor_reward(msg.sender); } // method to claim the reward function claim_reward() afterRace external { require(!bettors[msg.sender].rewarded); uint reward = bettor_reward(msg.sender); require(reward > 0 && this.balance >= reward); bettors[msg.sender].rewarded = true; msg.sender.transfer(reward); Reward(msg.sender, reward); } // ============================================================================================================================ //oraclize callback method function __callback(bytes32 myid, string result) public { require (msg.sender == oraclizeLib.oraclize_cbAddress()); chronus.race_start = true; chronus.betting_open = false; uint dog_index = oraclize_query_ids[myid]; require(dog_index > 0); // Check if the query id is known dog_index--; oraclize_query_ids[myid] = 0; // Prevent duplicate callbacks if (!pools[dog_index].post_check) { pools[dog_index].pre = oraclizeLib.parseInt(result, 3); // from Oraclize pools[dog_index].post_check = true; // next check for the coin will be ending price check PriceTicker(dog_index, pools[dog_index].pre); } else { pools[dog_index].post = oraclizeLib.parseInt(result, 3); // from Oraclize // calculating the difference in price with a precision of 5 digits pools[dog_index].delta = int(pools[dog_index].post - pools[dog_index].pre) * 10000 / int(pools[dog_index].pre); if (max_delta < pools[dog_index].delta) { max_delta = pools[dog_index].delta; } PriceTicker(dog_index, pools[dog_index].post); prices_remaining--; // How many end prices are to be received if (prices_remaining == 0) { // If all end prices have been received, then process rewards end_race(); } } } // calculate bettor's reward function bettor_reward(address candidate) internal afterRace constant returns(uint reward) { bettor_info storage bettor = bettors[candidate]; if (chronus.race_voided) { reward = bettor.bets_total; } else { if (reward_total == 0) { return 0; } uint winning_bets = 0; for (uint i = 0; i < bettor.bets.length; i++) { if (pools[bettor.bets[i].dog].winner) { winning_bets = winning_bets.add(bettor.bets[i].amount); } } reward = reward_total.mul(winning_bets).div(winning_bets_total); } } // ============= DApp interface ============================================================================================== // exposing pool details for DApp function get_pool(uint dog) external constant returns (uint, uint, uint, int, bool, bool) { return (pools[dog].bets_total, pools[dog].pre, pools[dog].post, pools[dog].delta, pools[dog].post_check, pools[dog].winner); } // exposing chronus for DApp function get_chronus() external constant returns (bool, bool, bool, bool, uint, uint, uint) { return (chronus.betting_open, chronus.race_start, chronus.race_end, chronus.race_voided, chronus.starting_time, chronus.betting_duration, chronus.race_duration); } // exposing bettor info for DApp function get_bettor_nfo() external constant returns (uint, uint, bool) { bettor_info info = bettors[msg.sender]; return (info.bets_total, info.bets.length, info.rewarded); } // exposing bets info for DApp function get_bet_nfo(uint bet_num) external constant returns (uint, uint) { bettor_info info = bettors[msg.sender]; bet_info b_info = info.bets[bet_num]; return (b_info.dog, b_info.amount); } // =========== race lifecycle management functions ================================================================================ // place the oraclize queries and open betting function setup_race(uint betting_period, uint racing_period) public onlyOwner beforeBetting payable returns(bool) { // We have to send 2 queries for each dog; check if we have enough ether for this require (oraclizeLib.oraclize_getPrice("URL", 500000) * 2 * dogs_count < this.balance); chronus.starting_time = block.timestamp; chronus.betting_open = true; uint delay = betting_period.add(60); //slack time 1 minute chronus.betting_duration = delay; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/bitcoin/).0.price_usd", 500000)] = 1; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/).0.price_usd", 500000)] = 2; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/litecoin/).0.price_usd", 500000)] = 3; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/bitcoin-cash/).0.price_usd", 500000)] = 4; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/ripple/).0.price_usd", 500000)] = 5; delay = delay.add(racing_period); oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/bitcoin/).0.price_usd", 500000)] = 1; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/).0.price_usd", 500000)] = 2; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/litecoin/).0.price_usd", 500000)] = 3; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/bitcoin-cash/).0.price_usd", 500000)] = 4; oraclize_query_ids[oraclizeLib.oraclize_query(delay, "URL", "json(https://api.coinmarketcap.com/v1/ticker/ripple/).0.price_usd", 500000)] = 5; OraclizeQuery("Oraclize queries were sent"); chronus.race_duration = delay; return true; } // end race and transfer house fee (called internally by callback) function end_race() internal { chronus.race_end = true; // calculate winning pool(s) and their total amount for (uint dog = 0; dog < dogs_count; dog++) { if (pools[dog].delta == max_delta) { pools[dog].winner = true; winning_bets_total = winning_bets_total.add(pools[dog].bets_total); } } // calculate house fee and transfer it to contract owner uint house_fee; if (winning_bets_total == 0) { // No winners => house takes all the money reward_total = 0; house_fee = this.balance; } else { if (winning_bets_total == bets_total) { // All the bettors are winners => void the race => no house fee; everyone gets their bets back chronus.race_voided = true; house_fee = 0; } else { house_fee = bets_total.mul(house_fee_pct).div(100); // calculate house fee as % of total bets } reward_total = bets_total.sub(house_fee); // subtract house_fee from total reward house_fee = this.balance.sub(reward_total); // this.balance will also include remains of kickcstart ether } HouseFee(house_fee); owner.transfer(house_fee); } // in case of any errors in race, enable full refund for the bettors to claim function void_race() external onlyOwner { require(now > chronus.starting_time + chronus.race_duration); require((chronus.betting_open && !chronus.race_start) || (chronus.race_start && !chronus.race_end)); chronus.betting_open = false; chronus.race_voided = true; chronus.race_end = true; } // method to retrieve unclaimed winnings after claim period has ended function recover_unclaimed_bets() external onlyOwner { require(now > chronus.starting_time + chronus.race_duration + claim_period); require(chronus.race_end); owner.transfer(this.balance); } // selfdestruct (returns balance to the owner) function kill() external onlyOwner { selfdestruct(msg.sender); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[],"name":"claim_reward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"dog","type":"uint256"}],"name":"get_pool","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"int256"},{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"recover_unclaimed_bets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"dog","type":"uint8"}],"name":"place_bet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"max_bet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"check_reward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"bet_num","type":"uint256"}],"name":"get_bet_nfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"get_bettor_nfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"claim_period","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"void_race","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reward_total","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"get_chronus","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"betting_period","type":"uint256"},{"name":"racing_period","type":"uint256"}],"name":"setup_race","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"min_bet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"house_fee_pct","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"winning_bets_total","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bets_total","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"description","type":"string"}],"name":"OraclizeQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"dog","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"}],"name":"PriceTicker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"},{"indexed":false,"name":"dog","type":"uint256"}],"name":"Bet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_value","type":"uint256"}],"name":"HouseFee","type":"event"}]
Contract Creation Code
606060405260006020819055602181905560225560056023557f8000000000000000000000000000000000000000000000000000000000000000602455341561004757600080fd5b60008054600160a060020a03191633600160a060020a031617905573a97462de213aa4e1b24350aa62a3cc6aa5484cda63010959626404a817c8006040517c010000000000000000000000000000000000000000000000000000000063ffffffff8416028152600481019190915260240160006040518083038186803b15156100cf57600080fd5b6102c65a03f415156100e057600080fd5b505050611fae806100f26000396000f3006060604052600436106101035763ffffffff60e060020a600035041663055ee253811461010557806307a67fb31461011857806327dc297e1461016957806341c0e1b5146101bf57806343cfd44c146101d25780634408f3f9146101e557806354fd4d50146101f35780636a8e87111461027d57806372acad56146102a25780637a8bd25a146102b55780638da5cb5b146102e357806392b4b68a146103125780639583cf171461034b5780639f2f58ec1461035e578063aa93038b14610371578063b1a1b3bc14610384578063b6982c7f146103dd578063ca53135a146103ff578063cd7eac3a14610412578063dd0fa64114610425578063f3ddb94614610438575b005b341561011057600080fd5b61010361044b565b341561012357600080fd5b61012e600435610556565b604051958652602086019490945260408086019390935260608501919091521515608084015290151560a083015260c0909101905180910390f35b341561017457600080fd5b610103600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061061495505050505050565b34156101ca57600080fd5b610103610a8a565b34156101dd57600080fd5b610103610ab1565b61010360ff60043516610b35565b34156101fe57600080fd5b610206610ce2565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561024257808201518382015260200161022a565b50505050905090810190601f16801561026f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561028857600080fd5b610290610d19565b60405190815260200160405180910390f35b34156102ad57600080fd5b610290610d25565b34156102c057600080fd5b6102cb600435610d4e565b60405191825260208201526040908101905180910390f35b34156102ee57600080fd5b6102f6610da4565b604051600160a060020a03909116815260200160405180910390f35b341561031d57600080fd5b610325610db3565b604051928352602083019190915215156040808301919091526060909101905180910390f35b341561035657600080fd5b610290610de4565b341561036957600080fd5b610103610deb565b341561037c57600080fd5b610290610e85565b341561038f57600080fd5b610397610e8b565b604051961515875294151560208701529215156040808701919091529115156060860152608085015260a084019190915260c083019190915260e0909101905180910390f35b6103eb600435602435610ebf565b604051901515815260200160405180910390f35b341561040a57600080fd5b610290611b9d565b341561041d57600080fd5b610290611ba9565b341561043057600080fd5b610290611bae565b341561044357600080fd5b610290611bb4565b601c5460009062010000900460ff16151561046557600080fd5b600160a060020a03331660009081526002602052604090206001015460ff161561048e57600080fd5b61049733611bba565b90506000811180156104b357508030600160a060020a03163110155b15156104be57600080fd5b600160a060020a033316600081815260026020526040908190206001908101805460ff1916909117905582156108fc0290839051600060405180830381858888f19350505050151561050f57600080fd5b7f619caafabdd75649b302ba8419e48cccf64f37f1983ac4727cfb38b57703ffc93382604051600160a060020a03909216825260208201526040908101905180910390a150565b600080808080806003876005811061056a57fe5b600502016000015460038860058110151561058157fe5b600502016001015460038960058110151561059857fe5b600502016002015460038a6005811015156105af57fe5b600502016003015460038b6005811015156105c657fe5b6005020160040160009054906101000a900460ff1660038c6005811015156105ea57fe5b6005020160040160019054906101000a900460ff1695509550955095509550955091939550919395565b600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63bcf175c86000604051602001526040518163ffffffff1660e060020a02815260040160206040518083038186803b151561066557600080fd5b6102c65a03f4151561067657600080fd5b50505060405180519050600160a060020a031633600160a060020a031614151561069f57600080fd5b50601c805460ff1961ff0019909116610100171690556000828152600160205260408120549081116106d057600080fd5b60008381526001602052604081205560001901600381600581106106f057fe5b600502016004015460ff16151561087d5773a97462de213aa4e1b24350aa62a3cc6aa5484cda63bf4d89b58360036000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561077c578082015183820152602001610764565b50505050905090810190601f1680156107a95780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15156107c657600080fd5b6102c65a03f415156107d757600080fd5b50505060405180519050600382600581106107ee57fe5b6005020160010181905550600160038260058110151561080a57fe5b6005020160040160006101000a81548160ff0219169083151502179055507f2a5da5e756f2c383f159d4bb847340fe48c58ad030be5a942e5e4abf00fe74da8160038360058110151561085957fe5b600502016001015460405191825260208201526040908101905180910390a1610a85565b73a97462de213aa4e1b24350aa62a3cc6aa5484cda63bf4d89b58360036000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156108f85780820151838201526020016108e0565b50505050905090810190601f1680156109255780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b151561094257600080fd5b6102c65a03f4151561095357600080fd5b505050604051805190506003826005811061096a57fe5b600502016002018190555060038160058110151561098457fe5b600502016001015460038260058110151561099b57fe5b60050201600101546003836005811015156109b257fe5b600502016002015403612710028115156109c857fe5b05600382600581106109d657fe5b60050201600301819055506003816005811015156109f057fe5b60050201600301546024541215610a1d5760038160058110610a0e57fe5b60050201600301546024819055505b7f2a5da5e756f2c383f159d4bb847340fe48c58ad030be5a942e5e4abf00fe74da8160038160058110610a4c57fe5b600502016002015460405191825260208201526040908101905180910390a16023805460001901908190551515610a8557610a85611cf2565b505050565b60005433600160a060020a03908116911614610aa557600080fd5b33600160a060020a0316ff5b60005433600160a060020a03908116911614610acc57600080fd5b601f54601d540162278d00014211610ae357600080fd5b601c5462010000900460ff161515610afa57600080fd5b600054600160a060020a039081169030163180156108fc0290604051600060405180830381858888f193505050501515610b3357600080fd5b565b610b3d611efe565b601c5460ff161515610b4e57600080fd5b67016345785d8a00003410158015610b6e5750670de0b6b3a76400003411155b8015610b7d5750600560ff8316105b1515610b8857600080fd5b3460208083019190915260ff83168252600160a060020a03331660009081526002918290526040902001805460018101610bc28382611f15565b600092835260209092208391600202018151815460ff191660ff9190911617815560208201516001909101555050600160a060020a033316600090815260026020526040902054610c19903463ffffffff611e9416565b600160a060020a033316600090815260026020526040902055610c5734600360ff851660058110610c4657fe5b60050201549063ffffffff611e9416565b600360ff841660058110610c6757fe5b6005020155602054610c7f903463ffffffff611e9416565b6020557ff41b7910e085d0992d604fd470931728fd77cc8eb504d99e50e51a0a30fcfd1a3334846040518084600160a060020a0316600160a060020a031681526020018381526020018260ff168152602001935050505060405180910390a15050565b60408051908101604052600581527f302e302e35000000000000000000000000000000000000000000000000000000602082015281565b670de0b6b3a764000081565b601c5460009062010000900460ff161515610d3f57600080fd5b610d4833611bba565b90505b90565b600160a060020a033316600090815260026020819052604082209081018054839291839186908110610d7c57fe5b60009182526020909120600290910201805460019091015460ff909116969095509350505050565b600054600160a060020a031681565b33600160a060020a031660009081526002602081905260409091208054918101546001909101549192909160ff1690565b62278d0081565b60005433600160a060020a03908116911614610e0657600080fd5b601f54601d54014211610e1857600080fd5b601c5460ff168015610e325750601c54610100900460ff16155b80610e585750601c54610100900460ff168015610e585750601c5462010000900460ff16155b1515610e6357600080fd5b601c805462ff00001963ff0000ff199091166301000000171662010000179055565b60215481565b601c54601d54601e54601f5460ff808516956101008604821695620100008104831695630100000090910490921693919290565b60008054819033600160a060020a03908116911614610edd57600080fd5b601c5460ff16158015610ef85750601c54610100900460ff16155b1515610f0357600080fd5b600160a060020a03301631600573a97462de213aa4e1b24350aa62a3cc6aa5484cda63abe9f5696207a12060006040516020015260405160e060020a63ffffffff841602815260248101919091526040600482018190526003604483015260ea60020a62155493026064830152608490910190602090518083038186803b1515610f8c57600080fd5b6102c65a03f41515610f9d57600080fd5b5050506040518051905060020202101515610fb757600080fd5b42601d55601c805460ff19166001179055610fd984603c63ffffffff611e9416565b601e8190559050600180600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a120846040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604260c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f626974636f696e2f292e302e70726963655f756101048201527f73640000000000000000000000000000000000000000000000000000000000006101248201526101440160206040518083038186803b15156110d357600080fd5b6102c65a03f415156110e457600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060026001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604360c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f657468657265756d2f292e302e70726963655f61010482015260ea60020a621d5cd9026101248201526101440160206040518083038186803b15156111e657600080fd5b6102c65a03f415156111f757600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060036001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604360c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f6c697465636f696e2f292e302e70726963655f61010482015260ea60020a621d5cd9026101248201526101440160206040518083038186803b15156112f957600080fd5b6102c65a03f4151561130a57600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060046001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604760c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f626974636f696e2d636173682f292e302e70726101048201527f6963655f757364000000000000000000000000000000000000000000000000006101248201526101440160206040518083038186803b151561142357600080fd5b6102c65a03f4151561143457600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060056001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604160c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f726970706c652f292e302e70726963655f75736101048201527f64000000000000000000000000000000000000000000000000000000000000006101248201526101440160206040518083038186803b151561154d57600080fd5b6102c65a03f4151561155e57600080fd5b5050506040518051825250602081019190915260400160002055611588818463ffffffff611e9416565b9050600180600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604260c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f626974636f696e2f292e302e70726963655f756101048201527f73640000000000000000000000000000000000000000000000000000000000006101248201526101440160206040518083038186803b151561167e57600080fd5b6102c65a03f4151561168f57600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060026001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604360c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f657468657265756d2f292e302e70726963655f61010482015260ea60020a621d5cd9026101248201526101440160206040518083038186803b151561179157600080fd5b6102c65a03f415156117a257600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060036001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604360c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f6c697465636f696e2f292e302e70726963655f61010482015260ea60020a621d5cd9026101248201526101440160206040518083038186803b15156118a457600080fd5b6102c65a03f415156118b557600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060046001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604760c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f626974636f696e2d636173682f292e302e70726101048201527f6963655f757364000000000000000000000000000000000000000000000000006101248201526101440160206040518083038186803b15156119ce57600080fd5b6102c65a03f415156119df57600080fd5b50505060405180519050600019166000191681526020019081526020016000208190555060056001600073a97462de213aa4e1b24350aa62a3cc6aa5484cda63056e1059856207a12060006040516020015260405160e060020a63ffffffff851602815260048101929092526064820152608060248201526003608482015260ea60020a621554930260a482015260c06044820152604160c4820152600080516020611f6383398151915260e48201527f6f6d2f76312f7469636b65722f726970706c652f292e302e70726963655f75736101048201527f64000000000000000000000000000000000000000000000000000000000000006101248201526101440160206040518083038186803b1515611af857600080fd5b6102c65a03f41515611b0957600080fd5b505050604051805182525060208101919091526040908101600020919091557fd7789a3deb1d0944b7966c5d18037fc5b3a0a17236de9e7c20fe3a634516729590516020808252601a908201527f4f7261636c697a65207175657269657320776572652073656e740000000000006040808301919091526060909101905180910390a1601f819055600191505b5092915050565b67016345785d8a000081565b600581565b60225481565b60205481565b601c5460009081908190819062010000900460ff161515611bda57600080fd5b600160a060020a0385166000908152600260205260409020601c549093506301000000900460ff1615611c105782549350611cea565b6021541515611c225760009350611cea565b5060009050805b6002830154811015611cc05760038360020182815481101515611c4857fe5b600091825260209091206002909102015460ff1660058110611c6657fe5b6005020160040160019054906101000a900460ff1615611cb857611cb58360020182815481101515611c9457fe5b90600052602060002090600202016001015483611e9490919063ffffffff16565b91505b600101611c29565b611ce7602254611cdb84602154611eaa90919063ffffffff16565b9063ffffffff611ed516565b93505b505050919050565b601c805462ff00001916620100001790556000805b6005821015611d905760245460038360058110611d2057fe5b60050201600301541415611d8557600160038360058110611d3d57fe5b6005020160040160016101000a81548160ff021916908315150217905550611d81600383600581101515611d6d57fe5b60050201546022549063ffffffff611e9416565b6022555b600190910190611d07565b6022541515611daf57506000602155600160a060020a03301631611e2a565b6020546022541415611dd65750601c805463ff000000191663010000001790556000611df4565b611df16064611cdb6005602054611eaa90919063ffffffff16565b90505b602054611e07908263ffffffff611eec16565b6021819055611e2790600160a060020a033016319063ffffffff611eec16565b90505b7fece54310ceec9cf612f54497081d4bee67c24162a3b6b195c722717ad398e5088160405190815260200160405180910390a1600054600160a060020a031681156108fc0282604051600060405180830381858888f193505050501515611e9057600080fd5b5050565b600082820183811015611ea357fe5b9392505050565b600080831515611ebd5760009150611b96565b50828202828482811515611ecd57fe5b0414611ea357fe5b6000808284811515611ee357fe5b04949350505050565b600082821115611ef857fe5b50900390565b604080519081016040526000808252602082015290565b815481835581811511610a8557600083815260209020610a8591610d4b9160029182028101918502015b80821115611f5e57805460ff1916815560006001820155600201611f3f565b509056006a736f6e2868747470733a2f2f6170692e636f696e6d61726b65746361702e63a165627a7a723058205b9322a9dc9227ab14314a78f3eb06195c93687ad80368c7622f1c1b388ebb420029
Swarm Source
bzzr://5b9322a9dc9227ab14314a78f3eb06195c93687ad80368c7622f1c1b388ebb42
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.