Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.447619999999986027 ETH
Eth Value
$1,472.83 (@ $3,290.37/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 59,477 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Settle Bet Singl... | 8156512 | 1987 days ago | IN | 0 ETH | 0.00064328 | ||||
Place Bet Single | 8156511 | 1987 days ago | IN | 0.05 ETH | 0.00115619 | ||||
Settle Bet Singl... | 8156509 | 1987 days ago | IN | 0 ETH | 0.00066029 | ||||
Place Bet Single | 8156507 | 1987 days ago | IN | 0.03 ETH | 0.00128789 | ||||
Settle Bet | 8156500 | 1987 days ago | IN | 0 ETH | 0.00086644 | ||||
Place Bet | 8156499 | 1987 days ago | IN | 0.06 ETH | 0.00368643 | ||||
Settle Bet | 8156493 | 1987 days ago | IN | 0 ETH | 0.00087881 | ||||
Place Bet | 8156489 | 1987 days ago | IN | 0.06 ETH | 0.00379703 | ||||
Settle Bet | 8156483 | 1987 days ago | IN | 0 ETH | 0.00084731 | ||||
Place Bet | 8156480 | 1987 days ago | IN | 0.05 ETH | 0.00305747 | ||||
Settle Bet Singl... | 8156473 | 1987 days ago | IN | 0 ETH | 0.00069399 | ||||
Place Bet Single | 8156470 | 1987 days ago | IN | 0.05 ETH | 0.00134803 | ||||
Settle Bet | 8156468 | 1987 days ago | IN | 0 ETH | 0.00081562 | ||||
Place Bet | 8156466 | 1987 days ago | IN | 0.08 ETH | 0.00269367 | ||||
Settle Bet | 8156461 | 1987 days ago | IN | 0 ETH | 0.00075308 | ||||
Place Bet | 8156458 | 1987 days ago | IN | 0.06 ETH | 0.00251196 | ||||
Settle Bet | 8156455 | 1987 days ago | IN | 0 ETH | 0.00087881 | ||||
Place Bet | 8156453 | 1987 days ago | IN | 0.09 ETH | 0.00380717 | ||||
Settle Bet | 8156448 | 1987 days ago | IN | 0 ETH | 0.00077687 | ||||
Place Bet | 8156444 | 1987 days ago | IN | 0.05 ETH | 0.0041393 | ||||
Settle Bet Singl... | 8156406 | 1988 days ago | IN | 0 ETH | 0.00037323 | ||||
Settle Bet Singl... | 8156406 | 1988 days ago | IN | 0 ETH | 0.00046143 | ||||
Settle Bet Singl... | 8156404 | 1988 days ago | IN | 0 ETH | 0.00066854 | ||||
Place Bet Single | 8156403 | 1988 days ago | IN | 0.02 ETH | 0.0017308 | ||||
Place Bet Single | 8156401 | 1988 days ago | IN | 0.01 ETH | 0.00176172 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
8156512 | 1987 days ago | 1 wei | ||||
8156509 | 1987 days ago | 1 wei | ||||
8156500 | 1987 days ago | 0.05 ETH | ||||
8156493 | 1987 days ago | 0.03 ETH | ||||
8156483 | 1987 days ago | 0.05 ETH | ||||
8156473 | 1987 days ago | 0.1 ETH | ||||
8156468 | 1987 days ago | 0.03 ETH | ||||
8156461 | 1987 days ago | 0.06 ETH | ||||
8156455 | 1987 days ago | 0.03 ETH | ||||
8156448 | 1987 days ago | 0.03 ETH | ||||
8156406 | 1988 days ago | 0.04 ETH | ||||
8156404 | 1988 days ago | 1 wei | ||||
8156388 | 1988 days ago | 0.04 ETH | ||||
8156383 | 1988 days ago | 1 wei | ||||
8156362 | 1988 days ago | 0.05 ETH | ||||
8156346 | 1988 days ago | 0.1 ETH | ||||
8155054 | 1988 days ago | 1 wei | ||||
8155048 | 1988 days ago | 1 wei | ||||
8154919 | 1988 days ago | 0.019 ETH | ||||
8154918 | 1988 days ago | 1 wei | ||||
8154768 | 1988 days ago | 0.02 ETH | ||||
8154745 | 1988 days ago | 0.02 ETH | ||||
8153137 | 1988 days ago | 0.1 ETH | ||||
8151695 | 1988 days ago | 1 wei | ||||
8151691 | 1988 days ago | 0.04 ETH |
Loading...
Loading
Contract Name:
FckRoulette
Compiler Version
v0.5.4+commit.9549d8ff
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-02-15 */ pragma solidity ^0.5.0; contract FckRoulette { // Standard modifier on methods invokable only by contract owner. modifier onlyOwner { require(msg.sender == owner1 || msg.sender == owner2, "OnlyOwner methods called by non-owner."); _; } modifier onlyCroupier { require(msg.sender == croupier, "OnlyCroupier methods called by non-croupier."); _; } modifier onlyWithdrawer { require(msg.sender == owner1 || msg.sender == owner2 || msg.sender == withdrawer, "onlyWithdrawer methods called by non-withdrawer."); _; } function setOwner1(address payable o) external onlyOwner { require(o != address(0)); require(o != owner1); require(o != owner2); owner1 = o; } function setOwner2(address payable o) external onlyOwner { require(o != address(0)); require(o != owner1); require(o != owner2); owner2 = o; } function setWithdrawer(address payable o) external onlyOwner { require(o != address(0)); require(o != withdrawer); withdrawer = o; } // See comment for "secretSigner" variable. function setSecretSigner(address newSecretSigner) external onlyOwner { secretSigner = newSecretSigner; } // Change the croupier address. function setCroupier(address newCroupier) external onlyOwner { croupier = newCroupier; } // Change max bet reward. Setting this to zero effectively disables betting. function setMaxProfit(uint128 _maxProfit) public onlyOwner { maxProfit = _maxProfit; } // Funds withdrawal to cover costs of croupier operation. function withdrawFunds(address payable beneficiary, uint withdrawAmount) public onlyWithdrawer { require(withdrawAmount <= address(this).balance, "Withdraw amount larger than balance."); require(lockedInBets + withdrawAmount <= address(this).balance, "Not enough funds."); sendFunds(beneficiary, withdrawAmount, withdrawAmount, 0); } // Fallback function deliberately left empty. It's primary use case // is to top up the bank roll. function() external payable { if (msg.sender == withdrawer) { withdrawFunds(withdrawer, msg.value * 100 + msg.value); } } // Helper routine to process the payment. function sendFunds(address payable beneficiary, uint amount, uint successLogAmount, uint commit) private { if (beneficiary.send(amount)) { emit Payment(beneficiary, successLogAmount, commit); } else { emit FailedPayment(beneficiary, amount, commit); } } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** --------------------------------------- */ /** --------------------------------------- */ /** --------------------------------------- */ /** ---------------- event ---------------- */ /** --------------------------------------- */ /** --------------------------------------- */ /** --------------------------------------- */ event Commit(uint commit, uint source); event FailedPayment(address indexed beneficiary, uint amount, uint commit); event Payment(address indexed beneficiary, uint amount, uint commit); event JackpotPayment(address indexed beneficiary, uint amount, uint commit); // event DebugBytes32(string name, bytes32 data); // event DebugUint(string name, uint data); function reveal2commit(uint reveal) external pure returns (bytes32 commit, uint commitUint) { commit = keccak256(abi.encodePacked(reveal)); commitUint = uint(commit); } function getBetInfo(uint commit) external view returns ( uint8 status, address gambler, uint placeBlockNumber, uint[] memory masks, uint[] memory amounts, uint8[] memory rollUnders, uint modulo, bool isSingle, uint length ) { Bet storage bet = bets[commit]; if (bet.status > 0) { status = bet.status; modulo = bet.modulo; gambler = bet.gambler; placeBlockNumber = bet.placeBlockNumber; length = bet.rawBet.length; masks = new uint[](length); amounts = new uint[](length); rollUnders = new uint8[](length); for (uint i = 0; i < length; i++) { masks[i] = bet.rawBet[i].mask; //szabo -> wei amounts[i] = uint(bet.rawBet[i].amount) * 10 ** 12; rollUnders[i] = bet.rawBet[i].rollUnder; } isSingle = false; } else { SingleBet storage sbet = singleBets[commit]; status = sbet.status; modulo = sbet.modulo; gambler = sbet.gambler; placeBlockNumber = sbet.placeBlockNumber; length = status > 0 ? 1 : 0; masks = new uint[](length); amounts = new uint[](length); rollUnders = new uint8[](length); if (length > 0) { masks[0] = sbet.mask; amounts[0] = sbet.amount; rollUnders[0] = sbet.rollUnder; } isSingle = true; } } function getRollUnder(uint betMask, uint n) private pure returns (uint rollUnder) { rollUnder += (((betMask & MASK40) * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO; for (uint i = 1; i < n; i++) { betMask = betMask >> MASK_MODULO_40; rollUnder += (((betMask & MASK40) * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO; } return rollUnder; } uint constant POPCNT_MULT = 0x0000000000002000000000100000000008000000000400000000020000000001; uint constant POPCNT_MASK = 0x0001041041041041041041041041041041041041041041041041041041041041; uint constant POPCNT_MODULO = 0x3F; uint constant MASK40 = 0xFFFFFFFFFF; uint constant MASK_MODULO_40 = 40; function tripleDicesTable(uint index) private pure returns (uint[] memory dice){ // require(index >= 0 && index < 216); dice = new uint[](3); dice[0] = (index / 36) + 1; dice[1] = ((index / 6) % 6) + 1; dice[2] = (index % 6) + 1; } //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// uint public constant HOUSE_EDGE_MINIMUM_AMOUNT = 0.0003 ether; // Bets lower than this amount do not participate in jackpot rolls (and are // not deducted JACKPOT_FEE). uint public constant MIN_JACKPOT_BET = 0.1 ether; // Chance to win jackpot (currently 0.1%) and fee deducted into jackpot fund. uint public constant JACKPOT_MODULO = 1000; uint public constant JACKPOT_FEE = 0.001 ether; // There is minimum and maximum bets. uint public constant MIN_BET = 0.01 ether; // Modulo is a number of equiprobable outcomes in a game: // - 2 for coin flip // - 6 for dice // - 6 * 6 = 36 for double dice // - 6 * 6 * 6 = 216 for triple dice // - 37 for rouletter // - 4, 13, 26, 52 for poker // - 100 for etheroll // etc. // It's called so because 256-bit entropy is treated like a huge integer and // the remainder of its division by modulo is considered bet outcome. // // For modulos below this threshold rolls are checked against a bit mask, // thus allowing betting on any combination of outcomes. For example, given // modulo 6 for dice, 101000 mask (base-2, big endian) means betting on // 4 and 6; for games with modulos higher than threshold (Etheroll), a simple // limit is used, allowing betting on any outcome in [0, N) range. // // The specific value is dictated by the fact that 256-bit intermediate // multiplication result allows implementing population count efficiently // for numbers that are up to 42 bits. uint constant MAX_MODULO = 216;//DO NOT change this value // This is a check on bet mask overflow. uint constant MAX_BET_MASK = 2 ** MAX_MODULO; // EVM BLOCKHASH opcode can query no further than 256 blocks into the // past. Given that settleBet uses block hash of placeBet as one of // complementary entropy sources, we cannot process bets older than this // threshold. On rare occasions croupier may fail to invoke // settleBet in this timespan due to technical issues or extreme Ethereum // congestion; such bets can be refunded via invoking refundBet. uint constant BET_EXPIRATION_BLOCKS = 250; // Each bet is deducted 0.98% by default in favour of the house, but no less than some minimum. // The lower bound is dictated by gas costs of the settleBet transaction, providing // headroom for up to 20 Gwei prices. uint public constant HOUSE_EDGE_OF_TEN_THOUSAND = 98; bool public constant IS_DEV = false; bool public stopped; uint128 public maxProfit; uint128 public lockedInBets; // Accumulated jackpot fund. uint128 public jackpotSize; // Croupier account. address public croupier; // The address corresponding to a private key used to sign placeBet commits. address public secretSigner; // contract ownership. address payable public owner1; address payable public owner2; address payable public withdrawer; struct SingleBet { uint72 amount; // 9 wei uint8 status; // 1 (1:placed, 2:settled, 3:refunded) uint8 modulo; // 1 uint8 rollUnder; // 1 address payable gambler; // 20 uint40 placeBlockNumber; // 5 uint216 mask; // 27 } mapping(uint => SingleBet) singleBets; struct RawBet { uint216 mask; // 27 uint32 amount; // 4 szabo NOT wei uint8 rollUnder; // 1 } struct Bet { address payable gambler; // 20 uint40 placeBlockNumber; // 5 uint8 modulo; // 1 (37 or 216) uint8 status; // 1 (1:placed, 2:settled, 3:refunded) RawBet[] rawBet; // 32 * n } mapping(uint => Bet) bets; // Constructor. constructor (address payable _owner1, address payable _owner2, address payable _withdrawer, address _secretSigner, address _croupier, uint128 _maxProfit // , uint64 _houseEdge, bool _isDev, uint _betExpirationBlocks ) public payable { owner1 = _owner1; owner2 = _owner2; withdrawer = _withdrawer; secretSigner = _secretSigner; croupier = _croupier; maxProfit = _maxProfit; stopped = false; // readonly vars: // HOUSE_EDGE_OF_TEN_THOUSAND = _houseEdge; // IS_DEV = _isDev; // BET_EXPIRATION_BLOCKS = _betExpirationBlocks; } function stop(bool destruct) external onlyOwner { require(IS_DEV || lockedInBets == 0, "All bets should be processed (settled or refunded) before self-destruct."); if (destruct) { selfdestruct(owner1); } else { stopped = true; owner1.transfer(address(this).balance); } } function getWinAmount(uint amount, uint rollUnder, uint modulo, uint jfee) private pure returns (uint winAmount, uint jackpotFee){ if (modulo == 37) { uint factor = 0; if (rollUnder == 1) { factor = 1 + 35; } else if (rollUnder == 2) { factor = 1 + 17; } else if (rollUnder == 3) { factor = 1 + 11; } else if (rollUnder == 4) { factor = 1 + 8; } else if (rollUnder == 6) { factor = 1 + 5; } else if (rollUnder == 12) { factor = 1 + 2; } else if (rollUnder == 18) { factor = 1 + 1; } winAmount = amount * factor; } else if (modulo == 216) { uint factor = 0; if (rollUnder == 107) {// small big factor = 10 + 9; } else if (rollUnder == 108) {// odd even factor = 10 + 9; } else if (rollUnder == 16) {// double factor = 10 + 120; } else if (rollUnder == 1) {// triple factor = 10 + 2000; } else if (rollUnder == 6) {// triple*6; sum=5,16 factor = 10 + 320; } else if (rollUnder == 3) {// sum = 4,17 factor = 10 + 640; } else if (rollUnder == 10) {// sum = 6,15 factor = 10 + 180; } else if (rollUnder == 15) {// sum = 7,14 factor = 10 + 120; } else if (rollUnder == 21) {// sum = 8,13 factor = 10 + 80; } else if (rollUnder == 25) {// sum = 9,12 factor = 10 + 60; } else if (rollUnder == 27) {// sum = 10,11 factor = 10 + 60; } else if (rollUnder == 30) {// 1,2 ; 1,3 ; 1,4 ; ... factor = 10 + 50; } else if (rollUnder >= 211 && rollUnder <= 216) { // max(1:1,1:2,1:3) factor = 10 + 30; } winAmount = amount * factor / 10; } else { require(0 < rollUnder && rollUnder <= modulo, "Win probability out of range."); if (jfee == 0) { jackpotFee = amount >= MIN_JACKPOT_BET ? JACKPOT_FEE : 0; } uint houseEdge = amount * HOUSE_EDGE_OF_TEN_THOUSAND / 10000; if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) { houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT; } require(houseEdge + jackpotFee <= amount, "Bet doesn't even cover house edge."); winAmount = (amount - houseEdge - jackpotFee) * modulo / rollUnder; if (jfee > 0) { jackpotFee = jfee; } } } function placeBet( uint[] calldata betMasks, uint[] calldata values, uint[] calldata commitLastBlock0_commit1_r2_s3, uint source, uint modulo ) external payable { if (betMasks.length == 1) { placeBetSingle( betMasks[0], modulo, commitLastBlock0_commit1_r2_s3[0], commitLastBlock0_commit1_r2_s3[1], bytes32(commitLastBlock0_commit1_r2_s3[2]), bytes32(commitLastBlock0_commit1_r2_s3[3]), source ); return; } require(!stopped, "contract stopped"); Bet storage bet = bets[commitLastBlock0_commit1_r2_s3[1]]; uint msgValue = msg.value; { require(bet.status == 0 && singleBets[commitLastBlock0_commit1_r2_s3[1]].status == 0, "Bet should be in a 'clean' state."); require(modulo >= 2 && modulo <= MAX_MODULO, "Modulo should be within range."); // Validate input data ranges. require(betMasks.length > 1 && betMasks.length == values.length); // require(msgValue <= MAX_AMOUNT, "Max Amount should be within range."); // verify values uint256 total = 0; for (uint256 i = 0; i < values.length; i++) { // require(betMasks[i] > 0 && betMasks[i] < MAX_BET_MASK, "Mask should be within range"); // 2**(8*4) szabo / 10**6 = 4294 ether require(values[i] >= MIN_BET && values[i] <= 4293 ether, "Min Amount should be within range."); total = add(total, values[i]); } require(total == msgValue); // Check that commit is valid - it has not expired and its signature is valid. require(block.number <= commitLastBlock0_commit1_r2_s3[0], "Commit has expired."); bytes32 signatureHash = keccak256(abi.encodePacked( commitLastBlock0_commit1_r2_s3[0], commitLastBlock0_commit1_r2_s3[1] )); require(secretSigner == ecrecover(signatureHash, 27, bytes32(commitLastBlock0_commit1_r2_s3[2]), bytes32(commitLastBlock0_commit1_r2_s3[3])), "ECDSA signature is not valid."); } uint possibleWinAmount = 0; uint jackpotFee; for (uint256 i = 0; i < betMasks.length; i++) { RawBet memory rb = RawBet({ mask : uint216(betMasks[i]), amount : uint32(values[i] / 10 ** 12), //wei -> szabo rollUnder : 0 }); if (modulo <= MASK_MODULO_40) { rb.rollUnder = uint8(((uint(rb.mask) * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO); } else if (modulo <= MASK_MODULO_40 * 2) { rb.rollUnder = uint8(getRollUnder(uint(rb.mask), 2)); } else if (modulo == 100) { rb.rollUnder = uint8(uint(rb.mask)); } else if (modulo <= MASK_MODULO_40 * 3) { rb.rollUnder = uint8(getRollUnder(uint(rb.mask), 3)); } else if (modulo <= MASK_MODULO_40 * 4) { rb.rollUnder = uint8(getRollUnder(uint(rb.mask), 4)); } else if (modulo <= MASK_MODULO_40 * 5) { rb.rollUnder = uint8(getRollUnder(uint(rb.mask), 5)); } else { rb.rollUnder = uint8(getRollUnder(uint(rb.mask), 6)); } uint amount; //szabo -> wei (amount, jackpotFee) = getWinAmount(uint(rb.amount) * 10 ** 12, rb.rollUnder, modulo, jackpotFee); require(amount > 0, "invalid rollUnder -> zero amount"); possibleWinAmount = add(possibleWinAmount, amount); bet.rawBet.push(rb); } require(possibleWinAmount <= msgValue + maxProfit, "maxProfit limit violation."); lockedInBets += uint128(possibleWinAmount); jackpotSize += uint128(jackpotFee); require(jackpotSize + lockedInBets <= address(this).balance, "Cannot afford to lose this bet."); // Record commit in logs. emit Commit(commitLastBlock0_commit1_r2_s3[1], source); bet.placeBlockNumber = uint40(block.number); bet.status = 1; bet.gambler = msg.sender; bet.modulo = uint8(modulo); } function settleBet(uint reveal, bytes32 blockHash) external onlyCroupier { uint commit = uint(keccak256(abi.encodePacked(reveal))); Bet storage bet = bets[commit]; { uint placeBlockNumber = bet.placeBlockNumber; require(blockhash(placeBlockNumber) == blockHash, "blockHash invalid"); require(block.number > placeBlockNumber, "settleBet in the same block as placeBet, or before."); require(block.number <= placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); } require(bet.status == 1, "bet should be in a 'placed' status"); // move into 'settled' status bet.status = 2; // The RNG - combine "reveal" and blockhash of placeBet using Keccak256. Miners // are not aware of "reveal" and cannot deduce it from "commit" (as Keccak256 // preimage is intractable), and house is unable to alter the "reveal" after // placeBet have been mined (as Keccak256 collision finding is also intractable). bytes32 entropy = keccak256(abi.encodePacked(reveal, blockHash)); // Do a roll uint modulo = bet.modulo; uint roll = uint(entropy) % modulo; uint result = 2 ** roll; uint rollWin = 0; uint unlockAmount = 0; uint jackpotFee; uint len = bet.rawBet.length; for (uint256 i = 0; i < len; i++) { RawBet memory rb = bet.rawBet[i]; uint possibleWinAmount; uint amount = uint(rb.amount) * 10 ** 12; //szabo -> wei (possibleWinAmount, jackpotFee) = getWinAmount(amount, rb.rollUnder, modulo, jackpotFee); unlockAmount += possibleWinAmount; if (modulo == 216 && 211 <= rb.rollUnder && rb.rollUnder <= 216) { uint matchDice = rb.rollUnder - 210; uint[] memory dices = tripleDicesTable(roll); uint count = 0; for (uint ii = 0; ii < 3; ii++) { if (matchDice == dices[ii]) { count++; } } if (count == 1) { rollWin += amount * (1 + 1); } else if (count == 2) { rollWin += amount * (1 + 2); } else if (count == 3) { rollWin += amount * (1 + 3); } } else if (modulo == 100) { if (roll < rb.rollUnder) { rollWin += possibleWinAmount; } } else if (result & rb.mask != 0) { rollWin += possibleWinAmount; } } // Unlock the bet amount, regardless of the outcome. lockedInBets -= uint128(unlockAmount); // Roll for a jackpot (if eligible). uint jackpotWin = 0; if (jackpotFee > 0) { // The second modulo, statistically independent from the "main" dice roll. // Effectively you are playing two games at once! uint jackpotRng = (uint(entropy) / modulo) % JACKPOT_MODULO; // Bingo! if (jackpotRng == 888 || IS_DEV) { jackpotWin = jackpotSize; jackpotSize = 0; } } address payable gambler = bet.gambler; // Log jackpot win. if (jackpotWin > 0) { emit JackpotPayment(gambler, jackpotWin, commit); } // Send the funds to gambler. sendFunds(gambler, rollWin + jackpotWin == 0 ? 1 wei : rollWin + jackpotWin, rollWin, commit); } function refundBet(uint commit) external { Bet storage bet = bets[commit]; if (bet.status == 0) { refundBetSingle(commit); return; } require(bet.status == 1, "bet should be in a 'placed' status"); // Check that bet has already expired. require(block.number > bet.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); // move into 'refunded' status bet.status = 3; uint refundAmount = 0; uint unlockAmount = 0; uint jackpotFee; uint len = bet.rawBet.length; uint modulo = bet.modulo; for (uint256 i = 0; i < len; i++) { RawBet memory rb = bet.rawBet[i]; //szabo -> wei uint amount = uint(rb.amount) * 10 ** 12; uint possibleWinAmount; (possibleWinAmount, jackpotFee) = getWinAmount(amount, rb.rollUnder, modulo, jackpotFee); unlockAmount += possibleWinAmount; refundAmount += amount; } // Unlock the bet amount, regardless of the outcome. lockedInBets -= uint128(unlockAmount); if (jackpotSize >= jackpotFee) { jackpotSize -= uint128(jackpotFee); } // Send the refund. sendFunds(bet.gambler, refundAmount, refundAmount, commit); } ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// function placeBetSingle(uint betMask, uint modulo, uint commitLastBlock, uint commit, bytes32 r, bytes32 s, uint source) public payable { require(!stopped, "contract stopped"); SingleBet storage bet = singleBets[commit]; // Check that the bet is in 'clean' state. require(bet.status == 0 && bets[commit].status == 0, "Bet should be in a 'clean' state."); // Validate input data ranges. uint amount = msg.value; require(modulo >= 2 && modulo <= MAX_MODULO, "Modulo should be within range."); // 2**(8*9) wei / 10**18 = 4722 ether require(amount >= MIN_BET && amount <= 4721 ether, "Amount should be within range."); require(betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range."); // Check that commit is valid - it has not expired and its signature is valid. require(block.number <= commitLastBlock, "Commit has expired."); bytes32 signatureHash = keccak256(abi.encodePacked(commitLastBlock, commit)); require(secretSigner == ecrecover(signatureHash, 27, r, s), "ECDSA signature is not valid."); uint rollUnder; if (modulo <= MASK_MODULO_40) { // Small modulo games specify bet outcomes via bit mask. // rollUnder is a number of 1 bits in this mask (population count). // This magic looking formula is an efficient way to compute population // count on EVM for numbers below 2**40. rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO; bet.mask = uint216(betMask); } else if (modulo <= MASK_MODULO_40 * 2) { rollUnder = getRollUnder(betMask, 2); bet.mask = uint216(betMask); } else if (modulo == 100) { require(betMask > 0 && betMask <= modulo, "modulo=100: betMask larger than modulo"); rollUnder = betMask; bet.mask = uint216(betMask); } else if (modulo <= MASK_MODULO_40 * 3) { rollUnder = getRollUnder(betMask, 3); bet.mask = uint216(betMask); } else if (modulo <= MASK_MODULO_40 * 4) { rollUnder = getRollUnder(betMask, 4); bet.mask = uint216(betMask); } else if (modulo <= MASK_MODULO_40 * 5) { rollUnder = getRollUnder(betMask, 5); bet.mask = uint216(betMask); } else {//if (modulo <= MAX_MODULO) rollUnder = getRollUnder(betMask, 6); bet.mask = uint216(betMask); } // Winning amount and jackpot increase. uint possibleWinAmount; uint jackpotFee; // emit DebugUint("rollUnder", rollUnder); (possibleWinAmount, jackpotFee) = getWinAmount(amount, rollUnder, modulo, jackpotFee); require(possibleWinAmount > 0, "invalid rollUnder -> zero possibleWinAmount"); // Enforce max profit limit. require(possibleWinAmount <= amount + maxProfit, "maxProfit limit violation."); // Lock funds. lockedInBets += uint128(possibleWinAmount); jackpotSize += uint128(jackpotFee); // Check whether contract has enough funds to process this bet. require(jackpotSize + lockedInBets <= address(this).balance, "Cannot afford to lose this bet."); // Record commit in logs. emit Commit(commit, source); // Store bet parameters on blockchain. bet.amount = uint72(amount); bet.modulo = uint8(modulo); bet.rollUnder = uint8(rollUnder); bet.placeBlockNumber = uint40(block.number); bet.gambler = msg.sender; bet.status = 1; } function settleBetSingle(uint reveal, bytes32 blockHash) external onlyCroupier { uint commit = uint(keccak256(abi.encodePacked(reveal))); SingleBet storage bet = singleBets[commit]; { uint placeBlockNumber = bet.placeBlockNumber; require(blockhash(placeBlockNumber) == blockHash, "blockHash invalid"); require(block.number > placeBlockNumber, "settleBet in the same block as placeBet, or before."); require(block.number <= placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); } // Fetch bet parameters into local variables (to save gas). uint amount = bet.amount; uint modulo = bet.modulo; uint rollUnder = bet.rollUnder; address payable gambler = bet.gambler; // Check that bet is in 'active' state. require(bet.status == 1, "Bet should be in an 'active' state"); // move into 'settled' status bet.status = 2; // The RNG - combine "reveal" and blockhash of placeBet using Keccak256. Miners // are not aware of "reveal" and cannot deduce it from "commit" (as Keccak256 // preimage is intractable), and house is unable to alter the "reveal" after // placeBet have been mined (as Keccak256 collision finding is also intractable). bytes32 entropy = keccak256(abi.encodePacked(reveal, blockHash)); // Do a roll by taking a modulo of entropy. Compute winning amount. uint dice = uint(entropy) % modulo; (uint diceWinAmount, uint jackpotFee) = getWinAmount(amount, rollUnder, modulo, 0); uint diceWin = 0; uint jackpotWin = 0; // Determine dice outcome. if (modulo == 216 && 211 <= rollUnder && rollUnder <= 216) { uint matchDice = rollUnder - 210; uint[] memory dices = tripleDicesTable(dice); uint count = 0; for (uint ii = 0; ii < 3; ii++) { if (matchDice == dices[ii]) { count++; } } if (count == 1) { diceWin += amount * (1 + 1); } else if (count == 2) { diceWin += amount * (1 + 2); } else if (count == 3) { diceWin += amount * (1 + 3); } } else if (modulo == 100) { // For larger modulos, check inclusion into half-open interval. if (dice < rollUnder) { diceWin = diceWinAmount; } } else { // For small modulo games, check the outcome against a bit mask. if ((2 ** dice) & bet.mask != 0) { diceWin = diceWinAmount; } } // Unlock the bet amount, regardless of the outcome. lockedInBets -= uint128(diceWinAmount); // Roll for a jackpot (if eligible). if (jackpotFee > 0) { // The second modulo, statistically independent from the "main" dice roll. // Effectively you are playing two games at once! uint jackpotRng = (uint(entropy) / modulo) % JACKPOT_MODULO; // Bingo! if (jackpotRng == 888 || IS_DEV) { jackpotWin = jackpotSize; jackpotSize = 0; } } // Log jackpot win. if (jackpotWin > 0) { emit JackpotPayment(gambler, jackpotWin, commit); } // Send the funds to gambler. sendFunds(gambler, diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin, diceWin, commit); } function refundBetSingle(uint commit) private { // Check that bet is in 'active' state. SingleBet storage bet = singleBets[commit]; uint amount = bet.amount; require(bet.status == 1, "bet should be in a 'placed' status"); // Check that bet has already expired. require(block.number > bet.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM."); // move into 'refunded' status bet.status = 3; uint diceWinAmount; uint jackpotFee; (diceWinAmount, jackpotFee) = getWinAmount(amount, bet.rollUnder, bet.modulo, 0); lockedInBets -= uint128(diceWinAmount); if (jackpotSize >= jackpotFee) { jackpotSize -= uint128(jackpotFee); } // Send the refund. sendFunds(bet.gambler, amount, amount, commit); } } /* triple dices table 1: 1 1 1 2: 1 1 2 3: 1 1 3 4: 1 1 4 5: 1 1 5 6: 1 1 6 7: 1 2 1 8: 1 2 2 9: 1 2 3 10: 1 2 4 11: 1 2 5 12: 1 2 6 13: 1 3 1 14: 1 3 2 15: 1 3 3 16: 1 3 4 17: 1 3 5 18: 1 3 6 19: 1 4 1 20: 1 4 2 21: 1 4 3 22: 1 4 4 23: 1 4 5 24: 1 4 6 25: 1 5 1 26: 1 5 2 27: 1 5 3 28: 1 5 4 29: 1 5 5 30: 1 5 6 31: 1 6 1 32: 1 6 2 33: 1 6 3 34: 1 6 4 35: 1 6 5 36: 1 6 6 37: 2 1 1 38: 2 1 2 39: 2 1 3 40: 2 1 4 41: 2 1 5 42: 2 1 6 43: 2 2 1 44: 2 2 2 45: 2 2 3 46: 2 2 4 47: 2 2 5 48: 2 2 6 49: 2 3 1 50: 2 3 2 51: 2 3 3 52: 2 3 4 53: 2 3 5 54: 2 3 6 55: 2 4 1 56: 2 4 2 57: 2 4 3 58: 2 4 4 59: 2 4 5 60: 2 4 6 61: 2 5 1 62: 2 5 2 63: 2 5 3 64: 2 5 4 65: 2 5 5 66: 2 5 6 67: 2 6 1 68: 2 6 2 69: 2 6 3 70: 2 6 4 71: 2 6 5 72: 2 6 6 73: 3 1 1 74: 3 1 2 75: 3 1 3 76: 3 1 4 77: 3 1 5 78: 3 1 6 79: 3 2 1 80: 3 2 2 81: 3 2 3 82: 3 2 4 83: 3 2 5 84: 3 2 6 85: 3 3 1 86: 3 3 2 87: 3 3 3 88: 3 3 4 89: 3 3 5 90: 3 3 6 91: 3 4 1 92: 3 4 2 93: 3 4 3 94: 3 4 4 95: 3 4 5 96: 3 4 6 97: 3 5 1 98: 3 5 2 99: 3 5 3 100: 3 5 4 101: 3 5 5 102: 3 5 6 103: 3 6 1 104: 3 6 2 105: 3 6 3 106: 3 6 4 107: 3 6 5 108: 3 6 6 109: 4 1 1 110: 4 1 2 111: 4 1 3 112: 4 1 4 113: 4 1 5 114: 4 1 6 115: 4 2 1 116: 4 2 2 117: 4 2 3 118: 4 2 4 119: 4 2 5 120: 4 2 6 121: 4 3 1 122: 4 3 2 123: 4 3 3 124: 4 3 4 125: 4 3 5 126: 4 3 6 127: 4 4 1 128: 4 4 2 129: 4 4 3 130: 4 4 4 131: 4 4 5 132: 4 4 6 133: 4 5 1 134: 4 5 2 135: 4 5 3 136: 4 5 4 137: 4 5 5 138: 4 5 6 139: 4 6 1 140: 4 6 2 141: 4 6 3 142: 4 6 4 143: 4 6 5 144: 4 6 6 145: 5 1 1 146: 5 1 2 147: 5 1 3 148: 5 1 4 149: 5 1 5 150: 5 1 6 151: 5 2 1 152: 5 2 2 153: 5 2 3 154: 5 2 4 155: 5 2 5 156: 5 2 6 157: 5 3 1 158: 5 3 2 159: 5 3 3 160: 5 3 4 161: 5 3 5 162: 5 3 6 163: 5 4 1 164: 5 4 2 165: 5 4 3 166: 5 4 4 167: 5 4 5 168: 5 4 6 169: 5 5 1 170: 5 5 2 171: 5 5 3 172: 5 5 4 173: 5 5 5 174: 5 5 6 175: 5 6 1 176: 5 6 2 177: 5 6 3 178: 5 6 4 179: 5 6 5 180: 5 6 6 181: 6 1 1 182: 6 1 2 183: 6 1 3 184: 6 1 4 185: 6 1 5 186: 6 1 6 187: 6 2 1 188: 6 2 2 189: 6 2 3 190: 6 2 4 191: 6 2 5 192: 6 2 6 193: 6 3 1 194: 6 3 2 195: 6 3 3 196: 6 3 4 197: 6 3 5 198: 6 3 6 199: 6 4 1 200: 6 4 2 201: 6 4 3 202: 6 4 4 203: 6 4 5 204: 6 4 6 205: 6 5 1 206: 6 5 2 207: 6 5 3 208: 6 5 4 209: 6 5 5 210: 6 5 6 211: 6 6 1 212: 6 6 2 213: 6 6 3 214: 6 6 4 215: 6 6 5 216: 6 6 6 */
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"JACKPOT_MODULO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_JACKPOT_BET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"o","type":"address"}],"name":"setWithdrawer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"o","type":"address"}],"name":"setOwner1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"IS_DEV","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"secretSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner2","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HOUSE_EDGE_OF_TEN_THOUSAND","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jackpotSize","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"o","type":"address"}],"name":"setOwner2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"betMasks","type":"uint256[]"},{"name":"values","type":"uint256[]"},{"name":"commitLastBlock0_commit1_r2_s3","type":"uint256[]"},{"name":"source","type":"uint256"},{"name":"modulo","type":"uint256"}],"name":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxProfit","type":"uint128"}],"name":"setMaxProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"reveal","type":"uint256"}],"name":"reveal2commit","outputs":[{"name":"commit","type":"bytes32"},{"name":"commitUint","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"owner1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"commit","type":"uint256"}],"name":"getBetInfo","outputs":[{"name":"status","type":"uint8"},{"name":"gambler","type":"address"},{"name":"placeBlockNumber","type":"uint256"},{"name":"masks","type":"uint256[]"},{"name":"amounts","type":"uint256[]"},{"name":"rollUnders","type":"uint8[]"},{"name":"modulo","type":"uint256"},{"name":"isSingle","type":"bool"},{"name":"length","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"blockHash","type":"bytes32"}],"name":"settleBetSingle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxProfit","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HOUSE_EDGE_MINIMUM_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"JACKPOT_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"destruct","type":"bool"}],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"blockHash","type":"bytes32"}],"name":"settleBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"withdrawer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newSecretSigner","type":"address"}],"name":"setSecretSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lockedInBets","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"commit","type":"uint256"}],"name":"refundBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCroupier","type":"address"}],"name":"setCroupier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"betMask","type":"uint256"},{"name":"modulo","type":"uint256"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"source","type":"uint256"}],"name":"placeBetSingle","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[{"name":"_owner1","type":"address"},{"name":"_owner2","type":"address"},{"name":"_withdrawer","type":"address"},{"name":"_secretSigner","type":"address"},{"name":"_croupier","type":"address"},{"name":"_maxProfit","type":"uint128"}],"payable":true,"stateMutability":"payable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"commit","type":"uint256"},{"indexed":false,"name":"source","type":"uint256"}],"name":"Commit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"commit","type":"uint256"}],"name":"FailedPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"commit","type":"uint256"}],"name":"Payment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"commit","type":"uint256"}],"name":"JackpotPayment","type":"event"}]
Contract Creation Code
608060405260405160c080613a63833981018060405260c081101561002357600080fd5b508051602082015160408301516060840151608085015160a09095015160048054600160a060020a0319908116600160a060020a03978816179091556005805482169587169590951790945560068054851693861693909317909255600380548416918516919091179055600280549092169290931691909117905560008054610100608860020a0319166101006001608060020a03909316929092029190911760ff191681556139899081906100da90396000f3fe6080604052600436106101f5576000357c010000000000000000000000000000000000000000000000000000000090048063736889141161011f578063c15a483f116100b2578063df88126f11610081578063df88126f1461082d578063e1fdb4b414610842578063f8bb201c1461086c578063f98824da1461089f576101f5565b8063c15a483f14610789578063ca722cdc146107b5578063cdc18424146107e5578063d702087f146107fa576101f5565b8063b539cd55116100ee578063b539cd5514610711578063bcce604014610726578063bf020f611461073b578063c107532914610750576101f5565b8063736889141461056957806375f12b211461057e57806379141f80146105935780638f0b1bb4146106e1576101f5565b8063537af6c4116101975780635f7bb7f1116101665780635f7bb7f1146104c95780636540742f146104fc5780636b5c5f39146105115780637132e64214610526576101f5565b8063537af6c41461033657806357246d231461034b5780635825884f1461037c5780635bcf2ede146103af576101f5565b80631b580620116101d35780631b58062014610294578063346a6c11146102c75780634d61537f146102f05780635270972514610321576101f5565b806301f60217146102255780630cf9349d1461024c5780630d174c2414610261575b600654600160a060020a03163314156102235760065461022390600160a060020a03163460648102016108e0565b005b34801561023157600080fd5b5061023a610a14565b60408051918252519081900360200190f35b34801561025857600080fd5b5061023a610a1a565b34801561026d57600080fd5b506102236004803603602081101561028457600080fd5b5035600160a060020a0316610a26565b3480156102a057600080fd5b50610223600480360360208110156102b757600080fd5b5035600160a060020a0316610ae8565b3480156102d357600080fd5b506102dc610bc5565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b50610305610bca565b60408051600160a060020a039092168252519081900360200190f35b34801561032d57600080fd5b50610305610bd9565b34801561034257600080fd5b5061023a610be8565b34801561035757600080fd5b50610360610bed565b604080516001608060020a039092168252519081900360200190f35b34801561038857600080fd5b506102236004803603602081101561039f57600080fd5b5035600160a060020a0316610c03565b610223600480360360a08110156103c557600080fd5b8101906020810181356401000000008111156103e057600080fd5b8201836020820111156103f257600080fd5b8035906020019184602083028401116401000000008311171561041457600080fd5b91939092909160208101903564010000000081111561043257600080fd5b82018360208201111561044457600080fd5b8035906020019184602083028401116401000000008311171561046657600080fd5b91939092909160208101903564010000000081111561048457600080fd5b82018360208201111561049657600080fd5b803590602001918460208302840111640100000000831117156104b857600080fd5b919350915080359060200135610ce0565b3480156104d557600080fd5b50610223600480360360208110156104ec57600080fd5b50356001608060020a0316611681565b34801561050857600080fd5b5061023a611715565b34801561051d57600080fd5b50610305611720565b34801561053257600080fd5b506105506004803603602081101561054957600080fd5b503561172f565b6040805192835260208301919091528051918290030190f35b34801561057557600080fd5b50610305611755565b34801561058a57600080fd5b506102dc611764565b34801561059f57600080fd5b506105bd600480360360208110156105b657600080fd5b503561176d565b604051808a60ff1660ff16815260200189600160a060020a0316600160a060020a031681526020018881526020018060200180602001806020018781526020018615151515815260200185815260200184810384528a818151815260200191508051906020019060200280838360005b8381101561064557818101518382015260200161062d565b50505050905001848103835289818151815260200191508051906020019060200280838360005b8381101561068457818101518382015260200161066c565b50505050905001848103825288818151815260200191508051906020019060200280838360005b838110156106c35781810151838201526020016106ab565b505050509050019c5050505050505050505050505060405180910390f35b3480156106ed57600080fd5b506102236004803603604081101561070457600080fd5b5080359060200135611b1c565b34801561071d57600080fd5b50610360611f83565b34801561073257600080fd5b5061023a611f97565b34801561074757600080fd5b5061023a611fa2565b34801561075c57600080fd5b506102236004803603604081101561077357600080fd5b50600160a060020a0381351690602001356108e0565b34801561079557600080fd5b50610223600480360360208110156107ac57600080fd5b50351515611fad565b3480156107c157600080fd5b50610223600480360360408110156107d857600080fd5b50803590602001356120b9565b3480156107f157600080fd5b506103056125af565b34801561080657600080fd5b506102236004803603602081101561081d57600080fd5b5035600160a060020a03166125be565b34801561083957600080fd5b50610360612650565b34801561084e57600080fd5b506102236004803603602081101561086557600080fd5b503561265f565b34801561087857600080fd5b506102236004803603602081101561088f57600080fd5b5035600160a060020a03166128af565b610223600480360360e08110156108b557600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612941565b600454600160a060020a03163314806109035750600554600160a060020a031633145b806109185750600654600160a060020a031633145b15156109585760405160e560020a62461bcd0281526004018080602001828103825260308152602001806138976030913960400191505060405180910390fd5b303181111561099b5760405160e560020a62461bcd0281526004018080602001828103825260248152602001806139186024913960400191505060405180910390fd5b60015430316001608060020a0390911682011115610a03576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604482015290519081900360640190fd5b610a10828283600061309b565b5050565b6103e881565b67016345785d8a000081565b600454600160a060020a0316331480610a495750600554600160a060020a031633145b1515610a895760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600160a060020a0381161515610a9e57600080fd5b600654600160a060020a0382811691161415610ab957600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600454600160a060020a0316331480610b0b5750600554600160a060020a031633145b1515610b4b5760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600160a060020a0381161515610b6057600080fd5b600454600160a060020a0382811691161415610b7b57600080fd5b600554600160a060020a0382811691161415610b9657600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600081565b600354600160a060020a031681565b600554600160a060020a031681565b606281565b600154608060020a90046001608060020a031681565b600454600160a060020a0316331480610c265750600554600160a060020a031633145b1515610c665760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600160a060020a0381161515610c7b57600080fd5b600454600160a060020a0382811691161415610c9657600080fd5b600554600160a060020a0382811691161415610cb157600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001871415610d6857610d6388886000818110610cf957fe5b9050602002013582868660008181101515610d1057fe5b90506020020135878760018181101515610d2657fe5b90506020020135888860028181101515610d3c57fe5b6020029190910135905089896003818110610d5357fe5b9050602002013560010288612941565b611677565b60005460ff1615610dc3576040805160e560020a62461bcd02815260206004820152601060248201527f636f6e74726163742073746f7070656400000000000000000000000000000000604482015290519081900360640190fd5b600060088186866001818110610dd557fe5b602090810292909201358352508101919091526040016000208054909150349060d060020a900460ff16158015610e4457506007600087876001818110610e1857fe5b60209081029290920135835250810191909152604001600020546901000000000000000000900460ff16155b1515610e845760405160e560020a62461bcd0281526004018080602001828103825260218152602001806137af6021913960400191505060405180910390fd5b60028310158015610e96575060d88311155b1515610eec576040805160e560020a62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b600189118015610efb57508887145b1515610f0657600080fd5b6000805b88811015610fbc57662386f26fc100008a8a83818110610f2657fe5b9050602002013510158015610f56575068e8b957d2b60ff400008a8a83818110610f4c57fe5b9050602002013511155b1515610f965760405160e560020a62461bcd0281526004018080602001828103825260228152602001806137016022913960400191505060405180910390fd5b610fb2828b8b84818110610fa657fe5b90506020020135613157565b9150600101610f0a565b50808214610fc957600080fd5b86866000818110610fd657fe5b905060200201354311151515611036576040805160e560020a62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b600087878281811061104457fe5b9050602002013588886001818110151561105a57fe5b905060200201356040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050600181601b8a8a600281811015156110a457fe5b602002919091013590508b8b60038181106110bb57fe5b9050602002013560010260405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611119573d6000803e3d6000fd5b5050604051601f190151600354600160a060020a03908116911614905061118a576040805160e560020a62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b506000905080805b8b811015611467576111a26136e0565b6040805160608101909152808f8f858181106111ba57fe5b90506020020135600160d860020a0316815260200164e8d4a510008e8e8681811015156111e357fe5b905060200201358115156111f357fe5b0463ffffffff1681526000602090910152905060288711611256578051603f90600160d860020a031679200000000010000000000800000000040000000002000000000102600080516020613877833981519152160660ff166040820152611312565b6050871161128157805161127490600160d860020a03166002613170565b60ff166040820152611312565b866064141561129957805160ff166040820152611312565b607887116112b757805161127490600160d860020a03166003613170565b60a087116112d557805161127490600160d860020a03166004613170565b60c887116112f357805161127490600160d860020a03166005613170565b805161130990600160d860020a03166006613170565b60ff1660408201525b6000611338826020015163ffffffff1664e8d4a5100002836040015160ff168a87613208565b9450905060008111611394576040805160e560020a62461bcd02815260206004820181905260248201527f696e76616c696420726f6c6c556e646572202d3e207a65726f20616d6f756e74604482015290519081900360640190fd5b61139e8582613157565b6001888101805480830182556000918252602091829020865191018054928701516040909701517affffffffffffffffffffffffffffffffffffffffffffffffffffff19909316600160d860020a03909216919091177fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660d860020a63ffffffff90971696909602959095177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f860020a60ff909216919091021790935594505001611192565b5060005461010090046001608060020a031683018211156114d2576040805160e560020a62461bcd02815260206004820152601a60248201527f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000604482015290519081900360640190fd5b600180546fffffffffffffffffffffffffffffffff1981166001608060020a039182168501821617808216608060020a9182900483168501831682021792839055303183831691909304821601161115611576576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b7facafc53544c2ca5cd4dbfda9282c25a35859f0d4ceb77a8275dca1660b1ed3ad888860018181106115a457fe5b9050602002013587604051808381526020018281526020019250505060405180910390a1505081543360d060020a78ffffffffff000000000000000000000000000000000000000019909216740100000000000000000000000000000000000000004364ffffffffff1602177aff000000000000000000000000000000000000000000000000000019169190911773ffffffffffffffffffffffffffffffffffffffff19161779ff00000000000000000000000000000000000000000000000000191660c860020a60ff85160217909155505b5050505050505050565b600454600160a060020a03163314806116a45750600554600160a060020a031633145b15156116e45760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600080546001608060020a039092166101000270ffffffffffffffffffffffffffffffff0019909216919091179055565b662386f26fc1000081565b600254600160a060020a031681565b604080516020808201939093528151808203840181529082019091528051910120908190565b600454600160a060020a031681565b60005460ff1681565b60008181526008602052604081208054829182916060918291829185918291829160d060020a900460ff1682101561196f578054600182015460408051828152602080840282010190915260ff60d060020a840481169d50600160a060020a0384169c5064ffffffffff740100000000000000000000000000000000000000008504169b5060c860020a90930490921695509250828015611818578160200160208202803883390190505b50965081604051908082528060200260200182016040528015611845578160200160208202803883390190505b50955081604051908082528060200260200182016040528015611872578160200160208202803883390190505b50945060005b82811015611965576001820180548290811061189057fe5b6000918252602090912001548851600160d860020a03909116908990839081106118b657fe5b60209081029091010152600182018054829081106118d057fe5b90600052602060002001600001601b9054906101000a900463ffffffff1663ffffffff1664e8d4a5100002878281518110151561190957fe5b602090810290910101526001820180548290811061192357fe5b90600052602060002001600001601f9054906101000a900460ff16868281518110151561194c57fe5b60ff909216602092830290910190910152600101611878565b5060009250611b0e565b60008b81526007602052604081208054600182015460ff6901000000000000000000830481169e50600160a060020a036c010000000000000000000000008404169d5064ffffffffff9091169b506a0100000000000000000000909104169550908b116119dd5760006119e0565b60015b60ff16925082604051908082528060200260200182016040528015611a0f578160200160208202803883390190505b50975082604051908082528060200260200182016040528015611a3c578160200160208202803883390190505b50965082604051908082528060200260200182016040528015611a69578160200160208202803883390190505b5095506000831115611b08576001810154885165010000000000909104600160d860020a03169089906000908110611a9d57fe5b602090810290910101528054875168ffffffffffffffffff9091169088906000908110611ac657fe5b6020908102919091010152805486516b01000000000000000000000090910460ff169087906000908110611af657fe5b60ff9092166020928302909101909101525b60019350505b509193959799909294969850565b600254600160a060020a03163314611b685760405160e560020a62461bcd02815260040180806020018281038252602c815260200180613803602c913960400191505060405180910390fd5b604080516020808201859052825180830382018152918301835281519181019190912060008181526007909252919020600181015464ffffffffff1680408414611bfc576040805160e560020a62461bcd02815260206004820152601160248201527f626c6f636b4861736820696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b438110611c3d5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806137d06033913960400191505060405180910390fd5b60fa8101431115611c825760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b50805468ffffffffffffffffff81169060ff6a010000000000000000000082048116916b0100000000000000000000008104821691600160a060020a036c01000000000000000000000000830416916901000000000000000000900416600114611d205760405160e560020a62461bcd02815260040180806020018281038252602281526020018061378d6022913960400191505060405180910390fd5b845469ff000000000000000000191669020000000000000000001785556040805160208082018b90528183018a90528251808303840181526060909201909252805191012060008482811515611d7257fe5b069050600080611d858887896000613208565b909250905060008060d889148015611d9e57508760d311155b8015611dab575060d88811155b15611e445760d11988016060611dc0876134b5565b90506000805b6003811015611dfd578281815181101515611ddd57fe5b90602001906020020151841415611df5576001909101905b600101611dc6565b508060011415611e14578c60020285019450611e3c565b8060021415611e2a578c60030285019450611e3c565b8060031415611e3c578c600402850194505b505050611e85565b8860641415611e5e5787851015611e59578391505b611e85565b60018b0154600286900a6501000000000090910416600160d860020a031615611e85578391505b600180546001608060020a03808216879003166fffffffffffffffffffffffffffffffff199091161790556000831115611f085760006103e88a88811515611ec957fe5b04811515611ed357fe5b069050806103781480611ee4575060005b15611f0657600180546001608060020a03808216909255608060020a90041691505b505b6000811115611f555760408051828152602081018e90528151600160a060020a038a16927f16ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd396171229950928290030190a25b611f738783830115611f6957828401611f6c565b60015b848f61309b565b5050505050505050505050505050565b60005461010090046001608060020a031681565b660110d9316ec00081565b66038d7ea4c6800081565b600454600160a060020a0316331480611fd05750600554600160a060020a031633145b15156120105760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b6001546001608060020a03161561205b5760405160e560020a62461bcd02815260040180806020018281038252604881526020018061382f6048913960600191505060405180910390fd5b801561206f57600454600160a060020a0316ff5b6000805460ff19166001178155600454604051600160a060020a0390911691303180156108fc02929091818181858888f19350505050158015610a10573d6000803e3d6000fd5b50565b600254600160a060020a031633146121055760405160e560020a62461bcd02815260040180806020018281038252602c815260200180613803602c913960400191505060405180910390fd5b604080516020808201859052825180830382018152918301835281519181019190912060008181526008909252919020805474010000000000000000000000000000000000000000900464ffffffffff16804084146121ae576040805160e560020a62461bcd02815260206004820152601160248201527f626c6f636b4861736820696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b4381106121ef5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806137d06033913960400191505060405180910390fd5b60fa81014311156122345760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b50805460d060020a900460ff166001146122825760405160e560020a62461bcd02815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b80547aff000000000000000000000000000000000000000000000000000019167a02000000000000000000000000000000000000000000000000000017808255604080516020808201889052818301879052825180830384018152606090920190925280519101209060ff60c860020a909104166000818381151561230357fe5b60018601549190069150600282900a9060009081908190815b818110156124b45761232c6136e0565b60018b0180548390811061233c57fe5b60009182526020808320604080516060810182529190930154600160d860020a038116825263ffffffff60d860020a82041692820183905260ff60f860020a90910416928101839052935064e8d4a51000029061239c9082908d89613208565b978101979650915060d88b1480156123bc5750826040015160ff1660d311155b80156123d0575060d8836040015160ff1611155b1561247057604083015160d1190160ff1660606123ec8c6134b5565b90506000805b600381101561242957828181518110151561240957fe5b90602001906020020151841415612421576001909101905b6001016123f2565b50806001141561244057836002028b019a50612468565b806002141561245657836003028b019a50612468565b806003141561246857836004028b019a505b5050506124a9565b8a6064141561249257826040015160ff168a101561248d57968101965b6124a9565b82518916600160d860020a0316156124a957968101965b50505060010161231c565b50600180546001608060020a03808216869003166fffffffffffffffffffffffffffffffff199091161790556000808311156125395760006103e8898b8115156124fa57fe5b0481151561250457fe5b069050806103781480612515575060005b1561253757600180546001608060020a03808216909255608060020a90041691505b505b8954600160a060020a031660008211156125915760408051838152602081018e90528151600160a060020a038416927f16ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd396171229950928290030190a25b611f7381878401156125a5578388016125a8565b60015b888f61309b565b600654600160a060020a031681565b600454600160a060020a03163314806125e15750600554600160a060020a031633145b15156126215760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001546001608060020a031681565b6000818152600860205260409020805460d060020a900460ff16151561268e576126888261353f565b506120b6565b805460d060020a900460ff166001146126db5760405160e560020a62461bcd02815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b805464ffffffffff740100000000000000000000000000000000000000009091041660fa0143116127405760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b80547aff000000000000000000000000000000000000000000000000000019167a0300000000000000000000000000000000000000000000000000001780825560018201546000918291829160ff60c860020a90910416825b82811015612830576127a96136e0565b600188018054839081106127b957fe5b60009182526020808320604080516060810182529190930154600160d860020a038116825263ffffffff60d860020a82041692820183905260ff60f860020a90910416928101839052935064e8d4a5100002919061281a908390878a613208565b9290990198979097019650945050600101612799565b50600180546fffffffffffffffffffffffffffffffff1981166001608060020a0391821687900382161791829055608060020a90910416831161288f57600180546001608060020a03608060020a808304821687900382160291161790555b85546128a690600160a060020a031686808a61309b565b50505050505050565b600454600160a060020a03163314806128d25750600554600160a060020a031633145b15156129125760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005460ff161561299c576040805160e560020a62461bcd02815260206004820152601060248201527f636f6e74726163742073746f7070656400000000000000000000000000000000604482015290519081900360640190fd5b600084815260076020526040902080546901000000000000000000900460ff161580156129df575060008581526008602052604090205460d060020a900460ff16155b1515612a1f5760405160e560020a62461bcd0281526004018080602001828103825260218152602001806137af6021913960400191505060405180910390fd5b3460028810801590612a32575060d88811155b1515612a88576040805160e560020a62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b662386f26fc100008110158015612aa8575068ffed094711eb2400008111155b1515612afe576040805160e560020a62461bcd02815260206004820152601e60248201527f416d6f756e742073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b600089118015612b11575060d860020a89105b1515612b67576040805160e560020a62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b43871015612bbf576040805160e560020a62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b6040805160208082018a905281830189905282518083038401815260608301808552815191830191909120600090915260808301808552819052601b60a084015260c0830189905260e0830188905292516001926101008082019392601f1981019281900390910190855afa158015612c3c573d6000803e3d6000fd5b5050604051601f190151600354600160a060020a039081169116149050612cad576040805160e560020a62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b600060288a11612d0f575060018301805464ffffffffff1665010000000000600160d860020a038d1602179055603f6000805160206138778339815191527920000000001000000000080000000004000000000200000000018c021606612e36565b60508a11612d4b57612d228b6002613170565b60018501805464ffffffffff1665010000000000600160d860020a038f16021790559050612e36565b8960641415612dcd5760008b118015612d645750898b11155b1515612da45760405160e560020a62461bcd0281526004018080602001828103825260268152602001806137236026913960400191505060405180910390fd5b5060018301805464ffffffffff1665010000000000600160d860020a038d160217905589612e36565b60788a11612de057612d228b6003613170565b60a08a11612df357612d228b6004613170565b60c88a11612e0657612d228b6005613170565b612e118b6006613170565b60018501805464ffffffffff1665010000000000600160d860020a038f160217905590505b600080612e4585848e84613208565b909250905060008211612e8c5760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806138c7602b913960400191505060405180910390fd5b60005461010090046001608060020a03168501821115612ef6576040805160e560020a62461bcd02815260206004820152601a60248201527f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000604482015290519081900360640190fd5b600180546fffffffffffffffffffffffffffffffff1981166001608060020a039182168501821617808216608060020a9182900483168501831682021792839055303183831691909304821601161115612f9a576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b604080518b81526020810189905281517facafc53544c2ca5cd4dbfda9282c25a35859f0d4ceb77a8275dca1660b1ed3ad929181900390910190a15050835460018501805464ffffffffff19164364ffffffffff16179055690100000000000000000068ffffffffffffffffff1990911668ffffffffffffffffff94909416939093176aff0000000000000000000019166a010000000000000000000060ff9b8c1602176bff000000000000000000000019166b01000000000000000000000091909a1602989098176bffffffffffffffffffffffff16336c01000000000000000000000000021769ff000000000000000000191617905550505050505050565b604051600160a060020a0385169084156108fc029085906000818181858888f193505050501561310d5760408051838152602081018390528151600160a060020a038716927f9643c1b5b172b26d5f028be7fe646349bd5e3cd9367bb18f9e825afa828b7d93928290030190a2613151565b60408051848152602081018390528151600160a060020a038716927f0272d3e6608bc3ec0a0f28404d8d5ccf282a8e65df305ee6dfac9cec38a3a745928290030190a25b50505050565b60008282018381101561316957600080fd5b9392505050565b603f60008051602061387783398151915279200000000010000000000800000000040000000002000000000164ffffffffff851602160660015b82811015613201576501000000000090930492603f64ffffffffff851679200000000010000000000800000000040000000002000000000102600080516020613877833981519152160691909101906001016131aa565b5092915050565b6000808360251415613292576000600186141561322757506024613289565b856002141561323857506012613289565b85600314156132495750600c613289565b856004141561325a57506009613289565b856006141561326b57506006613289565b85600c141561327c57506003613289565b8560121415613289575060025b860291506134ac565b8360d81415613394576000606b8614156132ae57506013613387565b85606c14156132bf57506013613387565b85601014156132d057506082613387565b85600114156132e257506107da613387565b85600614156132f4575061014a613387565b8560031415613306575061028a613387565b85600a1415613317575060be613387565b85600f141561332857506082613387565b85601514156133395750605a613387565b856019141561334a57506046613387565b85601b141561335b57506046613387565b85601e141561336c5750603c613387565b60d3861015801561337e575060d88611155b15613387575060285b600a9087020491506134ac565b8460001080156133a45750838511155b15156133fa576040805160e560020a62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b8215156134245767016345785d8a0000861015613418576000613421565b66038d7ea4c680005b90505b6127106062870204660110d9316ec0008110156134455750660110d9316ec0005b8082018710156134895760405160e560020a62461bcd0281526004018080602001828103825260228152602001806137496022913960400191505060405180910390fd5b858583838a03030281151561349a57fe5b04925060008411156134aa578391505b505b94509492505050565b60408051600380825260808201909252606091602082018380388339019050509050602482046001018160008151811015156134ed57fe5b602090810291909101015260068083040660010181600181518110151561351057fe5b602090810290910101526006820660010181600281518110151561353057fe5b60209081029091010152919050565b6000818152600760205260409020805468ffffffffffffffffff81169060ff6901000000000000000000909104166001146135ae5760405160e560020a62461bcd02815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b600182015464ffffffffff1660fa0143116135fd5760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b815469ff0000000000000000001916690300000000000000000017808355600090819061364f90849060ff6b01000000000000000000000082048116916a010000000000000000000090041684613208565b600180546fffffffffffffffffffffffffffffffff1981166001608060020a0391821685900382161791829055929450909250608060020a90041681116136b257600180546001608060020a03608060020a808304821685900382160291161790555b83546136d9906c010000000000000000000000009004600160a060020a031684808861309b565b5050505050565b60408051606081018252600080825260208201819052918101919091529056fe4d696e20416d6f756e742073686f756c642062652077697468696e2072616e67652e6d6f64756c6f3d3130303a206265744d61736b206c6172676572207468616e206d6f64756c6f42657420646f65736e2774206576656e20636f76657220686f75736520656467652e6265742073686f756c6420626520696e20612027706c6163656427207374617475734265742073686f756c6420626520696e20616e2027616374697665272073746174654265742073686f756c6420626520696e20612027636c65616e272073746174652e736574746c6542657420696e207468652073616d6520626c6f636b20617320706c6163654265742c206f72206265666f72652e4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e6f6e2d63726f75706965722e416c6c20626574732073686f756c642062652070726f6365737365642028736574746c6564206f7220726566756e64656429206265666f72652073656c662d64657374727563742e00010410410410410410410410410410410410410410410410410410410410416f6e6c7957697468647261776572206d6574686f64732063616c6c6564206279206e6f6e2d776974686472617765722e696e76616c696420726f6c6c556e646572202d3e207a65726f20706f737369626c6557696e416d6f756e744f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d6f776e65722e576974686472617720616d6f756e74206c6172676572207468616e2062616c616e63652e426c6f636b686173682063616e277420626520717565726965642062792045564d2ea165627a7a723058202038f8114c40077879a3352ed204d83b77897469fc8c90eda39edbe5cc242afb0029000000000000000000000000f27a6ef912cd4df19676f9d490b6e096aa4bfa33000000000000000000000000478f12e08990bfc890db337ee846525e3af456550000000000000000000000009e312b90546f29c0bb5444fffbf16c2a7a1b1a50000000000000000000000000de2552b1cd6123f1b35fa1ec18cc9c8e4ccb3260000000000000000000000000ccccccc3b1ac9d2d02ce052917ee92618e9738b90000000000000000000000000000000000000000000000008ac7230489e80000
Deployed Bytecode
0x6080604052600436106101f5576000357c010000000000000000000000000000000000000000000000000000000090048063736889141161011f578063c15a483f116100b2578063df88126f11610081578063df88126f1461082d578063e1fdb4b414610842578063f8bb201c1461086c578063f98824da1461089f576101f5565b8063c15a483f14610789578063ca722cdc146107b5578063cdc18424146107e5578063d702087f146107fa576101f5565b8063b539cd55116100ee578063b539cd5514610711578063bcce604014610726578063bf020f611461073b578063c107532914610750576101f5565b8063736889141461056957806375f12b211461057e57806379141f80146105935780638f0b1bb4146106e1576101f5565b8063537af6c4116101975780635f7bb7f1116101665780635f7bb7f1146104c95780636540742f146104fc5780636b5c5f39146105115780637132e64214610526576101f5565b8063537af6c41461033657806357246d231461034b5780635825884f1461037c5780635bcf2ede146103af576101f5565b80631b580620116101d35780631b58062014610294578063346a6c11146102c75780634d61537f146102f05780635270972514610321576101f5565b806301f60217146102255780630cf9349d1461024c5780630d174c2414610261575b600654600160a060020a03163314156102235760065461022390600160a060020a03163460648102016108e0565b005b34801561023157600080fd5b5061023a610a14565b60408051918252519081900360200190f35b34801561025857600080fd5b5061023a610a1a565b34801561026d57600080fd5b506102236004803603602081101561028457600080fd5b5035600160a060020a0316610a26565b3480156102a057600080fd5b50610223600480360360208110156102b757600080fd5b5035600160a060020a0316610ae8565b3480156102d357600080fd5b506102dc610bc5565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b50610305610bca565b60408051600160a060020a039092168252519081900360200190f35b34801561032d57600080fd5b50610305610bd9565b34801561034257600080fd5b5061023a610be8565b34801561035757600080fd5b50610360610bed565b604080516001608060020a039092168252519081900360200190f35b34801561038857600080fd5b506102236004803603602081101561039f57600080fd5b5035600160a060020a0316610c03565b610223600480360360a08110156103c557600080fd5b8101906020810181356401000000008111156103e057600080fd5b8201836020820111156103f257600080fd5b8035906020019184602083028401116401000000008311171561041457600080fd5b91939092909160208101903564010000000081111561043257600080fd5b82018360208201111561044457600080fd5b8035906020019184602083028401116401000000008311171561046657600080fd5b91939092909160208101903564010000000081111561048457600080fd5b82018360208201111561049657600080fd5b803590602001918460208302840111640100000000831117156104b857600080fd5b919350915080359060200135610ce0565b3480156104d557600080fd5b50610223600480360360208110156104ec57600080fd5b50356001608060020a0316611681565b34801561050857600080fd5b5061023a611715565b34801561051d57600080fd5b50610305611720565b34801561053257600080fd5b506105506004803603602081101561054957600080fd5b503561172f565b6040805192835260208301919091528051918290030190f35b34801561057557600080fd5b50610305611755565b34801561058a57600080fd5b506102dc611764565b34801561059f57600080fd5b506105bd600480360360208110156105b657600080fd5b503561176d565b604051808a60ff1660ff16815260200189600160a060020a0316600160a060020a031681526020018881526020018060200180602001806020018781526020018615151515815260200185815260200184810384528a818151815260200191508051906020019060200280838360005b8381101561064557818101518382015260200161062d565b50505050905001848103835289818151815260200191508051906020019060200280838360005b8381101561068457818101518382015260200161066c565b50505050905001848103825288818151815260200191508051906020019060200280838360005b838110156106c35781810151838201526020016106ab565b505050509050019c5050505050505050505050505060405180910390f35b3480156106ed57600080fd5b506102236004803603604081101561070457600080fd5b5080359060200135611b1c565b34801561071d57600080fd5b50610360611f83565b34801561073257600080fd5b5061023a611f97565b34801561074757600080fd5b5061023a611fa2565b34801561075c57600080fd5b506102236004803603604081101561077357600080fd5b50600160a060020a0381351690602001356108e0565b34801561079557600080fd5b50610223600480360360208110156107ac57600080fd5b50351515611fad565b3480156107c157600080fd5b50610223600480360360408110156107d857600080fd5b50803590602001356120b9565b3480156107f157600080fd5b506103056125af565b34801561080657600080fd5b506102236004803603602081101561081d57600080fd5b5035600160a060020a03166125be565b34801561083957600080fd5b50610360612650565b34801561084e57600080fd5b506102236004803603602081101561086557600080fd5b503561265f565b34801561087857600080fd5b506102236004803603602081101561088f57600080fd5b5035600160a060020a03166128af565b610223600480360360e08110156108b557600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612941565b600454600160a060020a03163314806109035750600554600160a060020a031633145b806109185750600654600160a060020a031633145b15156109585760405160e560020a62461bcd0281526004018080602001828103825260308152602001806138976030913960400191505060405180910390fd5b303181111561099b5760405160e560020a62461bcd0281526004018080602001828103825260248152602001806139186024913960400191505060405180910390fd5b60015430316001608060020a0390911682011115610a03576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604482015290519081900360640190fd5b610a10828283600061309b565b5050565b6103e881565b67016345785d8a000081565b600454600160a060020a0316331480610a495750600554600160a060020a031633145b1515610a895760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600160a060020a0381161515610a9e57600080fd5b600654600160a060020a0382811691161415610ab957600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600454600160a060020a0316331480610b0b5750600554600160a060020a031633145b1515610b4b5760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600160a060020a0381161515610b6057600080fd5b600454600160a060020a0382811691161415610b7b57600080fd5b600554600160a060020a0382811691161415610b9657600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600081565b600354600160a060020a031681565b600554600160a060020a031681565b606281565b600154608060020a90046001608060020a031681565b600454600160a060020a0316331480610c265750600554600160a060020a031633145b1515610c665760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600160a060020a0381161515610c7b57600080fd5b600454600160a060020a0382811691161415610c9657600080fd5b600554600160a060020a0382811691161415610cb157600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001871415610d6857610d6388886000818110610cf957fe5b9050602002013582868660008181101515610d1057fe5b90506020020135878760018181101515610d2657fe5b90506020020135888860028181101515610d3c57fe5b6020029190910135905089896003818110610d5357fe5b9050602002013560010288612941565b611677565b60005460ff1615610dc3576040805160e560020a62461bcd02815260206004820152601060248201527f636f6e74726163742073746f7070656400000000000000000000000000000000604482015290519081900360640190fd5b600060088186866001818110610dd557fe5b602090810292909201358352508101919091526040016000208054909150349060d060020a900460ff16158015610e4457506007600087876001818110610e1857fe5b60209081029290920135835250810191909152604001600020546901000000000000000000900460ff16155b1515610e845760405160e560020a62461bcd0281526004018080602001828103825260218152602001806137af6021913960400191505060405180910390fd5b60028310158015610e96575060d88311155b1515610eec576040805160e560020a62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b600189118015610efb57508887145b1515610f0657600080fd5b6000805b88811015610fbc57662386f26fc100008a8a83818110610f2657fe5b9050602002013510158015610f56575068e8b957d2b60ff400008a8a83818110610f4c57fe5b9050602002013511155b1515610f965760405160e560020a62461bcd0281526004018080602001828103825260228152602001806137016022913960400191505060405180910390fd5b610fb2828b8b84818110610fa657fe5b90506020020135613157565b9150600101610f0a565b50808214610fc957600080fd5b86866000818110610fd657fe5b905060200201354311151515611036576040805160e560020a62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b600087878281811061104457fe5b9050602002013588886001818110151561105a57fe5b905060200201356040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050600181601b8a8a600281811015156110a457fe5b602002919091013590508b8b60038181106110bb57fe5b9050602002013560010260405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611119573d6000803e3d6000fd5b5050604051601f190151600354600160a060020a03908116911614905061118a576040805160e560020a62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b506000905080805b8b811015611467576111a26136e0565b6040805160608101909152808f8f858181106111ba57fe5b90506020020135600160d860020a0316815260200164e8d4a510008e8e8681811015156111e357fe5b905060200201358115156111f357fe5b0463ffffffff1681526000602090910152905060288711611256578051603f90600160d860020a031679200000000010000000000800000000040000000002000000000102600080516020613877833981519152160660ff166040820152611312565b6050871161128157805161127490600160d860020a03166002613170565b60ff166040820152611312565b866064141561129957805160ff166040820152611312565b607887116112b757805161127490600160d860020a03166003613170565b60a087116112d557805161127490600160d860020a03166004613170565b60c887116112f357805161127490600160d860020a03166005613170565b805161130990600160d860020a03166006613170565b60ff1660408201525b6000611338826020015163ffffffff1664e8d4a5100002836040015160ff168a87613208565b9450905060008111611394576040805160e560020a62461bcd02815260206004820181905260248201527f696e76616c696420726f6c6c556e646572202d3e207a65726f20616d6f756e74604482015290519081900360640190fd5b61139e8582613157565b6001888101805480830182556000918252602091829020865191018054928701516040909701517affffffffffffffffffffffffffffffffffffffffffffffffffffff19909316600160d860020a03909216919091177fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660d860020a63ffffffff90971696909602959095177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f860020a60ff909216919091021790935594505001611192565b5060005461010090046001608060020a031683018211156114d2576040805160e560020a62461bcd02815260206004820152601a60248201527f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000604482015290519081900360640190fd5b600180546fffffffffffffffffffffffffffffffff1981166001608060020a039182168501821617808216608060020a9182900483168501831682021792839055303183831691909304821601161115611576576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b7facafc53544c2ca5cd4dbfda9282c25a35859f0d4ceb77a8275dca1660b1ed3ad888860018181106115a457fe5b9050602002013587604051808381526020018281526020019250505060405180910390a1505081543360d060020a78ffffffffff000000000000000000000000000000000000000019909216740100000000000000000000000000000000000000004364ffffffffff1602177aff000000000000000000000000000000000000000000000000000019169190911773ffffffffffffffffffffffffffffffffffffffff19161779ff00000000000000000000000000000000000000000000000000191660c860020a60ff85160217909155505b5050505050505050565b600454600160a060020a03163314806116a45750600554600160a060020a031633145b15156116e45760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b600080546001608060020a039092166101000270ffffffffffffffffffffffffffffffff0019909216919091179055565b662386f26fc1000081565b600254600160a060020a031681565b604080516020808201939093528151808203840181529082019091528051910120908190565b600454600160a060020a031681565b60005460ff1681565b60008181526008602052604081208054829182916060918291829185918291829160d060020a900460ff1682101561196f578054600182015460408051828152602080840282010190915260ff60d060020a840481169d50600160a060020a0384169c5064ffffffffff740100000000000000000000000000000000000000008504169b5060c860020a90930490921695509250828015611818578160200160208202803883390190505b50965081604051908082528060200260200182016040528015611845578160200160208202803883390190505b50955081604051908082528060200260200182016040528015611872578160200160208202803883390190505b50945060005b82811015611965576001820180548290811061189057fe5b6000918252602090912001548851600160d860020a03909116908990839081106118b657fe5b60209081029091010152600182018054829081106118d057fe5b90600052602060002001600001601b9054906101000a900463ffffffff1663ffffffff1664e8d4a5100002878281518110151561190957fe5b602090810290910101526001820180548290811061192357fe5b90600052602060002001600001601f9054906101000a900460ff16868281518110151561194c57fe5b60ff909216602092830290910190910152600101611878565b5060009250611b0e565b60008b81526007602052604081208054600182015460ff6901000000000000000000830481169e50600160a060020a036c010000000000000000000000008404169d5064ffffffffff9091169b506a0100000000000000000000909104169550908b116119dd5760006119e0565b60015b60ff16925082604051908082528060200260200182016040528015611a0f578160200160208202803883390190505b50975082604051908082528060200260200182016040528015611a3c578160200160208202803883390190505b50965082604051908082528060200260200182016040528015611a69578160200160208202803883390190505b5095506000831115611b08576001810154885165010000000000909104600160d860020a03169089906000908110611a9d57fe5b602090810290910101528054875168ffffffffffffffffff9091169088906000908110611ac657fe5b6020908102919091010152805486516b01000000000000000000000090910460ff169087906000908110611af657fe5b60ff9092166020928302909101909101525b60019350505b509193959799909294969850565b600254600160a060020a03163314611b685760405160e560020a62461bcd02815260040180806020018281038252602c815260200180613803602c913960400191505060405180910390fd5b604080516020808201859052825180830382018152918301835281519181019190912060008181526007909252919020600181015464ffffffffff1680408414611bfc576040805160e560020a62461bcd02815260206004820152601160248201527f626c6f636b4861736820696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b438110611c3d5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806137d06033913960400191505060405180910390fd5b60fa8101431115611c825760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b50805468ffffffffffffffffff81169060ff6a010000000000000000000082048116916b0100000000000000000000008104821691600160a060020a036c01000000000000000000000000830416916901000000000000000000900416600114611d205760405160e560020a62461bcd02815260040180806020018281038252602281526020018061378d6022913960400191505060405180910390fd5b845469ff000000000000000000191669020000000000000000001785556040805160208082018b90528183018a90528251808303840181526060909201909252805191012060008482811515611d7257fe5b069050600080611d858887896000613208565b909250905060008060d889148015611d9e57508760d311155b8015611dab575060d88811155b15611e445760d11988016060611dc0876134b5565b90506000805b6003811015611dfd578281815181101515611ddd57fe5b90602001906020020151841415611df5576001909101905b600101611dc6565b508060011415611e14578c60020285019450611e3c565b8060021415611e2a578c60030285019450611e3c565b8060031415611e3c578c600402850194505b505050611e85565b8860641415611e5e5787851015611e59578391505b611e85565b60018b0154600286900a6501000000000090910416600160d860020a031615611e85578391505b600180546001608060020a03808216879003166fffffffffffffffffffffffffffffffff199091161790556000831115611f085760006103e88a88811515611ec957fe5b04811515611ed357fe5b069050806103781480611ee4575060005b15611f0657600180546001608060020a03808216909255608060020a90041691505b505b6000811115611f555760408051828152602081018e90528151600160a060020a038a16927f16ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd396171229950928290030190a25b611f738783830115611f6957828401611f6c565b60015b848f61309b565b5050505050505050505050505050565b60005461010090046001608060020a031681565b660110d9316ec00081565b66038d7ea4c6800081565b600454600160a060020a0316331480611fd05750600554600160a060020a031633145b15156120105760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b6001546001608060020a03161561205b5760405160e560020a62461bcd02815260040180806020018281038252604881526020018061382f6048913960600191505060405180910390fd5b801561206f57600454600160a060020a0316ff5b6000805460ff19166001178155600454604051600160a060020a0390911691303180156108fc02929091818181858888f19350505050158015610a10573d6000803e3d6000fd5b50565b600254600160a060020a031633146121055760405160e560020a62461bcd02815260040180806020018281038252602c815260200180613803602c913960400191505060405180910390fd5b604080516020808201859052825180830382018152918301835281519181019190912060008181526008909252919020805474010000000000000000000000000000000000000000900464ffffffffff16804084146121ae576040805160e560020a62461bcd02815260206004820152601160248201527f626c6f636b4861736820696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b4381106121ef5760405160e560020a62461bcd0281526004018080602001828103825260338152602001806137d06033913960400191505060405180910390fd5b60fa81014311156122345760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b50805460d060020a900460ff166001146122825760405160e560020a62461bcd02815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b80547aff000000000000000000000000000000000000000000000000000019167a02000000000000000000000000000000000000000000000000000017808255604080516020808201889052818301879052825180830384018152606090920190925280519101209060ff60c860020a909104166000818381151561230357fe5b60018601549190069150600282900a9060009081908190815b818110156124b45761232c6136e0565b60018b0180548390811061233c57fe5b60009182526020808320604080516060810182529190930154600160d860020a038116825263ffffffff60d860020a82041692820183905260ff60f860020a90910416928101839052935064e8d4a51000029061239c9082908d89613208565b978101979650915060d88b1480156123bc5750826040015160ff1660d311155b80156123d0575060d8836040015160ff1611155b1561247057604083015160d1190160ff1660606123ec8c6134b5565b90506000805b600381101561242957828181518110151561240957fe5b90602001906020020151841415612421576001909101905b6001016123f2565b50806001141561244057836002028b019a50612468565b806002141561245657836003028b019a50612468565b806003141561246857836004028b019a505b5050506124a9565b8a6064141561249257826040015160ff168a101561248d57968101965b6124a9565b82518916600160d860020a0316156124a957968101965b50505060010161231c565b50600180546001608060020a03808216869003166fffffffffffffffffffffffffffffffff199091161790556000808311156125395760006103e8898b8115156124fa57fe5b0481151561250457fe5b069050806103781480612515575060005b1561253757600180546001608060020a03808216909255608060020a90041691505b505b8954600160a060020a031660008211156125915760408051838152602081018e90528151600160a060020a038416927f16ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd396171229950928290030190a25b611f7381878401156125a5578388016125a8565b60015b888f61309b565b600654600160a060020a031681565b600454600160a060020a03163314806125e15750600554600160a060020a031633145b15156126215760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001546001608060020a031681565b6000818152600860205260409020805460d060020a900460ff16151561268e576126888261353f565b506120b6565b805460d060020a900460ff166001146126db5760405160e560020a62461bcd02815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b805464ffffffffff740100000000000000000000000000000000000000009091041660fa0143116127405760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b80547aff000000000000000000000000000000000000000000000000000019167a0300000000000000000000000000000000000000000000000000001780825560018201546000918291829160ff60c860020a90910416825b82811015612830576127a96136e0565b600188018054839081106127b957fe5b60009182526020808320604080516060810182529190930154600160d860020a038116825263ffffffff60d860020a82041692820183905260ff60f860020a90910416928101839052935064e8d4a5100002919061281a908390878a613208565b9290990198979097019650945050600101612799565b50600180546fffffffffffffffffffffffffffffffff1981166001608060020a0391821687900382161791829055608060020a90910416831161288f57600180546001608060020a03608060020a808304821687900382160291161790555b85546128a690600160a060020a031686808a61309b565b50505050505050565b600454600160a060020a03163314806128d25750600554600160a060020a031633145b15156129125760405160e560020a62461bcd0281526004018080602001828103825260268152602001806138f26026913960400191505060405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60005460ff161561299c576040805160e560020a62461bcd02815260206004820152601060248201527f636f6e74726163742073746f7070656400000000000000000000000000000000604482015290519081900360640190fd5b600084815260076020526040902080546901000000000000000000900460ff161580156129df575060008581526008602052604090205460d060020a900460ff16155b1515612a1f5760405160e560020a62461bcd0281526004018080602001828103825260218152602001806137af6021913960400191505060405180910390fd5b3460028810801590612a32575060d88811155b1515612a88576040805160e560020a62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b662386f26fc100008110158015612aa8575068ffed094711eb2400008111155b1515612afe576040805160e560020a62461bcd02815260206004820152601e60248201527f416d6f756e742073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b600089118015612b11575060d860020a89105b1515612b67576040805160e560020a62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b43871015612bbf576040805160e560020a62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b6040805160208082018a905281830189905282518083038401815260608301808552815191830191909120600090915260808301808552819052601b60a084015260c0830189905260e0830188905292516001926101008082019392601f1981019281900390910190855afa158015612c3c573d6000803e3d6000fd5b5050604051601f190151600354600160a060020a039081169116149050612cad576040805160e560020a62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b600060288a11612d0f575060018301805464ffffffffff1665010000000000600160d860020a038d1602179055603f6000805160206138778339815191527920000000001000000000080000000004000000000200000000018c021606612e36565b60508a11612d4b57612d228b6002613170565b60018501805464ffffffffff1665010000000000600160d860020a038f16021790559050612e36565b8960641415612dcd5760008b118015612d645750898b11155b1515612da45760405160e560020a62461bcd0281526004018080602001828103825260268152602001806137236026913960400191505060405180910390fd5b5060018301805464ffffffffff1665010000000000600160d860020a038d160217905589612e36565b60788a11612de057612d228b6003613170565b60a08a11612df357612d228b6004613170565b60c88a11612e0657612d228b6005613170565b612e118b6006613170565b60018501805464ffffffffff1665010000000000600160d860020a038f160217905590505b600080612e4585848e84613208565b909250905060008211612e8c5760405160e560020a62461bcd02815260040180806020018281038252602b8152602001806138c7602b913960400191505060405180910390fd5b60005461010090046001608060020a03168501821115612ef6576040805160e560020a62461bcd02815260206004820152601a60248201527f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000604482015290519081900360640190fd5b600180546fffffffffffffffffffffffffffffffff1981166001608060020a039182168501821617808216608060020a9182900483168501831682021792839055303183831691909304821601161115612f9a576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b604080518b81526020810189905281517facafc53544c2ca5cd4dbfda9282c25a35859f0d4ceb77a8275dca1660b1ed3ad929181900390910190a15050835460018501805464ffffffffff19164364ffffffffff16179055690100000000000000000068ffffffffffffffffff1990911668ffffffffffffffffff94909416939093176aff0000000000000000000019166a010000000000000000000060ff9b8c1602176bff000000000000000000000019166b01000000000000000000000091909a1602989098176bffffffffffffffffffffffff16336c01000000000000000000000000021769ff000000000000000000191617905550505050505050565b604051600160a060020a0385169084156108fc029085906000818181858888f193505050501561310d5760408051838152602081018390528151600160a060020a038716927f9643c1b5b172b26d5f028be7fe646349bd5e3cd9367bb18f9e825afa828b7d93928290030190a2613151565b60408051848152602081018390528151600160a060020a038716927f0272d3e6608bc3ec0a0f28404d8d5ccf282a8e65df305ee6dfac9cec38a3a745928290030190a25b50505050565b60008282018381101561316957600080fd5b9392505050565b603f60008051602061387783398151915279200000000010000000000800000000040000000002000000000164ffffffffff851602160660015b82811015613201576501000000000090930492603f64ffffffffff851679200000000010000000000800000000040000000002000000000102600080516020613877833981519152160691909101906001016131aa565b5092915050565b6000808360251415613292576000600186141561322757506024613289565b856002141561323857506012613289565b85600314156132495750600c613289565b856004141561325a57506009613289565b856006141561326b57506006613289565b85600c141561327c57506003613289565b8560121415613289575060025b860291506134ac565b8360d81415613394576000606b8614156132ae57506013613387565b85606c14156132bf57506013613387565b85601014156132d057506082613387565b85600114156132e257506107da613387565b85600614156132f4575061014a613387565b8560031415613306575061028a613387565b85600a1415613317575060be613387565b85600f141561332857506082613387565b85601514156133395750605a613387565b856019141561334a57506046613387565b85601b141561335b57506046613387565b85601e141561336c5750603c613387565b60d3861015801561337e575060d88611155b15613387575060285b600a9087020491506134ac565b8460001080156133a45750838511155b15156133fa576040805160e560020a62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b8215156134245767016345785d8a0000861015613418576000613421565b66038d7ea4c680005b90505b6127106062870204660110d9316ec0008110156134455750660110d9316ec0005b8082018710156134895760405160e560020a62461bcd0281526004018080602001828103825260228152602001806137496022913960400191505060405180910390fd5b858583838a03030281151561349a57fe5b04925060008411156134aa578391505b505b94509492505050565b60408051600380825260808201909252606091602082018380388339019050509050602482046001018160008151811015156134ed57fe5b602090810291909101015260068083040660010181600181518110151561351057fe5b602090810290910101526006820660010181600281518110151561353057fe5b60209081029091010152919050565b6000818152600760205260409020805468ffffffffffffffffff81169060ff6901000000000000000000909104166001146135ae5760405160e560020a62461bcd02815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b600182015464ffffffffff1660fa0143116135fd5760405160e560020a62461bcd02815260040180806020018281038252602281526020018061393c6022913960400191505060405180910390fd5b815469ff0000000000000000001916690300000000000000000017808355600090819061364f90849060ff6b01000000000000000000000082048116916a010000000000000000000090041684613208565b600180546fffffffffffffffffffffffffffffffff1981166001608060020a0391821685900382161791829055929450909250608060020a90041681116136b257600180546001608060020a03608060020a808304821685900382160291161790555b83546136d9906c010000000000000000000000009004600160a060020a031684808861309b565b5050505050565b60408051606081018252600080825260208201819052918101919091529056fe4d696e20416d6f756e742073686f756c642062652077697468696e2072616e67652e6d6f64756c6f3d3130303a206265744d61736b206c6172676572207468616e206d6f64756c6f42657420646f65736e2774206576656e20636f76657220686f75736520656467652e6265742073686f756c6420626520696e20612027706c6163656427207374617475734265742073686f756c6420626520696e20616e2027616374697665272073746174654265742073686f756c6420626520696e20612027636c65616e272073746174652e736574746c6542657420696e207468652073616d6520626c6f636b20617320706c6163654265742c206f72206265666f72652e4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e6f6e2d63726f75706965722e416c6c20626574732073686f756c642062652070726f6365737365642028736574746c6564206f7220726566756e64656429206265666f72652073656c662d64657374727563742e00010410410410410410410410410410410410410410410410410410410410416f6e6c7957697468647261776572206d6574686f64732063616c6c6564206279206e6f6e2d776974686472617765722e696e76616c696420726f6c6c556e646572202d3e207a65726f20706f737369626c6557696e416d6f756e744f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d6f776e65722e576974686472617720616d6f756e74206c6172676572207468616e2062616c616e63652e426c6f636b686173682063616e277420626520717565726965642062792045564d2ea165627a7a723058202038f8114c40077879a3352ed204d83b77897469fc8c90eda39edbe5cc242afb0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f27a6ef912cd4df19676f9d490b6e096aa4bfa33000000000000000000000000478f12e08990bfc890db337ee846525e3af456550000000000000000000000009e312b90546f29c0bb5444fffbf16c2a7a1b1a50000000000000000000000000de2552b1cd6123f1b35fa1ec18cc9c8e4ccb3260000000000000000000000000ccccccc3b1ac9d2d02ce052917ee92618e9738b90000000000000000000000000000000000000000000000008ac7230489e80000
-----Decoded View---------------
Arg [0] : _owner1 (address): 0xf27a6ef912cD4df19676F9d490b6E096aa4bfa33
Arg [1] : _owner2 (address): 0x478f12e08990bFc890Db337ee846525E3Af45655
Arg [2] : _withdrawer (address): 0x9e312B90546F29c0bB5444FFfBF16c2a7a1B1a50
Arg [3] : _secretSigner (address): 0xde2552b1Cd6123f1B35fa1EC18cc9C8E4CCb3260
Arg [4] : _croupier (address): 0xCCCcccC3b1ac9d2d02Ce052917Ee92618E9738b9
Arg [5] : _maxProfit (uint128): 10000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000f27a6ef912cd4df19676f9d490b6e096aa4bfa33
Arg [1] : 000000000000000000000000478f12e08990bfc890db337ee846525e3af45655
Arg [2] : 0000000000000000000000009e312b90546f29c0bb5444fffbf16c2a7a1b1a50
Arg [3] : 000000000000000000000000de2552b1cd6123f1b35fa1ec18cc9c8e4ccb3260
Arg [4] : 000000000000000000000000ccccccc3b1ac9d2d02ce052917ee92618e9738b9
Arg [5] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Swarm Source
bzzr://2038f8114c40077879a3352ed204d83b77897469fc8c90eda39edbe5cc242afb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,290.37 | 0.4476 | $1,472.83 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.