Contract Overview |  Dice2Win
Balance: 477.546575907488459552 Ether
Ether Value: $42,320.18 (@ $88.62/ETH)
Transactions: 694860 txns
Misc:
Address Watch: Add To Watch List
Contract Creator: 0x284b470276cd51640d29f7dcbabc4583eb136a03at txn 0xb027da9fa4a116dc28eb9f38fa6ca0168853c5a5f5f54dd06e147acda3d0c299
Token Balance:
 Latest 25 transactions from a total of 694860 transactions
(+3 PendingTxns)

TxHash Age From To Value [TxFee]
0x59a1e5d6806cb84f381d6e9bf58d3a54e791669f97f2e0b0e84fff7aad421719(pending)0x3160ae19010c31b6b725794c390ea92ee9c85b83  IN  0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050.01 Ether(Pending)
0xe592a3292aef59fdf0c105eb7fb9892579739dc036d7aaec20efff9e331932e7(pending)0x383629c5bac8fea27a289408d23e3c7834eb8cc9  IN  0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050.01 Ether(Pending)
0x934afd55b7cb308e4e84e46e0e6037712fbbd153144e16a50c9f1eb7b9060170(pending)0x329af0005edd0696325423b1ccb100f44f777777  IN  0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050.05 Ether(Pending)
0x213584a738ee1b0add66affcd63e4cfbaa38a2855f77882cc44093102060b1e0 29 secs ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.0004035
0x6534707d2bef9430181ae0ce24336777095b4b0629893253634b1822718e8cb3 48 secs ago0x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc21  IN   Dice2Win0.01 Ether0.001067079
0xa815161878d5e9e88c94fb0709912c0e96d667a96ffa6422a448b87d35b9af701 min ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000404712
0x08f552ea90ce36bb32ef49329b87d8851de0f9f5517e6213e721e97751f4f9a72 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000403668
0xb5c81ec07f6a24be42999a529796b8619057c780d33f075a776ef3c6b8f0cece2 mins ago0x5c783d24c70966cb104e1fecd56d4590e95dfd26  IN   Dice2Win0.5 Ether0.001066884
0xb39712a7f43e9457ad72b11ce613986cbabbf26e68c75722f834e4bbdea3cfd82 mins ago0x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc21  IN   Dice2Win0.02 Ether0.001067911
0x4805900df54456b6c7e1c7df10494214395589de450aa79fa759fa1e2b7110d53 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000404592
0x5baf18ddad6ecfc57647ba75705583438aac4ffbe138f69e9871c1c9285c499e3 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000401844
0xa96d65cf1ed21a102b42d12e16c65cb30ae768907f623fdc19a3bbb7fa2a27533 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000404268
0xf5676615e7ed3530788a904de5d296d86f3c2cdb16ea2b07faff5e862536ee403 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000403956
0x626f7d10f43682bd0a0b75ec80f72a4c9d07f5266dfc9875978eec407e0a8ade3 mins ago0x3ef14bea059f7189f834646e7ce0e770ceff72a6  IN   Dice2Win1 Ether0.001066884
0xf0317c8369b25c0f4afbd9ab2635373ae0e0b7c02b9a5ee3c75c5915463aa6723 mins ago0x32ad1cadaa0d976d243b7b121d40bfb9b255726c  IN   Dice2Win0.25 Ether0.001068015
0x96a76b2f633355496ea4f63a1c071ab1234230b0ef67e38c7af25e07752e38103 mins ago0x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc21  IN   Dice2Win0.01 Ether0.001067911
0x739ea10288a0c6b804eefd5c38e8bde48090f939fc27a8ca548686c8ba75cb814 mins ago0x5c783d24c70966cb104e1fecd56d4590e95dfd26  IN   Dice2Win0.02 Ether0.001067079
0x4f9ee9253c995966e5a7c26eb6d90627f4bf22ed6093c30f9ad18bb94b6407c24 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000400632
0x988510101fde0f8d2a66001e4453fb377d96c827bad14c5bdf448865695117b14 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000404268
0x4ceaccc60b972f1d0e8606696a9f6489c36b77598b979629b608b2d5dcd2a5e35 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000403188
0xb609fdf5e23ccce82b572148c25d03ac0ad867b953ada066304530deb89312f05 mins ago0xd2efbb03e67ed8a17fde6cc32d1f757cffdcf49e  IN   Dice2Win0.01 Ether0.00106821
0xa446cb6f9f7a4afa56381d1970169945ae5a37974bfce3175e35d3bbaebd32525 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.000401844
0x609c046603d538b20362951dcec506bb6ca6293faeb1df7607473bb24f637d955 mins ago0x00000000c0293c8ca34dac9bcc0f953532d34e4d  IN   Dice2Win0 Ether0.00040488
0x61314c00a1375eafc27d8fc82e55d1a3d077bc73a90a8eefabbff0a401e1978b5 mins ago0x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc21  IN   Dice2Win0.01 Ether0.001067079
0x60bd3e3bc4b8c6f31e24fbdc4ba0f9beab4810be5ca6c0e4cda9950c681468a55 mins ago0x8537c58927672c8817449db005219aaf1de89c5f  IN   Dice2Win0.01 Ether0.001067911
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x213584a738ee1b0add66affcd63e4cfbaa38a2855f77882cc44093102060b1e06877362 29 secs ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc211 wei
0xa815161878d5e9e88c94fb0709912c0e96d667a96ffa6422a448b87d35b9af7068773551 min ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.988 Ether
0x08f552ea90ce36bb32ef49329b87d8851de0f9f5517e6213e721e97751f4f9a768773512 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc211 wei
0x4805900df54456b6c7e1c7df10494214395589de450aa79fa759fa1e2b7110d568773453 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x3ef14bea059f7189f834646e7ce0e770ceff72a61 wei
0x5baf18ddad6ecfc57647ba75705583438aac4ffbe138f69e9871c1c9285c499e68773453 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x32ad1cadaa0d976d243b7b121d40bfb9b255726c2.465 Ether
0xa96d65cf1ed21a102b42d12e16c65cb30ae768907f623fdc19a3bbb7fa2a275368773453 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc211 wei
0xf5676615e7ed3530788a904de5d296d86f3c2cdb16ea2b07faff5e862536ee4068773453 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.0394 Ether
0x4f9ee9253c995966e5a7c26eb6d90627f4bf22ed6093c30f9ad18bb94b6407c268773394 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050xd2efbb03e67ed8a17fde6cc32d1f757cffdcf49e1 wei
0x988510101fde0f8d2a66001e4453fb377d96c827bad14c5bdf448865695117b168773394 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc211 wei
0x4ceaccc60b972f1d0e8606696a9f6489c36b77598b979629b608b2d5dcd2a5e368773355 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x8537c58927672c8817449db005219aaf1de89c5f0.0194 Ether
0xa446cb6f9f7a4afa56381d1970169945ae5a37974bfce3175e35d3bbaebd325268773335 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x32ad1cadaa0d976d243b7b121d40bfb9b255726c0.986 Ether
0x609c046603d538b20362951dcec506bb6ca6293faeb1df7607473bb24f637d9568773335 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.79 Ether
0xbf33da34d6b3061a1d7003d5147524092bbc54b13f8006f483ff69bf62d097b968773286 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc210.0394 Ether
0x9cf4b672548dac91a9e0d09e5ef362b7efa217a75252c8f428c7730d23d6cc9d68773286 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.0194 Ether
0x38f60de5ec052eabcb421c8c98867df9680916e183a9f55c1489eef841d7efdf68773228 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc211 wei
0xc0e9bb9ce49f67084f50a748f5169da5bba7a74fbcca577fd25c2ade1c87b5d468773228 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.0394 Ether
0xb6d478ec9924be2b65abb3879e8af8802153a7eabe0cfc72d2550bc22097050668773199 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc210.0194 Ether
0xb5f364615ab13eb8c5cf88740f82019a76e7ede1a8700f56e616751ad48a2671687731010 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.0394 Ether
0xb4540577d539f28634751f3090818b13adae36b77c6e2ef1cbd36642213d4c23687731010 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc210.0194 Ether
0xf6a0985b839b18e62d52019b7dc378f0db182f013b0e8f565fa3041f8dd3ae99687730710 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050xd2efbb03e67ed8a17fde6cc32d1f757cffdcf49e0.018653846153846153 Ether
0x11438516a68a1a97fc8551c0361ed254a626477f9a61c23e231b1264eb906326687730511 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc210.0194 Ether
0x30ce6e8013b7e355afe950deee18418abc21eefeee1a5e9e56ee47a248975134687730211 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5ecb0470712d746eff343feee9bccac3ba8cce7a1 wei
0x19240e7be7d98095345772f6fc511a203a9152f2ae1bab3fa132fc7b34ae7da9687730211 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x8537c58927672c8817449db005219aaf1de89c5f0.196 Ether
0xbaaf9951d1b5cf771e5966350b466db56dc4867d2ba5cb51412b777e526e3950687729912 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x5c783d24c70966cb104e1fecd56d4590e95dfd260.295 Ether
0xaa0fc81f8dd7367604c87f9b901ab7736a9150fe50f9921e2e5a895976896a0b687729613 mins ago0xd1ceeeeee83f8bcf3bedad437202b6154e9f54050x7bc0c28b71b137d69a8f5d8dc915c4ba7c97dc211 wei
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: Dice2Win
Compiler Text: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.24;

// * dice2.win - fair games that pay Ether. Version 5.
//
// * Ethereum smart contract, deployed at 0xD1CEeeeee83F8bCF3BEDad437202b6154E9F5405.
//
// * Uses hybrid commit-reveal + block hash random number generation that is immune
//   to tampering by players, house and miners. Apart from being fully transparent,
//   this also allows arbitrarily high bets.
//
// * Refer to https://dice2.win/whitepaper.pdf for detailed description and proofs.

contract Dice2Win {
    /// *** Constants section

    // Each bet is deducted 1% 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 10 Gwei prices.
    uint constant HOUSE_EDGE_PERCENT = 1;
    uint 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 constant MIN_JACKPOT_BET = 0.1 ether;

    // Chance to win jackpot (currently 0.1%) and fee deducted into jackpot fund.
    uint constant JACKPOT_MODULO = 1000;
    uint 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
    //  - 100 for etheroll
    //  - 37 for roulette
    //  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 = 100;

    // 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, and 40 is the highest multiple of
    // eight below 42.
    uint constant MAX_MASK_MODULO = 40;

    // 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 dice2.win 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;

    // Some deliberately invalid address to initialize the secret signer with.
    // Forces maintainers to invoke setSecretSigner before processing any bets.
    address constant DUMMY_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    // Standard contract ownership transfer.
    address public owner;
    address private nextOwner;

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

    // 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.
        uint amount;
        // Modulo of a game.
        uint8 modulo;
        // 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;
        // Block number of placeBet tx.
        uint40 placeBlockNumber;
        // Bit mask representing winning bet outcomes (see MAX_MASK_MODULO comment).
        uint40 mask;
        // Address of a gambler, used to pay out winning bets.
        address gambler;
    }

    // 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);
    event Payment(address indexed beneficiary, uint amount);
    event JackpotPayment(address indexed beneficiary, uint amount);

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

    // Constructor. Deliberately does not take any parameters.
    constructor () public {
        owner = msg.sender;
        secretSigner = DUMMY_ADDRESS;
        croupier = DUMMY_ADDRESS;
    }

    // Standard modifier on methods invokable only by contract owner.
    modifier onlyOwner {
        require (msg.sender == owner, "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.");
        _;
    }

    // Standard contract ownership transfer implementation,
    function approveNextOwner(address _nextOwner) external onlyOwner {
        require (_nextOwner != owner, "Cannot approve current owner.");
        nextOwner = _nextOwner;
    }

    function acceptNextOwner() external {
        require (msg.sender == nextOwner, "Can only accept preapproved new owner.");
        owner = nextOwner;
    }

    // Fallback function deliberately left empty. It's primary use case
    // is to top up the bank roll.
    function () public payable {
    }

    // 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(uint _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 dice2.win operation.
    function withdrawFunds(address beneficiary, uint withdrawAmount) external onlyOwner {
        require (withdrawAmount <= address(this).balance, "Increase amount larger than balance.");
        require (jackpotSize + lockedInBets + withdrawAmount <= address(this).balance, "Not enough funds.");
        sendFunds(beneficiary, withdrawAmount, withdrawAmount);
    }

    // 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.");
        selfdestruct(owner);
    }

    /// *** 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 dice2.win 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) external payable {
        // 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.
        uint amount = msg.value;
        require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range.");
        require (amount >= MIN_BET && amount <= 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(uint40(commitLastBlock), commit));
        require (secretSigner == ecrecover(signatureHash, 27, r, s), "ECDSA signature is not valid.");

        uint rollUnder;
        uint mask;

        if (modulo <= MAX_MASK_MODULO) {
            // 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. For detailed proof consult
            // the dice2.win whitepaper.
            rollUnder = ((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO;
            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;

        (possibleWinAmount, jackpotFee) = getDiceWinAmount(amount, modulo, rollUnder);

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

        // Store bet parameters on blockchain.
        bet.amount = amount;
        bet.modulo = uint8(modulo);
        bet.rollUnder = uint8(rollUnder);
        bet.placeBlockNumber = uint40(block.number);
        bet.mask = uint40(mask);
        bet.gambler = msg.sender;
    }

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

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

    // This method is used to settle a bet that was mined into an uncle block. At this
    // point the player was shown some bet outcome, but the blockhash at placeBet height
    // is different because of Ethereum chain reorg. We supply a full merkle proof of the
    // placeBet transaction receipt to provide untamperable evidence that uncle block hash
    // indeed was present on-chain at some point.
    function settleBetUncleMerkleProof(uint reveal, uint40 canonicalBlockNumber) external onlyCroupier {
        // "commit" for bet settlement can only be obtained by hashing a "reveal".
        uint commit = uint(keccak256(abi.encodePacked(reveal)));

        Bet storage bet = bets[commit];

        // Check that canonical block hash can still be verified.
        require (block.number <= canonicalBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");

        // Verify placeBet receipt.
        requireCorrectReceipt(4 + 32 + 32 + 4);

        // Reconstruct canonical & uncle block hashes from a receipt merkle proof, verify them.
        bytes32 canonicalHash;
        bytes32 uncleHash;
        (canonicalHash, uncleHash) = verifyMerkleProof(commit, 4 + 32 + 32);
        require (blockhash(canonicalBlockNumber) == canonicalHash);

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

    // Common settlement code for settleBet & settleBetUncleMerkleProof.
    function settleBetCommon(Bet storage bet, uint reveal, bytes32 entropyBlockHash) private {
        // Fetch bet parameters into local variables (to save gas).
        uint amount = bet.amount;
        uint modulo = bet.modulo;
        uint rollUnder = bet.rollUnder;
        address 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));

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

        // Send the funds to gambler.
        sendFunds(gambler, diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin, diceWin);
    }

    // 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 the dice2.win support, 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);
        jackpotSize -= uint128(jackpotFee);

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

    // 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_PERCENT / 100;

        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 beneficiary, uint amount, uint successLogAmount) private {
        if (beneficiary.send(amount)) {
            emit Payment(beneficiary, successLogAmount);
        } else {
            emit FailedPayment(beneficiary, amount);
        }
    }

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

    // *** Merkle proofs.

    // This helpers are used to verify cryptographic proofs of placeBet inclusion into
    // uncle blocks. They are used to prevent bet outcome changing on Ethereum reorgs without
    // compromising the security of the smart contract. Proof data is appended to the input data
    // in a simple prefix length format and does not adhere to the ABI.
    // Invariants checked:
    //  - receipt trie entry contains a (1) successful transaction (2) directed at this smart
    //    contract (3) containing commit as a payload.
    //  - receipt trie entry is a part of a valid merkle proof of a block header
    //  - the block header is a part of uncle list of some block on canonical chain
    // The implementation is optimized for gas cost and relies on the specifics of Ethereum internal data structures.
    // Read the whitepaper for details.

    // Helper to verify a full merkle proof starting from some seedHash (usually commit). "offset" is the location of the proof
    // beginning in the calldata.
    function verifyMerkleProof(uint seedHash, uint offset) pure private returns (bytes32 blockHash, bytes32 uncleHash) {
        // (Safe) assumption - nobody will write into RAM during this method invocation.
        uint scratchBuf1;  assembly { scratchBuf1 := mload(0x40) }

        uint uncleHeaderLength; uint blobLength; uint shift; uint hashSlot;

        // Verify merkle proofs up to uncle block header. Calldata layout is:
        //  - 2 byte big-endian slice length
        //  - 2 byte big-endian offset to the beginning of previous slice hash within the current slice (should be zeroed)
        //  - followed by the current slice verbatim
        for (;; offset += blobLength) {
            assembly { blobLength := and(calldataload(sub(offset, 30)), 0xffff) }
            if (blobLength == 0) {
                // Zero slice length marks the end of uncle proof.
                break;
            }

            assembly { shift := and(calldataload(sub(offset, 28)), 0xffff) }
            require (shift + 32 <= blobLength, "Shift bounds check.");

            offset += 4;
            assembly { hashSlot := calldataload(add(offset, shift)) }
            require (hashSlot == 0, "Non-empty hash slot.");

            assembly {
                calldatacopy(scratchBuf1, offset, blobLength)
                mstore(add(scratchBuf1, shift), seedHash)
                seedHash := sha3(scratchBuf1, blobLength)
                uncleHeaderLength := blobLength
            }
        }

        // At this moment the uncle hash is known.
        uncleHash = bytes32(seedHash);

        // Construct the uncle list of a canonical block.
        uint scratchBuf2 = scratchBuf1 + uncleHeaderLength;
        uint unclesLength; assembly { unclesLength := and(calldataload(sub(offset, 28)), 0xffff) }
        uint unclesShift;  assembly { unclesShift := and(calldataload(sub(offset, 26)), 0xffff) }
        require (unclesShift + uncleHeaderLength <= unclesLength, "Shift bounds check.");

        offset += 6;
        assembly { calldatacopy(scratchBuf2, offset, unclesLength) }
        memcpy(scratchBuf2 + unclesShift, scratchBuf1, uncleHeaderLength);

        assembly { seedHash := sha3(scratchBuf2, unclesLength) }

        offset += unclesLength;

        // Verify the canonical block header using the computed sha3Uncles.
        assembly {
            blobLength := and(calldataload(sub(offset, 30)), 0xffff)
            shift := and(calldataload(sub(offset, 28)), 0xffff)
        }
        require (shift + 32 <= blobLength, "Shift bounds check.");

        offset += 4;
        assembly { hashSlot := calldataload(add(offset, shift)) }
        require (hashSlot == 0, "Non-empty hash slot.");

        assembly {
            calldatacopy(scratchBuf1, offset, blobLength)
            mstore(add(scratchBuf1, shift), seedHash)

            // At this moment the canonical block hash is known.
            blockHash := sha3(scratchBuf1, blobLength)
        }
    }

    // Helper to check the placeBet receipt. "offset" is the location of the proof beginning in the calldata.
    // RLP layout: [triePath, str([status, cumGasUsed, bloomFilter, [[address, [topics], data]])]
    function requireCorrectReceipt(uint offset) view private {
        uint leafHeaderByte; assembly { leafHeaderByte := byte(0, calldataload(offset)) }

        require (leafHeaderByte >= 0xf7, "Receipt leaf longer than 55 bytes.");
        offset += leafHeaderByte - 0xf6;

        uint pathHeaderByte; assembly { pathHeaderByte := byte(0, calldataload(offset)) }

        if (pathHeaderByte <= 0x7f) {
            offset += 1;

        } else {
            require (pathHeaderByte >= 0x80 && pathHeaderByte <= 0xb7, "Path is an RLP string.");
            offset += pathHeaderByte - 0x7f;
        }

        uint receiptStringHeaderByte; assembly { receiptStringHeaderByte := byte(0, calldataload(offset)) }
        require (receiptStringHeaderByte == 0xb9, "Receipt string is always at least 256 bytes long, but less than 64k.");
        offset += 3;

        uint receiptHeaderByte; assembly { receiptHeaderByte := byte(0, calldataload(offset)) }
        require (receiptHeaderByte == 0xf9, "Receipt is always at least 256 bytes long, but less than 64k.");
        offset += 3;

        uint statusByte; assembly { statusByte := byte(0, calldataload(offset)) }
        require (statusByte == 0x1, "Status should be success.");
        offset += 1;

        uint cumGasHeaderByte; assembly { cumGasHeaderByte := byte(0, calldataload(offset)) }
        if (cumGasHeaderByte <= 0x7f) {
            offset += 1;

        } else {
            require (cumGasHeaderByte >= 0x80 && cumGasHeaderByte <= 0xb7, "Cumulative gas is an RLP string.");
            offset += cumGasHeaderByte - 0x7f;
        }

        uint bloomHeaderByte; assembly { bloomHeaderByte := byte(0, calldataload(offset)) }
        require (bloomHeaderByte == 0xb9, "Bloom filter is always 256 bytes long.");
        offset += 256 + 3;

        uint logsListHeaderByte; assembly { logsListHeaderByte := byte(0, calldataload(offset)) }
        require (logsListHeaderByte == 0xf8, "Logs list is less than 256 bytes long.");
        offset += 2;

        uint logEntryHeaderByte; assembly { logEntryHeaderByte := byte(0, calldataload(offset)) }
        require (logEntryHeaderByte == 0xf8, "Log entry is less than 256 bytes long.");
        offset += 2;

        uint addressHeaderByte; assembly { addressHeaderByte := byte(0, calldataload(offset)) }
        require (addressHeaderByte == 0x94, "Address is 20 bytes long.");

        uint logAddress; assembly { logAddress := and(calldataload(sub(offset, 11)), 0xffffffffffffffffffffffffffffffffffffffff) }
        require (logAddress == uint(address(this)));
    }

    // Memory copy.
    function memcpy(uint dest, uint src, uint len) pure private {
        // Full 32 byte words
        for(; len >= 32; len -= 32) {
            assembly { mstore(dest, mload(src)) }
            dest += 32; src += 32;
        }

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

    Contract ABI  
[{"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":"jackpotSize","outputs":[{"name":"","type":"uint128"}],"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":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"},{"name":"canonicalBlockNumber","type":"uint40"}],"name":"settleBetUncleMerkleProof","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxProfit","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":"acceptNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nextOwner","type":"address"}],"name":"approveNextOwner","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"},{"constant":false,"inputs":[{"name":"_maxProfit","type":"uint256"}],"name":"setMaxProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"FailedPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Payment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"JackpotPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"commit","type":"uint256"}],"name":"Commit","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405234801561001057600080fd5b5060008054600160a060020a0319908116331790915560038054821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90811790915560068054909216179055612502806100606000396000f3006080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100fd5780634d61537f1461011257806357246d23146101435780635e83b463146101745780636b5c5f391461018e57806374e048d5146101a35780638da5cb5b146101c5578063b539cd55146101da578063c107532914610201578063ca722cdc14610225578063d06c54fb14610240578063d579fd4414610255578063d6d30a5114610276578063d702087f1461028e578063df88126f146102af578063e1fdb4b4146102c4578063f8bb201c146102dc578063fbd668a9146102fd575b005b34801561010957600080fd5b506100fb610315565b34801561011e57600080fd5b50610127610439565b60408051600160a060020a039092168252519081900360200190f35b34801561014f57600080fd5b50610158610448565b604080516001608060020a039092168252519081900360200190f35b6100fb60043560243560443560643560843560a435610457565b34801561019a57600080fd5b50610127610b06565b3480156101af57600080fd5b506100fb60043564ffffffffff60243516610b15565b3480156101d157600080fd5b50610127610cfc565b3480156101e657600080fd5b506101ef610d0b565b60408051918252519081900360200190f35b34801561020d57600080fd5b506100fb600160a060020a0360043516602435610d11565b34801561023157600080fd5b506100fb600435602435610e79565b34801561024c57600080fd5b506100fb6110c6565b34801561026157600080fd5b506100fb600160a060020a036004351661116b565b34801561028257600080fd5b506100fb600435611262565b34801561029a57600080fd5b506100fb600160a060020a03600435166113eb565b3480156102bb57600080fd5b5061015861147c565b3480156102d057600080fd5b506100fb600435611492565b3480156102e857600080fd5b506100fb600160a060020a0360043516611648565b34801561030957600080fd5b506100fb6004356116d9565b600054600160a060020a03163314610377576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b600454608060020a90046001608060020a03161561042b576040805160e560020a62461bcd02815260206004820152604860248201527f416c6c20626574732073686f756c642062652070726f6365737365642028736560448201527f74746c6564206f7220726566756e64656429206265666f72652073656c662d6460648201527f657374727563742e000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600054600160a060020a0316ff5b600354600160a060020a031681565b6004546001608060020a031681565b60008381526005602052604081206001810154909190819081908190819081906c010000000000000000000000009004600160a060020a03161561050b576040805160e560020a62461bcd02815260206004820152602160248201527f4265742073686f756c6420626520696e20612027636c65616e2720737461746560448201527f2e00000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b34955060018c11801561051f575060648c11155b1515610575576040805160e560020a62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b662386f26fc1000086101580156105965750693f870857a3e0e38000008611155b15156105ec576040805160e560020a62461bcd02815260206004820152601e60248201527f416d6f756e742073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b60008d1180156106015750650100000000008d105b1515610657576040805160e560020a62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b438b10156106af576040805160e560020a62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b8a8a604051602001808364ffffffffff1664ffffffffff167b01000000000000000000000000000000000000000000000000000000028152600501828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106107325780518252601f199092019160209182019101610713565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209450600185601b8b8b604051600081526020016040526040518085600019166000191681526020018460ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af11580156107d6573d6000803e3d6000fd5b5050604051601f190151600354600160a060020a039081169116149050610847576040805160e560020a62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b60288c1161089a57603f7920000000001000000000080000000004000000000200000000018e027e01041041041041041041041041041041041041041041041041041041041041160693508c925061092a565b60008d1180156108aa57508b8d11155b1515610926576040805160e560020a62461bcd02815260206004820152602e60248201527f48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676560448201527f72207468616e206d6f64756c6f2e000000000000000000000000000000000000606482015290519081900360840190fd5b8c93505b610935868d866117c7565b60025491935091508601821115610996576040805160e560020a62461bcd02815260206004820152601a60248201527f6d617850726f666974206c696d69742076696f6c6174696f6e2e000000000000604482015290519081900360640190fd5b600480546001608060020a03608060020a808304821686018216810292821692909217808216850182166fffffffffffffffffffffffffffffffff19919091161792839055303183821692909304811691909101161115610a41576040805160e560020a62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b604080518b815290517f5bdd2fc99022530157777690475b670d3872f32262eb1d47d9ba8000dad58f879181900360200190a150509284556001909301805460ff191660ff998a161761ff00191661010099909416989098029290921766ffffffffff00001916620100004364ffffffffff90811691909102919091176bffffffffff0000000000000019166701000000000000009190921602176bffffffffffffffffffffffff16336c010000000000000000000000000217909555505050505050565b600654600160a060020a031681565b600654600090819081908190600160a060020a03163314610ba6576040805160e560020a62461bcd02815260206004820152602c60248201527f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e60448201527f6f6e2d63726f75706965722e0000000000000000000000000000000000000000606482015290519081900360840190fd5b85604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610bf55780518252601f199092019160209182019101610bd6565b51815160209384036101000a600019018019909216911617905260408051929094018290039091206000818152600590925292902091975090955050505060fa64ffffffffff861601431115610cbb576040805160e560020a62461bcd02815260206004820152602260248201527f426c6f636b686173682063616e2774206265207175657269656420627920455660448201527f4d2e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610cc5604861190f565b610cd0846044611e90565b909250905064ffffffffff8516408214610ce957600080fd5b610cf483878361211e565b505050505050565b600054600160a060020a031681565b60025481565b600054600160a060020a03163314610d73576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b3031811115610df1576040805160e560020a62461bcd028152602060048201526024808201527f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6160448201527f6e63652e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60045430316001608060020a03808316608060020a90930481169290920190911682011115610e6a576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604482015290519081900360640190fd5b610e758282836123bf565b5050565b60065460009081908190600160a060020a03163314610f08576040805160e560020a62461bcd02815260206004820152602c60248201527f4f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e60448201527f6f6e2d63726f75706965722e0000000000000000000000000000000000000000606482015290519081900360840190fd5b84604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610f575780518252601f199092019160209182019101610f38565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526005909252929020600181015492975095505062010000900464ffffffffff169250504382109050611026576040805160e560020a62461bcd02815260206004820152603360248201527f736574746c6542657420696e207468652073616d6520626c6f636b206173207060448201527f6c6163654265742c206f72206265666f72652e00000000000000000000000000606482015290519081900360840190fd5b60fa81014311156110a7576040805160e560020a62461bcd02815260206004820152602260248201527f426c6f636b686173682063616e2774206265207175657269656420627920455660448201527f4d2e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b804084146110b457600080fd5b6110bf82868661211e565b5050505050565b600154600160a060020a0316331461113a576040805160e560020a62461bcd02815260206004820152602660248201527f43616e206f6e6c792061636365707420707265617070726f766564206e657720604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b6001546000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600054600160a060020a031633146111cd576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b600054600160a060020a0382811691161415611233576040805160e560020a62461bcd02815260206004820152601d60248201527f43616e6e6f7420617070726f76652063757272656e74206f776e65722e000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a031633146112c4576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b3031811115611342576040805160e560020a62461bcd028152602060048201526024808201527f496e63726561736520616d6f756e74206c6172676572207468616e2062616c6160448201527f6e63652e00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60045430316001608060020a03808316608060020a909304811692909201909116820111156113bb576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604482015290519081900360640190fd5b600480546fffffffffffffffffffffffffffffffff1981166001608060020a039182169390930116919091179055565b600054600160a060020a0316331461144d576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600454608060020a90046001608060020a031681565b60008181526005602052604081208054909180821515611522576040805160e560020a62461bcd02815260206004820152602260248201527f4265742073686f756c6420626520696e20616e2027616374697665272073746160448201527f7465000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600184015464ffffffffff620100009091041660fa0143116115b4576040805160e560020a62461bcd02815260206004820152602260248201527f426c6f636b686173682063616e2774206265207175657269656420627920455660448201527f4d2e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000845560018401546115d490849060ff808216916101009004166117c7565b600480546001608060020a03608060020a8083048216869003821602918116919091178082168490039091166fffffffffffffffffffffffffffffffff1991909116179055600186015491935091506110bf90600160a060020a036c010000000000000000000000009091041684806123bf565b600054600160a060020a031633146116aa576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461173b576040805160e560020a62461bcd02815260206004820152602660248201526000805160206124b7833981519152604482015260d160020a6537bbb732b91702606482015290519081900360840190fd5b693f870857a3e0e380000081106117c2576040805160e560020a62461bcd02815260206004820152602260248201527f6d617850726f6669742073686f756c6420626520612073616e65206e756d626560448201527f722e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600255565b60008060008360001080156117dc5750848411155b1515611832576040805160e560020a62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b67016345785d8a0000861015611849576000611852565b66038d7ea4c680005b91505060648504660110d9316ec0008110156118725750660110d9316ec0005b8082018610156118f2576040805160e560020a62461bcd02815260206004820152602260248201527f42657420646f65736e2774206576656e20636f76657220686f7573652065646760448201527f652e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b838583838903030281151561190357fe5b04925050935093915050565b8035600090811a9080808080808080808060f78b101561199f576040805160e560020a62461bcd02815260206004820152602260248201527f52656365697074206c656166206c6f6e676572207468616e203535206279746560448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b9a8a0160f519019a8b3560001a9950607f8a116119c15760018c019b50611a32565b60808a101580156119d3575060b78a11155b1515611a29576040805160e560020a62461bcd02815260206004820152601660248201527f5061746820697320616e20524c5020737472696e672e00000000000000000000604482015290519081900360640190fd5b9a8901607e19019a5b8b3560001a985060b98914611ade576040805160e560020a62461bcd028152602060048201526044602482018190527f5265636569707420737472696e6720697320616c77617973206174206c656173908201527f7420323536206279746573206c6f6e672c20627574206c657373207468616e2060648201527f36346b2e00000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b60039b909b019a8b3560001a975060f98814611b6a576040805160e560020a62461bcd02815260206004820152603d60248201527f5265636569707420697320616c77617973206174206c6561737420323536206260448201527f79746573206c6f6e672c20627574206c657373207468616e2036346b2e000000606482015290519081900360840190fd5b60039b909b019a8b3560001a965060018714611bd0576040805160e560020a62461bcd02815260206004820152601960248201527f5374617475732073686f756c6420626520737563636573732e00000000000000604482015290519081900360640190fd5b60019b909b019a8b3560001a9550607f8611611bf15760018c019b50611c62565b60808610158015611c03575060b78611155b1515611c59576040805160e560020a62461bcd02815260206004820181905260248201527f43756d756c61746976652067617320697320616e20524c5020737472696e672e604482015290519081900360640190fd5b9a8501607e19019a5b8b3560001a945060b98514611ce7576040805160e560020a62461bcd02815260206004820152602660248201527f426c6f6f6d2066696c74657220697320616c776179732032353620627974657360448201527f206c6f6e672e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6101039b909b019a8b3560001a935060f88414611d74576040805160e560020a62461bcd02815260206004820152602660248201527f4c6f6773206c697374206973206c657373207468616e2032353620627974657360448201527f206c6f6e672e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60029b909b019a8b3560001a925060f88314611e00576040805160e560020a62461bcd02815260206004820152602660248201527f4c6f6720656e747279206973206c657373207468616e2032353620627974657360448201527f206c6f6e672e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60029b909b019a8b3560001a915060948214611e66576040805160e560020a62461bcd02815260206004820152601960248201527f41646472657373206973203230206279746573206c6f6e672e00000000000000604482015290519081900360640190fd5b50600a198b0135600160a060020a0316308114611e8257600080fd5b505050505050505050505050565b6040516000908190818080808080805b601d198b013561ffff169550851515611eb857611f9c565b601b198b013561ffff16945060208501861015611f1f576040805160e560020a62461bcd02815260206004820152601360248201527f536869667420626f756e647320636865636b2e00000000000000000000000000604482015290519081900360640190fd5b60048b81019b8601013593508315611f81576040805160e560020a62461bcd02815260206004820152601460248201527f4e6f6e2d656d707479206861736820736c6f742e000000000000000000000000604482015290519081900360640190fd5b858b89378b858901528588209b50859650858b019a50611ea0565b508a9750505083850161ffff601b198a01358116906019198b013516808701821015612012576040805160e560020a62461bcd02815260206004820152601360248201527f536869667420626f756e647320636865636b2e00000000000000000000000000604482015290519081900360640190fd5b60068b019a50818b84376120298184018989612472565b8183209b509981019961ffff601d198c013581169650601b198c0135169450602085018610156120a3576040805160e560020a62461bcd02815260206004820152601360248201527f536869667420626f756e647320636865636b2e00000000000000000000000000604482015290519081900360640190fd5b60048b81019b8601013593508315612105576040805160e560020a62461bcd02815260206004820152601460248201527f4e6f6e2d656d707479206861736820736c6f742e000000000000000000000000604482015290519081900360640190fd5b858b893750505050830196909652509390932093915050565b8254600184015460ff808216916101008104909116906c010000000000000000000000009004600160a060020a031660008080808080808a15156121d2576040805160e560020a62461bcd02815260206004820152602260248201527f4265742073686f756c6420626520696e20616e2027616374697665272073746160448201527f7465000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008e600001819055508c8c604051602001808381526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061223b5780518252601f19909201916020918201910161221c565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912099508c92508991505081151561227657fe5b0695506122848b8b8b6117c7565b90955093506000925082915060288a116122c45760018e0154600287900a6701000000000000009091041664ffffffffff16156122bf578492505b6122d0565b888610156122d0578492505b600480546001608060020a03608060020a8083048216899003821602911617905567016345785d8a00008b10612349576103e88a8881151561230e57fe5b0481151561231857fe5b06905080151561234957600480546fffffffffffffffffffffffffffffffff1981169091556001608060020a031691505b600082111561239257604080518381529051600160a060020a038a16917fc388db0e8aa560a59633c094a0d0aa21322cd6234836fd5bac00fc5ae63b5783919081900360200190a25b6123af88848401156123a6578385016123a9565b60015b856123bf565b5050505050505050505050505050565b604051600160a060020a0384169083156108fc029084906000818181858888f193505050501561242d57604080518281529051600160a060020a038516917fd4f43975feb89f48dd30cabbb32011045be187d1e11c8ea9faa43efc35282519919081900360200190a261246d565b604080518381529051600160a060020a038516917fac464fe4d3a86b9121261ac0a01dd981bfe0777c7c9d9c8f4473d31a9c0f9d2d919081900360200190a25b505050565b60005b60208210612497578251845260209384019390920191601f1990910190612475565b50905182516020929092036101000a600019018019909116911617905256004f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2da165627a7a7230582097a658d8cae8d3fc8b1b58edee5c8be8d1da3ad9373a1dfda4a8ebfa493423dd0029

   Swarm Source:
bzzr://97a658d8cae8d3fc8b1b58edee5c8be8d1da3ad9373a1dfda4a8ebfa493423dd

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.