ETH Price: $3,290.37 (-0.28%)

Contract

0xDDdDddD1fd4E3708869c00CAbE6b0B9D15181bb9
 

Overview

ETH Balance

0.447619999999986027 ETH

Eth Value

$1,472.83 (@ $3,290.37/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Settle Bet Singl...81565122019-07-15 15:56:061987 days ago1563206166IN
FCK.com: Roulette
0 ETH0.0006432819.3765747
Place Bet Single81565112019-07-15 15:55:471987 days ago1563206147IN
FCK.com: Roulette
0.05 ETH0.0011561911.15
Settle Bet Singl...81565092019-07-15 15:55:131987 days ago1563206113IN
FCK.com: Roulette
0 ETH0.0006602919.88888888
Place Bet Single81565072019-07-15 15:54:581987 days ago1563206098IN
FCK.com: Roulette
0.03 ETH0.0012878912.42
Settle Bet81565002019-07-15 15:53:051987 days ago1563205985IN
FCK.com: Roulette
0 ETH0.0008664420.58888888
Place Bet81564992019-07-15 15:52:571987 days ago1563205977IN
FCK.com: Roulette
0.06 ETH0.0036864314
Settle Bet81564932019-07-15 15:51:511987 days ago1563205911IN
FCK.com: Roulette
0 ETH0.0008788120.88888888
Place Bet81564892019-07-15 15:51:081987 days ago1563205868IN
FCK.com: Roulette
0.06 ETH0.0037970314.42
Settle Bet81564832019-07-15 15:50:361987 days ago1563205836IN
FCK.com: Roulette
0 ETH0.0008473120.88888888
Place Bet81564802019-07-15 15:50:131987 days ago1563205813IN
FCK.com: Roulette
0.05 ETH0.0030574713
Settle Bet Singl...81564732019-07-15 15:48:431987 days ago1563205723IN
FCK.com: Roulette
0 ETH0.0006939920.88888888
Place Bet Single81564702019-07-15 15:46:541987 days ago1563205614IN
FCK.com: Roulette
0.05 ETH0.0013480313
Settle Bet81564682019-07-15 15:46:291987 days ago1563205589IN
FCK.com: Roulette
0 ETH0.0008156220.88888888
Place Bet81564662019-07-15 15:45:441987 days ago1563205544IN
FCK.com: Roulette
0.08 ETH0.0026936713
Settle Bet81564612019-07-15 15:45:121987 days ago1563205512IN
FCK.com: Roulette
0 ETH0.0007530820.88888888
Place Bet81564582019-07-15 15:45:011987 days ago1563205501IN
FCK.com: Roulette
0.06 ETH0.0025119616.65
Settle Bet81564552019-07-15 15:44:201987 days ago1563205460IN
FCK.com: Roulette
0 ETH0.0008788120.88888888
Place Bet81564532019-07-15 15:44:101987 days ago1563205450IN
FCK.com: Roulette
0.09 ETH0.0038071714.455
Settle Bet81564482019-07-15 15:42:521987 days ago1563205372IN
FCK.com: Roulette
0 ETH0.0007768719.88888888
Place Bet81564442019-07-15 15:42:071987 days ago1563205327IN
FCK.com: Roulette
0.05 ETH0.004139320
Settle Bet Singl...81564062019-07-15 15:33:151988 days ago1563204795IN
FCK.com: Roulette
0 ETH0.0003732313.88888888
Settle Bet Singl...81564062019-07-15 15:33:151988 days ago1563204795IN
FCK.com: Roulette
0 ETH0.0004614313.88888888
Settle Bet Singl...81564042019-07-15 15:32:521988 days ago1563204772IN
FCK.com: Roulette
0 ETH0.0006685413.88888888
Place Bet Single81564032019-07-15 15:32:261988 days ago1563204746IN
FCK.com: Roulette
0.02 ETH0.001730819.5
Place Bet Single81564012019-07-15 15:32:081988 days ago1563204728IN
FCK.com: Roulette
0.01 ETH0.0017617217
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
81565122019-07-15 15:56:061987 days ago1563206166
FCK.com: Roulette
1 wei
81565092019-07-15 15:55:131987 days ago1563206113
FCK.com: Roulette
1 wei
81565002019-07-15 15:53:051987 days ago1563205985
FCK.com: Roulette
0.05 ETH
81564932019-07-15 15:51:511987 days ago1563205911
FCK.com: Roulette
0.03 ETH
81564832019-07-15 15:50:361987 days ago1563205836
FCK.com: Roulette
0.05 ETH
81564732019-07-15 15:48:431987 days ago1563205723
FCK.com: Roulette
0.1 ETH
81564682019-07-15 15:46:291987 days ago1563205589
FCK.com: Roulette
0.03 ETH
81564612019-07-15 15:45:121987 days ago1563205512
FCK.com: Roulette
0.06 ETH
81564552019-07-15 15:44:201987 days ago1563205460
FCK.com: Roulette
0.03 ETH
81564482019-07-15 15:42:521987 days ago1563205372
FCK.com: Roulette
0.03 ETH
81564062019-07-15 15:33:151988 days ago1563204795
FCK.com: Roulette
0.04 ETH
81564042019-07-15 15:32:521988 days ago1563204772
FCK.com: Roulette
1 wei
81563882019-07-15 15:29:131988 days ago1563204553
FCK.com: Roulette
0.04 ETH
81563832019-07-15 15:27:391988 days ago1563204459
FCK.com: Roulette
1 wei
81563622019-07-15 15:22:131988 days ago1563204133
FCK.com: Roulette
0.05 ETH
81563462019-07-15 15:19:231988 days ago1563203963
FCK.com: Roulette
0.1 ETH
81550542019-07-15 10:24:261988 days ago1563186266
FCK.com: Roulette
1 wei
81550482019-07-15 10:23:141988 days ago1563186194
FCK.com: Roulette
1 wei
81549192019-07-15 9:50:361988 days ago1563184236
FCK.com: Roulette
0.019 ETH
81549182019-07-15 9:50:191988 days ago1563184219
FCK.com: Roulette
1 wei
81547682019-07-15 9:19:491988 days ago1563182389
FCK.com: Roulette
0.02 ETH
81547452019-07-15 9:14:351988 days ago1563182075
FCK.com: Roulette
0.02 ETH
81531372019-07-15 3:11:421988 days ago1563160302
FCK.com: Roulette
0.1 ETH
81516952019-07-14 21:46:021988 days ago1563140762
FCK.com: Roulette
1 wei
81516912019-07-14 21:45:281988 days ago1563140728
FCK.com: Roulette
0.04 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FckRoulette

Compiler Version
v0.5.4+commit.9549d8ff

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.