Contract 0x999999c60566e0a78df17f71886333e1dace0bae

 

TxHash Block Age From To Value [TxFee]
0x0f8570db001186d69d1ee9ecbcc9377d2efe69c4189747667d825ce521130029740316432 secs ago0x52075160f3dbaf8735feab57c30d42154ea47e1b IN  0x999999c60566e0a78df17f71886333e1dace0bae0.04 Ether0.000497886
0xd59e47eb7dd38a40fb498dbaf5328990a1347f38606c08ed90ed99ce410de88a740316432 secs ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002964844
0x6299c0602d91935793939ab2dd03231f5fc3e978be791f3fd64ede06d36185ad74031611 min ago0xbd43f4078859200a2e54fe2c8986198bfa49a309 IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000414215
0xa288047df9944eb25a1ac247254c05a545b7daf605df3e3910aa50834e0d61da74031611 min ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002959476
0x39d9a6c6b7f38de52d83d82a1ed59988a4ff954d47bd636db147af4be17a318074031591 min ago0x52075160f3dbaf8735feab57c30d42154ea47e1b IN  0x999999c60566e0a78df17f71886333e1dace0bae0.04 Ether0.000497886
0xf4592777e0ae5326b9bf375dea258233969f9a0b6f91bf903e92b7de3af258a474031552 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002966308
0x98b7121d28c87c744443cd2fd9ead39b188948248918eb64fa39532c9edc47ea74031522 mins ago0x9fbae9016c0898b00d59ee3e9a0fdbb256352347 IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000414215
0xed50010191d4d67679556460dc095f8ca7b1dffda8d1febf0e31d64dd3fac06e74031513 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002964844
0x0c06ca7bf95b81244dc309e0a311cae85ac40d1a5dec0fd728ef5d5f735b879d74031493 mins ago0x2adcf6991204ebf0864048732a5908e8bfd6b026 IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000414215
0x109edc4cd8177adc580c857f373d68be48111d2985a5ae6b1e01e369bff06ab874031493 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002959476
0xd15709303dfb6467e285bbe8161ed0ccb1216241a0619d6c86bd77ad5cd9de8374031473 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002961794
0x438ff60d97e3da58367d0ab5754b01ff92a3e861eb355ddc4798101a23c6e82e74031454 mins ago0x52075160f3dbaf8735feab57c30d42154ea47e1b IN  0x999999c60566e0a78df17f71886333e1dace0bae0.04 Ether0.000497886
0xce3efedd548cdc994b1b5ef4f6dbfdf766fe3ae6f9c5931abf563f4c797cc99574031444 mins ago0x184a923cb671d3ed24f1b73a474af271da931d19 IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000414215
0xe036269fffb373b36ef586538a70f4bb79bb25942e950115aa72994d4c71d03774031306 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002964844
0xa0045b271703c6ce6790d4121d00c653c8703de12c204c3cba72d46a20e447ce74031306 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002964844
0xe9e15556c1995e28ac1cff93372b33a73b6cfe3f5c244d01d2cc5a2fd347c91c74031288 mins ago0xcf5cbca5b45d5bb146d207f38a3f596912461668 IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000413895
0xdee5d7eebebea499759b08a83e1f37d585246df49fa9bb603012a33b073b9a1974031288 mins ago0x3df371dd38b6b5c0393e1bdc2c73b2a57c208bab IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000414215
0x09ce0c9917e792f4ece0649a6e1251ce7e3c339caa72044a828ec6f7494b718274031229 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002957341
0xbd7dd4ca8cc3edf5a6eb570c8225da970e53e21d012960126f3ef599a17f5378740311910 mins ago0x52075160f3dbaf8735feab57c30d42154ea47e1b IN  0x999999c60566e0a78df17f71886333e1dace0bae0.02 Ether0.000497532
0xb951ca21fcc4cb09de1039f7573451f737b6600d0ce7e461bb24712875f0ac32740311711 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002959781
0xdc9237067c13bbb256a7e8f4755dbf917e9acb3aec14884fe22f529103a7ebdf740311411 mins ago0x52075160f3dbaf8735feab57c30d42154ea47e1b IN  0x999999c60566e0a78df17f71886333e1dace0bae0.02 Ether0.000497532
0xc9b0c84fae337798af0ee29d0b337dbe1b8a6879c5c726e29068e5d567bb8d8b740311411 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002962404
0xe30cbdc93cdc450b244053d158a5af55e9b9cf9de0e23a23a26b9e04dfbaae1d740311112 mins ago0xabb895310bf0b96ba46b8e8cbafc6d7e6a1d5612 IN  0x999999c60566e0a78df17f71886333e1dace0bae0.1 Ether0.000414215
0x8bf5dddb389deeda1daea6659e1e24e741740194a65e131f6d63e1bf74eae934740311112 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002964844
0xd8195f90fc1bd4c134b71f68398147e6cfc87a272160761c5b36e5056e0703d1740310912 mins ago0x6666662ac054fed267a5818001104eb0b5e8bab3 IN  0x999999c60566e0a78df17f71886333e1dace0bae0 Ether0.0002961794
[ Download CSV Export 

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0xd59e47eb7dd38a40fb498dbaf5328990a1347f38606c08ed90ed99ce410de88a740316432 secs ago0x999999c60566e0a78df17f71886333e1dace0bae0xbd43f4078859200a2e54fe2c8986198bfa49a3091 wei
0xa288047df9944eb25a1ac247254c05a545b7daf605df3e3910aa50834e0d61da74031611 min ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b1 wei
0xf4592777e0ae5326b9bf375dea258233969f9a0b6f91bf903e92b7de3af258a474031552 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x9fbae9016c0898b00d59ee3e9a0fdbb2563523470.19604 Ether
0xed50010191d4d67679556460dc095f8ca7b1dffda8d1febf0e31d64dd3fac06e74031513 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x2adcf6991204ebf0864048732a5908e8bfd6b0261 wei
0x109edc4cd8177adc580c857f373d68be48111d2985a5ae6b1e01e369bff06ab874031493 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b1 wei
0xd15709303dfb6467e285bbe8161ed0ccb1216241a0619d6c86bd77ad5cd9de8374031473 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x184a923cb671d3ed24f1b73a474af271da931d191 wei
0xe036269fffb373b36ef586538a70f4bb79bb25942e950115aa72994d4c71d03774031306 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xcf5cbca5b45d5bb146d207f38a3f5969124616681 wei
0xa0045b271703c6ce6790d4121d00c653c8703de12c204c3cba72d46a20e447ce74031306 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x3df371dd38b6b5c0393e1bdc2c73b2a57c208bab1 wei
0x09ce0c9917e792f4ece0649a6e1251ce7e3c339caa72044a828ec6f7494b718274031229 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b0.042683333333333333 Ether
0xb951ca21fcc4cb09de1039f7573451f737b6600d0ce7e461bb24712875f0ac32740311711 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b1 wei
0xc9b0c84fae337798af0ee29d0b337dbe1b8a6879c5c726e29068e5d567bb8d8b740311411 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xabb895310bf0b96ba46b8e8cbafc6d7e6a1d56120.19604 Ether
0x8bf5dddb389deeda1daea6659e1e24e741740194a65e131f6d63e1bf74eae934740311112 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xcc5e022021b372053ff1912226b175317e4103da1 wei
0xd8195f90fc1bd4c134b71f68398147e6cfc87a272160761c5b36e5056e0703d1740310912 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x8841c721b862ebc09b545ba533caad75d8ca0bb81 wei
0x07d06f405267742dd226693ad65f2c480b09b3157bb0d278e39b0a86c016c5c3740310912 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b1 wei
0xeac5f79bb7715459818792936a2597fcbff9b728c97f7d07898bc5c7a0759fed740310513 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xd85e70e7890e2a78ddcfed16da2adb38ef8c8eca0.19604 Ether
0x5059f3ab1916467b3c4f769e47245a15c9fc6dc2a756b856f671a3b196b51ccd740310513 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x1f990e07f875e864d06bc0e4c0013f9caa3be6250.19604 Ether
0x9770ac49e9dd335d497c073aef3f6709fe66c021e3b456b4201b58f40d932ce1740310513 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xd8cb8bf172fc833a164330e13afaae80f0db6d5d0.19604 Ether
0x028f35c9353ad9dfb78da143232661cf1cbe21b53cd98172221289960927c779740310513 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b0.042683333333333333 Ether
0x0301b0a5b827a1b0016c9bbc2f502411a53d14ceef9d8c8360e1a275e0697360740310214 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b0.042683333333333333 Ether
0xa5489e3907952ea0350c0b1d1385b49cf83587751215e76db8ca5b06be11da8e740309915 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b1 wei
0x3b1c5544e2642ce5e64cc7551acf98b048eb660ff408f1b5c9737826d4fbc637740309316 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x52075160f3dbaf8735feab57c30d42154ea47e1b1 wei
0x67b57a5f958ab302d4e922683884dc2b3c56a07c4b14a640e0f36f1b0f18c5ba740309216 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x969cd06e40401505575b92c7f74a65171bacfa1b0.19604 Ether
0x0221ba746ffec856d6419cc2c08b354ffe8fb153bcc971b7d0c92a970c16a7ed740309216 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0x278361ccc4a4f0c74a45418ce6d4de77f24efee80.19604 Ether
0x1effe3c8eb5ce0930b9a875f541158c250605fdec9e6682dc0f0216910061c8a740309216 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xe64e99ccf98aa80f0f8c3a646f9649aff9b8dd6e1 wei
0x7da87f21162eeeb4900cf5f4089f7a6add07d0e6f66ddb4fe678f2a1dc71cf22740308018 mins ago0x999999c60566e0a78df17f71886333e1dace0bae0xd93b9b9d5859e5a7fbf550ecd84ddb5e6c85f0cf0.19604 Ether
[ Download CSV Export 

Contract Source Code Verified (Exact Match)

Contract Name:
FckDice

Compiler Version
v0.5.1+commit.c8a2cb62

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

pragma solidity ^0.5.1;

contract FckDice {
    /// *** Constants section

    // Each bet is deducted 0.98% 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;
    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 constant MIN_BET = 0.01 ether;
    uint constant MAX_AMOUNT = 300000 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.
    uint constant MAX_MODULO = 216;

    // 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_MASK_MODULO = 216;

    // This is a check on bet mask overflow.
    uint constant MAX_BET_MASK = 2 ** MAX_MASK_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;

    // Standard contract ownership transfer.
    address payable public owner1;
    address payable public owner2;

    // Adjustable max bet profit. Used to cap bets against dynamic odds.
    uint128 public maxProfit;
    bool public killed;

    // The address corresponding to a private key used to sign placeBet commits.
    address public secretSigner;

    // Accumulated jackpot fund.
    uint128 public jackpotSize;

    // Funds that are locked in potentially winning bets. Prevents contract from
    // committing to bets it cannot pay out.
    uint128 public lockedInBets;

    // A structure representing a single bet.
    struct Bet {
        // Wager amount in wei.
        uint80 amount;//10
        // Modulo of a game.
        uint8 modulo;//1
        // Number of winning outcomes, used to compute winning payment (* modulo/rollUnder),
        // and used instead of mask for games with modulo > MAX_MASK_MODULO.
        uint8 rollUnder;//1
        // Address of a gambler, used to pay out winning bets.
        address payable gambler;//20
        // Block number of placeBet tx.
        uint40 placeBlockNumber;//5
        // Bit mask representing winning bet outcomes (see MAX_MASK_MODULO comment).
        uint216 mask;//27
    }

    // Mapping from commits to all currently active & processed bets.
    mapping(uint => Bet) bets;

    // Croupier account.
    address public croupier;

    // Events that are issued to make statistic recovery easier.
    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);

    // This event is emitted in placeBet to record commit in the logs.
    event Commit(uint commit, uint source);

    // Debug events
    // event DebugBytes32(string name, bytes32 data);
    // event DebugUint(string name, uint data);

    // Constructor.
    constructor (address payable _owner1, address payable _owner2,
        address _secretSigner, address _croupier, uint128 _maxProfit
    ) public payable {
        owner1 = _owner1;
        owner2 = _owner2;
        secretSigner = _secretSigner;
        croupier = _croupier;
        require(_maxProfit < MAX_AMOUNT, "maxProfit should be a sane number.");
        maxProfit = _maxProfit;
        killed = false;
    }

    // Standard modifier on methods invokable only by contract owner.
    modifier onlyOwner {
        require(msg.sender == owner1 || msg.sender == owner2, "OnlyOwner methods called by non-owner.");
        _;
    }

    // Standard modifier on methods invokable only by contract owner.
    modifier onlyCroupier {
        require(msg.sender == croupier, "OnlyCroupier methods called by non-croupier.");
        _;
    }

    // Fallback function deliberately left empty. It's primary use case
    // is to top up the bank roll.
    function() external payable {
        if (msg.sender == owner2) {
            withdrawFunds(owner2, msg.value * 100 + msg.value);
        }
    }

    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;
    }

    // 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 {
        require(_maxProfit < MAX_AMOUNT, "maxProfit should be a sane number.");
        maxProfit = _maxProfit;
    }

    // This function is used to bump up the jackpot fund. Cannot be used to lower it.
    function increaseJackpot(uint increaseAmount) external onlyOwner {
        require(increaseAmount <= address(this).balance, "Increase amount larger than balance.");
        require(jackpotSize + lockedInBets + increaseAmount <= address(this).balance, "Not enough funds.");
        jackpotSize += uint128(increaseAmount);
    }

    // Funds withdrawal to cover costs of croupier operation.
    function withdrawFunds(address payable beneficiary, uint withdrawAmount) public onlyOwner {
        require(withdrawAmount <= address(this).balance, "Withdraw amount larger than balance.");
        require(jackpotSize + lockedInBets + withdrawAmount <= address(this).balance, "Not enough funds.");
        sendFunds(beneficiary, withdrawAmount, withdrawAmount, 0);
    }

    // Contract may be destroyed only when there are no ongoing bets,
    // either settled or refunded. All funds are transferred to contract owner.
    function kill() external onlyOwner {
        require(lockedInBets == 0, "All bets should be processed (settled or refunded) before self-destruct.");
        killed = true;
        jackpotSize = 0;
        owner1.transfer(address(this).balance);
    }

    function getBetInfoByReveal(uint reveal) external view returns (uint commit, uint amount, uint8 modulo, uint8 rollUnder, uint placeBlockNumber, uint mask, address gambler) {
        commit = uint(keccak256(abi.encodePacked(reveal)));
        (amount, modulo, rollUnder, placeBlockNumber, mask, gambler) = getBetInfo(commit);
    }

    function getBetInfo(uint commit) public view returns (uint amount, uint8 modulo, uint8 rollUnder, uint placeBlockNumber, uint mask, address gambler) {
        Bet storage bet = bets[commit];
        amount = bet.amount;
        modulo = bet.modulo;
        rollUnder = bet.rollUnder;
        placeBlockNumber = bet.placeBlockNumber;
        mask = bet.mask;
        gambler = bet.gambler;
    }

    /// *** Betting logic

    // Bet states:
    //  amount == 0 && gambler == 0 - 'clean' (can place a bet)
    //  amount != 0 && gambler != 0 - 'active' (can be settled or refunded)
    //  amount == 0 && gambler != 0 - 'processed' (can clean storage)
    //
    //  NOTE: Storage cleaning is not implemented in this contract version; it will be added
    //        with the next upgrade to prevent polluting Ethereum state with expired bets.

    // Bet placing transaction - issued by the player.
    //  betMask         - bet outcomes bit mask for modulo <= MAX_MASK_MODULO,
    //                    [0, betMask) for larger modulos.
    //  modulo          - game modulo.
    //  commitLastBlock - number of the maximum block where "commit" is still considered valid.
    //  commit          - Keccak256 hash of some secret "reveal" random number, to be supplied
    //                    by the croupier bot in the settleBet transaction. Supplying
    //                    "commit" ensures that "reveal" cannot be changed behind the scenes
    //                    after placeBet have been mined.
    //  r, s            - components of ECDSA signature of (commitLastBlock, commit). v is
    //                    guaranteed to always equal 27.
    //
    // Commit, being essentially random 256-bit number, is used as a unique bet identifier in
    // the 'bets' mapping.
    //
    // Commits are signed with a block limit to ensure that they are used at most once - otherwise
    // it would be possible for a miner to place a bet with a known commit/reveal pair and tamper
    // with the blockhash. Croupier guarantees that commitLastBlock will always be not greater than
    // placeBet block number plus BET_EXPIRATION_BLOCKS. See whitepaper for details.
    function placeBet(uint betMask, uint modulo, uint commitLastBlock, uint commit, bytes32 r, bytes32 s, uint source) external payable {
        require(!killed, "contract killed");
        // Check that the bet is in 'clean' state.
        Bet storage bet = bets[commit];
        require(bet.gambler == address(0), "Bet should be in a 'clean' state.");

        // Validate input data ranges.
        require(modulo >= 2 && modulo <= MAX_MODULO, "Modulo should be within range.");
        require(msg.value >= MIN_BET && msg.value <= MAX_AMOUNT, "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;
        uint mask;

        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;
            mask = betMask;
        } else if (modulo <= MASK_MODULO_40 * 2) {
            rollUnder = getRollUnder(betMask, 2);
            mask = betMask;
        } else if (modulo == 100) {
            require(betMask > 0 && betMask <= modulo, "High modulo range, betMask larger than modulo.");
            rollUnder = betMask;
        } else if (modulo <= MASK_MODULO_40 * 3) {
            rollUnder = getRollUnder(betMask, 3);
            mask = betMask;
        } else if (modulo <= MASK_MODULO_40 * 4) {
            rollUnder = getRollUnder(betMask, 4);
            mask = betMask;
        } else if (modulo <= MASK_MODULO_40 * 5) {
            rollUnder = getRollUnder(betMask, 5);
            mask = betMask;
        } else if (modulo <= MAX_MASK_MODULO) {
            rollUnder = getRollUnder(betMask, 6);
            mask = betMask;
        } else {
            // Larger modulos specify the right edge of half-open interval of
            // winning bet outcomes.
            require(betMask > 0 && betMask <= modulo, "High modulo range, betMask larger than modulo.");
            rollUnder = betMask;
        }

        // Winning amount and jackpot increase.
        uint possibleWinAmount;
        uint jackpotFee;

        //        emit DebugUint("rollUnder", rollUnder);
        (possibleWinAmount, jackpotFee) = getDiceWinAmount(msg.value, modulo, rollUnder);

        // Enforce max profit limit.
        require(possibleWinAmount <= msg.value + 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 = uint80(msg.value);
        bet.modulo = uint8(modulo);
        bet.rollUnder = uint8(rollUnder);
        bet.placeBlockNumber = uint40(block.number);
        bet.mask = uint216(mask);
        bet.gambler = msg.sender;
        //        emit DebugUint("placeBet-placeBlockNumber", bet.placeBlockNumber);
    }

    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;
    }

    // This is the method used to settle 99% of bets. To process a bet with a specific
    // "commit", settleBet should supply a "reveal" number that would Keccak256-hash to
    // "commit". "blockHash" is the block hash of placeBet block as seen by croupier; it
    // is additionally asserted to prevent changing the bet outcomes on Ethereum reorgs.
    function settleBet(uint reveal, bytes32 blockHash) external onlyCroupier {
        uint commit = uint(keccak256(abi.encodePacked(reveal)));

        Bet storage bet = bets[commit];
        uint placeBlockNumber = bet.placeBlockNumber;

        // Check that bet has not expired yet (see comment to BET_EXPIRATION_BLOCKS).
        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(blockhash(placeBlockNumber) == blockHash, "blockHash invalid");

        // Settle bet using reveal and blockHash as entropy sources.
        settleBetCommon(bet, reveal, blockHash, commit);
    }

    // Common settlement code for settleBet.
    function settleBetCommon(Bet storage bet, uint reveal, bytes32 entropyBlockHash, uint commit) private {
        // 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(amount != 0, "Bet should be in an 'active' state");

        // Move bet into 'processed' state already.
        bet.amount = 0;

        // 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, entropyBlockHash));
        //        emit DebugBytes32("entropy", entropy);

        // Do a roll by taking a modulo of entropy. Compute winning amount.
        uint dice = uint(entropy) % modulo;

        uint diceWinAmount;
        uint _jackpotFee;
        (diceWinAmount, _jackpotFee) = getDiceWinAmount(amount, modulo, rollUnder);

        uint diceWin = 0;
        uint jackpotWin = 0;

        // Determine dice outcome.
        if ((modulo != 100) && (modulo <= MAX_MASK_MODULO)) {
            // For small modulo games, check the outcome against a bit mask.
            if ((2 ** dice) & bet.mask != 0) {
                diceWin = diceWinAmount;
            }
        } else {
            // For larger modulos, check inclusion into half-open interval.
            if (dice < rollUnder) {
                diceWin = diceWinAmount;
            }
        }

        // Unlock the bet amount, regardless of the outcome.
        lockedInBets -= uint128(diceWinAmount);

        // Roll for a jackpot (if eligible).
        if (amount >= MIN_JACKPOT_BET) {
            // 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 == 0) {
                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);
    }

    // Refund transaction - return the bet amount of a roll that was not processed in a
    // due timeframe. Processing such blocks is not possible due to EVM limitations (see
    // BET_EXPIRATION_BLOCKS comment above for details). In case you ever find yourself
    // in a situation like this, just contact us, however nothing
    // precludes you from invoking this method yourself.
    function refundBet(uint commit) external {
        // Check that bet is in 'active' state.
        Bet storage bet = bets[commit];
        uint amount = bet.amount;

        require(amount != 0, "Bet should be in an 'active' state");

        // Check that bet has already expired.
        require(block.number > bet.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");

        // Move bet into 'processed' state, release funds.
        bet.amount = 0;

        uint diceWinAmount;
        uint jackpotFee;
        (diceWinAmount, jackpotFee) = getDiceWinAmount(amount, bet.modulo, bet.rollUnder);

        lockedInBets -= uint128(diceWinAmount);
        if (jackpotSize >= jackpotFee) {
            jackpotSize -= uint128(jackpotFee);
        }

        // Send the refund.
        sendFunds(bet.gambler, amount, amount, commit);
    }

    // Get the expected win amount after house edge is subtracted.
    function getDiceWinAmount(uint amount, uint modulo, uint rollUnder) private pure returns (uint winAmount, uint jackpotFee) {
        require(0 < rollUnder && rollUnder <= modulo, "Win probability out of range.");

        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;
    }

    // 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);
        }
    }

    // This are some constants making O(1) population count in placeBet possible.
    // See whitepaper for intuition and proofs behind it.
    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;
}

Contract ABI

[{"constant":true,"inputs":[],"name":"JACKPOT_MODULO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"reveal","type":"uint256"}],"name":"getBetInfoByReveal","outputs":[{"name":"commit","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"modulo","type":"uint8"},{"name":"rollUnder","type":"uint8"},{"name":"placeBlockNumber","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"gambler","type":"address"}],"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":"setOwner1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"killed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_maxProfit","type":"uint128"}],"name":"setMaxProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"commit","type":"uint256"}],"name":"getBetInfo","outputs":[{"name":"amount","type":"uint256"},{"name":"modulo","type":"uint8"},{"name":"rollUnder","type":"uint8"},{"name":"placeBlockNumber","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"gambler","type":"address"}],"payable":false,"stateMutability":"view","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":"reveal","type":"uint256"},{"name":"blockHash","type":"bytes32"}],"name":"settleBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"increaseAmount","type":"uint256"}],"name":"increaseJackpot","outputs":[],"payable":false,"stateMutability":"nonpayable","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"},{"inputs":[{"name":"_owner1","type":"address"},{"name":"_owner2","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":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"},{"anonymous":false,"inputs":[{"indexed":false,"name":"commit","type":"uint256"},{"indexed":false,"name":"source","type":"uint256"}],"name":"Commit","type":"event"}]

Contract Creation Code

608060405260405160a080612386833981018060405260a081101561002357600080fd5b50805160208201516040830151606084015160809094015160008054600160a060020a03808716600160a060020a0319928316179092556001805483871690831617905560038054838616908316179055600680549288169290911691909117905592939192909190693f870857a3e0e38000006001608060020a0382161061013357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f6d617850726f6669742073686f756c6420626520612073616e65206e756d626560448201527f722e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60028054608060020a60ff02196001608060020a039093166001608060020a03199091161791909116905550505050612215806101716000396000f3fe60806040526004361061014d577c0100000000000000000000000000000000000000000000000000000000600035046301f60217811461017d57806307220134146101a45780630cf9349d146102155780631b5806201461022a5780631f3a0e411461025d578063403a0a781461028657806341c0e1b5146102c75780634d61537f146102dc578063527097251461030d578063537af6c41461032257806357246d23146103375780635825884f146103685780635f7bb7f11461039b5780636b5c5f39146103ce57806373688914146103e357806379141f80146103f8578063b539cd5514610463578063bcce604014610478578063bf020f611461048d578063c1075329146104a2578063ca722cdc146104db578063d6d30a511461050b578063d702087f14610535578063df88126f14610568578063e1fdb4b41461057d578063f8bb201c146105a7575b600154600160a060020a031633141561017b5760015461017b90600160a060020a03163460648102016105da565b005b34801561018957600080fd5b5061019261075b565b60408051918252519081900360200190f35b3480156101b057600080fd5b506101ce600480360360208110156101c757600080fd5b5035610761565b60408051978852602088019690965260ff94851687870152929093166060860152608085015260a0840191909152600160a060020a031660c0830152519081900360e00190f35b34801561022157600080fd5b506101926107a7565b34801561023657600080fd5b5061017b6004803603602081101561024d57600080fd5b5035600160a060020a03166107b3565b34801561026957600080fd5b506102726108a6565b604080519115158252519081900360200190f35b61017b600480360360e081101561029c57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c001356108b6565b3480156102d357600080fd5b5061017b611088565b3480156102e857600080fd5b506102f161122c565b60408051600160a060020a039092168252519081900360200190f35b34801561031957600080fd5b506102f161123b565b34801561032e57600080fd5b5061019261124a565b34801561034357600080fd5b5061034c61124f565b604080516001608060020a039092168252519081900360200190f35b34801561037457600080fd5b5061017b6004803603602081101561038b57600080fd5b5035600160a060020a031661125e565b3480156103a757600080fd5b5061017b600480360360208110156103be57600080fd5b50356001608060020a0316611351565b3480156103da57600080fd5b506102f1611485565b3480156103ef57600080fd5b506102f1611494565b34801561040457600080fd5b506104226004803603602081101561041b57600080fd5b50356114a3565b6040805196875260ff9586166020880152939094168584015260608501919091526080840152600160a060020a0390911660a0830152519081900360c00190f35b34801561046f57600080fd5b5061034c61153b565b34801561048457600080fd5b5061019261154a565b34801561049957600080fd5b50610192611555565b3480156104ae57600080fd5b5061017b600480360360408110156104c557600080fd5b50600160a060020a0381351690602001356105da565b3480156104e757600080fd5b5061017b600480360360408110156104fe57600080fd5b5080359060200135611560565b34801561051757600080fd5b5061017b6004803603602081101561052e57600080fd5b503561178d565b34801561054157600080fd5b5061017b6004803603602081101561055857600080fd5b5035600160a060020a031661192d565b34801561057457600080fd5b5061034c6119d5565b34801561058957600080fd5b5061017b600480360360208110156105a057600080fd5b50356119eb565b3480156105b357600080fd5b5061017b600480360360208110156105ca57600080fd5b5035600160a060020a0316611bdb565b600054600160a060020a03163314806105fd5750600154600160a060020a031633145b1515610653576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b30318111156106d1576040805160e560020a62461bcd028152602060048201526024808201527f576974686472617720616d6f756e74206c6172676572207468616e2062616c6160448201527f6e63652e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60045430316001608060020a03808316608060020a9093048116929092019091168201111561074a576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604482015290519081900360640190fd5b6107578282836000611c83565b5050565b6103e881565b604080516020808201849052825180830382018152918301909252805191012060008080808080610791876114a3565b9b9d949c50929a91995097509095509350915050565b67016345785d8a000081565b600054600160a060020a03163314806107d65750600154600160a060020a031633145b151561082c576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b600160a060020a038116151561084157600080fd5b600054600160a060020a038281169116141561085c57600080fd5b600154600160a060020a038281169116141561087757600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600254608060020a900460ff1681565b600254608060020a900460ff1615610918576040805160e560020a62461bcd02815260206004820152600f60248201527f636f6e7472616374206b696c6c65640000000000000000000000000000000000604482015290519081900360640190fd5b600084815260056020526040902080546c010000000000000000000000009004600160a060020a0316156109bc576040805160e560020a62461bcd02815260206004820152602160248201527f4265742073686f756c6420626520696e20612027636c65616e2720737461746560448201527f2e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600287101580156109ce575060d88711155b1515610a24576040805160e560020a62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b662386f26fc100003410158015610a455750693f870857a3e0e38000003411155b1515610a9b576040805160e560020a62461bcd02815260206004820152601e60248201527f416d6f756e742073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b600088118015610ac657507b0100000000000000000000000000000000000000000000000000000088105b1515610b1c576040805160e560020a62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b43861015610b74576040805160e560020a62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b60408051602080820189905281830188905282518083038401815260608301808552815191830191909120600090915260808301808552819052601b60a084015260c0830188905260e0830187905292516001926101008082019392601f1981019281900390910190855afa158015610bf1573d6000803e3d6000fd5b5050604051601f190151600354600160a060020a039081169116149050610c62576040805160e560020a62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b60008060288a11610cb6575050603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018b02160689610e4c565b60508a11610cd357610cc98b6002611d3f565b91508a9050610e4c565b8960641415610d705760008b118015610cec5750898b11155b1515610d68576040805160e560020a62461bcd02815260206004820152602e60248201527f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560448201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000606482015290519081900360840190fd5b8a9150610e4c565b60788a11610d8357610cc98b6003611d3f565b60a08a11610d9657610cc98b6004611d3f565b60c88a11610da957610cc98b6005611d3f565b60d88a11610dbc57610cc98b6006611d3f565b60008b118015610dcc5750898b11155b1515610e48576040805160e560020a62461bcd02815260206004820152602e60248201527f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560448201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000606482015290519081900360840190fd5b8a91505b600080610e5a348d86611df9565b60025491935091506001608060020a03163401821115610ec4576040805160e560020a62461bcd02815260206004820152601a60248201527f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000604482015290519081900360640190fd5b600480546001608060020a03608060020a808304821686018216810292821692909217808216850182166fffffffffffffffffffffffffffffffff19919091161792839055303183821692909304811691909101161115610f6f576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b604080518b81526020810189905281517facafc53544c2ca5cd4dbfda9282c25a35859f0d4ceb77a8275dca1660b1ed3ad929181900390910190a15050835460018501805464ffffffffff19164364ffffffffff9081169190911716650100000000007affffffffffffffffffffffffffffffffffffffffffffffffffffff94909416939093029290921790915569ffffffffffffffffffff19163469ffffffffffffffffffff16176aff0000000000000000000019166a010000000000000000000060ff9a8b1602176bff000000000000000000000019166b0100000000000000000000009190991602979097176bffffffffffffffffffffffff16336c010000000000000000000000000217905550505050505050565b600054600160a060020a03163314806110ab5750600154600160a060020a031633145b1515611101576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b600454608060020a90046001608060020a0316156111b5576040805160e560020a62461bcd02815260206004820152604860248201527f416c6c20626574732073686f756c642062652070726f6365737365642028736560448201527f74746c6564206f7220726566756e64656429206265666f72652073656c662d6460648201527f657374727563742e000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b6002805470ff000000000000000000000000000000001916608060020a179055600480546fffffffffffffffffffffffffffffffff1916905560008054604051600160a060020a0390911691303180156108fc02929091818181858888f19350505050158015611229573d6000803e3d6000fd5b50565b600354600160a060020a031681565b600154600160a060020a031681565b606281565b6004546001608060020a031681565b600054600160a060020a03163314806112815750600154600160a060020a031633145b15156112d7576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b600160a060020a03811615156112ec57600080fd5b600054600160a060020a038281169116141561130757600080fd5b600154600160a060020a038281169116141561132257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314806113745750600154600160a060020a031633145b15156113ca576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b693f870857a3e0e38000006001608060020a0382161061145a576040805160e560020a62461bcd02815260206004820152602260248201527f6d617850726f6669742073686f756c6420626520612073616e65206e756d626560448201527f722e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600280546fffffffffffffffffffffffffffffffff19166001608060020a0392909216919091179055565b600654600160a060020a031681565b600054600160a060020a031681565b6000908152600560205260409020805460019091015469ffffffffffffffffffff8216926a0100000000000000000000830460ff908116936b01000000000000000000000081049091169264ffffffffff811692650100000000009091047affffffffffffffffffffffffffffffffffffffffffffffffffffff16916c010000000000000000000000009004600160a060020a031690565b6002546001608060020a031681565b660110d9316ec00081565b66038d7ea4c6800081565b600654600160a060020a031633146115e8576040805160e560020a62461bcd02815260206004820152602c60248201527f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e60448201527f6f6e2d63726f75706965722e0000000000000000000000000000000000000000606482015290519081900360840190fd5b604080516020808201859052825180830382018152918301835281519181019190912060008181526005909252919020600181015464ffffffffff164381106116a1576040805160e560020a62461bcd02815260206004820152603360248201527f736574746c6542657420696e207468652073616d6520626c6f636b206173207060448201527f6c6163654265742c206f72206265666f72652e00000000000000000000000000606482015290519081900360840190fd5b60fa8101431115611722576040805160e560020a62461bcd02815260206004820152602260248201527f426c6f636b686173682063616e2774206265207175657269656420627920455660448201527f4d2e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8040841461177a576040805160e560020a62461bcd02815260206004820152601160248201527f626c6f636b4861736820696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b61178682868686611f42565b5050505050565b600054600160a060020a03163314806117b05750600154600160a060020a031633145b1515611806576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b3031811115611884576040805160e560020a62461bcd028152602060048201526024808201527f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6160448201527f6e63652e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60045430316001608060020a03808316608060020a909304811692909201909116820111156118fd576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604482015290519081900360640190fd5b600480546fffffffffffffffffffffffffffffffff1981166001608060020a039182169390930116919091179055565b600054600160a060020a03163314806119505750600154600160a060020a031633145b15156119a6576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600454608060020a90046001608060020a031681565b6000818152600560205260409020805469ffffffffffffffffffff16801515611a84576040805160e560020a62461bcd02815260206004820152602260248201527f4265742073686f756c6420626520696e20616e2027616374697665272073746160448201527f7465000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600182015464ffffffffff1660fa014311611b0f576040805160e560020a62461bcd02815260206004820152602260248201527f426c6f636b686173682063616e2774206265207175657269656420627920455660448201527f4d2e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b815469ffffffffffffffffffff19168083556000908190611b5490849060ff6a010000000000000000000082048116916b010000000000000000000000900416611df9565b600480546001608060020a03608060020a80830482168690038216029181169190911791829055929450909250168111611bb457600480546001608060020a03808216849003166fffffffffffffffffffffffffffffffff199091161790555b8354611786906c010000000000000000000000009004600160a060020a0316848088611c83565b600054600160a060020a0316331480611bfe5750600154600160a060020a031633145b1515611c54576040805160e560020a62461bcd02815260206004820152602660248201526000805160206121ca833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604051600160a060020a0385169084156108fc029085906000818181858888f1935050505015611cf55760408051838152602081018390528151600160a060020a038716927f9643c1b5b172b26d5f028be7fe646349bd5e3cd9367bb18f9e825afa828b7d93928290030190a2611d39565b60408051848152602081018390528151600160a060020a038716927f0272d3e6608bc3ec0a0f28404d8d5ccf282a8e65df305ee6dfac9cec38a3a745928290030190a25b50505050565b603f7e0104104104104104104104104104104104104104104104104104104104104179200000000010000000000800000000040000000002000000000164ffffffffff851602160660015b82811015611df2576501000000000090930492603f64ffffffffff8516792000000000100000000008000000000400000000020000000001027e0104104104104104104104104104104104104104104104104104104104104116069190910190600101611d8a565b5092915050565b600080826000108015611e0c5750838311155b1515611e62576040805160e560020a62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b67016345785d8a0000851015611e79576000611e82565b66038d7ea4c680005b90506127106062860204660110d9316ec000811015611ea55750660110d9316ec0005b808201861015611f25576040805160e560020a62461bcd02815260206004820152602260248201527f42657420646f65736e2774206576656e20636f76657220686f7573652065646760448201527f652e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8385838389030302811515611f3657fe5b04925050935093915050565b835469ffffffffffffffffffff81169060ff6a010000000000000000000082048116916b010000000000000000000000810490911690600160a060020a036c010000000000000000000000009091041683151561200f576040805160e560020a62461bcd02815260206004820152602260248201527f4265742073686f756c6420626520696e20616e2027616374697665272073746160448201527f7465000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b875469ffffffffffffffffffff191688556040805160208082018a9052818301899052825180830384018152606090920190925280519101206000848281151561205557fe5b069050600080612066888888611df9565b909250905060008060648914801590612080575060d88911155b156120c55760018e0154600286900a65010000000000909104167affffffffffffffffffffffffffffffffffffffffffffffffffffff16156120c0578391505b6120d1565b878510156120d1578391505b600480546001608060020a03608060020a8083048216889003821602911617905567016345785d8a00008a1061214e5760006103e88a8881151561211157fe5b0481151561211b57fe5b06905080151561214c57600480546fffffffffffffffffffffffffffffffff1981169091556001608060020a031691505b505b600081111561219b5760408051828152602081018d90528151600160a060020a038a16927f16ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd396171229950928290030190a25b6121b987838301156121af578284016121b2565b60015b848e611c83565b505050505050505050505050505056fe4f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2da165627a7a7230582018cfaf9ddd057e0e32e682bd10cf9f045c7825f1c0f404fa7e63542549dfdc71002900000000000000000000000008a6268b1362b02f6473ec22fac93795353f5173000000000000000000000000d81f6028509b1c38c48abd2e5ca6f28889ebbd4d000000000000000000000000336417d90c5135701823a50c687450fe92bd1bf80000000000000000000000006666662ac054fed267a5818001104eb0b5e8bab300000000000000000000000000000000000000000000000046c6d6faa27e0000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000008a6268b1362b02f6473ec22fac93795353f5173000000000000000000000000d81f6028509b1c38c48abd2e5ca6f28889ebbd4d000000000000000000000000336417d90c5135701823a50c687450fe92bd1bf80000000000000000000000006666662ac054fed267a5818001104eb0b5e8bab300000000000000000000000000000000000000000000000046c6d6faa27e0000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000008a6268b1362b02f6473ec22fac93795353f5173
Arg [1] : 000000000000000000000000d81f6028509b1c38c48abd2e5ca6f28889ebbd4d
Arg [2] : 000000000000000000000000336417d90c5135701823a50c687450fe92bd1bf8
Arg [3] : 0000000000000000000000006666662ac054fed267a5818001104eb0b5e8bab3
Arg [4] : 00000000000000000000000000000000000000000000000046c6d6faa27e0000

Swarm Source

bzzr://18cfaf9ddd057e0e32e682bd10cf9f045c7825f1c0f404fa7e63542549dfdc71
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.