Abstract Testnet

Contract

0xe9CBFEe55079B6fBD8773919abeD75B4A1BE70Be

Overview

ETH Balance

0.047421481710836779 ETH

Token Holdings

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Flip57690672025-02-04 20:05:302 hrs ago1738699530IN
0xe9CBFEe5...4A1BE70Be
0.01436042 ETH0.000004890.025
Flip57689922025-02-04 20:03:442 hrs ago1738699424IN
0xe9CBFEe5...4A1BE70Be
0.01436042 ETH0.000004880.025
Flip57683152025-02-04 19:47:132 hrs ago1738698433IN
0xe9CBFEe5...4A1BE70Be
0.01412036 ETH0.000004960.025
Flip57681212025-02-04 19:42:403 hrs ago1738698160IN
0xe9CBFEe5...4A1BE70Be
0.01412036 ETH0.000004880.025
Flip57680602025-02-04 19:40:583 hrs ago1738698058IN
0xe9CBFEe5...4A1BE70Be
0.01412036 ETH0.000004960.025
Flip57679442025-02-04 19:38:123 hrs ago1738697892IN
0xe9CBFEe5...4A1BE70Be
0.01403432 ETH0.000004720.025
Flip57678502025-02-04 19:35:533 hrs ago1738697753IN
0xe9CBFEe5...4A1BE70Be
0.01403432 ETH0.000007730.025
Flip57675862025-02-04 19:29:113 hrs ago1738697351IN
0xe9CBFEe5...4A1BE70Be
0.01052837 ETH0.000010980.025
Flip57560572025-02-04 15:53:006 hrs ago1738684380IN
0xe9CBFEe5...4A1BE70Be
0.01076665 ETH0.000010620.025
Flip57558692025-02-04 15:49:446 hrs ago1738684184IN
0xe9CBFEe5...4A1BE70Be
0.01076665 ETH0.000008070.025
Flip57556742025-02-04 15:46:146 hrs ago1738683974IN
0xe9CBFEe5...4A1BE70Be
0.01076665 ETH0.000010620.025
Flip57553642025-02-04 15:39:587 hrs ago1738683598IN
0xe9CBFEe5...4A1BE70Be
0.01084033 ETH0.000016080.025
Flip57518262025-02-04 14:11:088 hrs ago1738678268IN
0xe9CBFEe5...4A1BE70Be
0.01788092 ETH0.00001140.025
Flip57515792025-02-04 14:04:328 hrs ago1738677872IN
0xe9CBFEe5...4A1BE70Be
0.01068639 ETH0.00001140.025
Flip57514882025-02-04 14:02:108 hrs ago1738677730IN
0xe9CBFEe5...4A1BE70Be
0.01068639 ETH0.000017160.025
Flip57507742025-02-04 13:47:398 hrs ago1738676859IN
0xe9CBFEe5...4A1BE70Be
0.01272442 ETH0.00001080.025
Flip57506232025-02-04 13:44:189 hrs ago1738676658IN
0xe9CBFEe5...4A1BE70Be
0.01413708 ETH0.000010870.025
Flip57505882025-02-04 13:43:279 hrs ago1738676607IN
0xe9CBFEe5...4A1BE70Be
0.01413708 ETH0.00001080.025
Flip57502582025-02-04 13:36:329 hrs ago1738676192IN
0xe9CBFEe5...4A1BE70Be
0.01413171 ETH0.000012480.025
Flip57495402025-02-04 13:20:429 hrs ago1738675242IN
0xe9CBFEe5...4A1BE70Be
0.01774965 ETH0.000010280.025
Flip57492642025-02-04 13:14:199 hrs ago1738674859IN
0xe9CBFEe5...4A1BE70Be
0.01774965 ETH0.00001550.025
Flip57228462025-02-04 2:15:3620 hrs ago1738635336IN
0xe9CBFEe5...4A1BE70Be
0.01756058 ETH0.000007010.025

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
57690692025-02-04 20:05:322 hrs ago1738699532
0xe9CBFEe5...4A1BE70Be
0 ETH
57690692025-02-04 20:05:322 hrs ago1738699532
0xe9CBFEe5...4A1BE70Be
0 ETH
57690692025-02-04 20:05:322 hrs ago1738699532
0xe9CBFEe5...4A1BE70Be
0 ETH
57690692025-02-04 20:05:322 hrs ago1738699532
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0.0000105 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0.0000105 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0 ETH
57690672025-02-04 20:05:302 hrs ago1738699530
0xe9CBFEe5...4A1BE70Be
0.01436042 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0.02798235 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0.02798235 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0.00071749 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689942025-02-04 20:03:462 hrs ago1738699426
0xe9CBFEe5...4A1BE70Be
0 ETH
57689922025-02-04 20:03:442 hrs ago1738699424
0xe9CBFEe5...4A1BE70Be
0 ETH
57689922025-02-04 20:03:442 hrs ago1738699424
0xe9CBFEe5...4A1BE70Be
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CoinFlip

Compiler Version
v0.8.28+commit.7893614a

ZkSolc Version
v1.5.11

Optimization Enabled:
Yes with Mode 3

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : flip.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

// Import Entropy interfaces from the Pyth Network Entropy SDK.
import "@pythnetwork/entropy-sdk-solidity/IEntropy.sol";
import "@pythnetwork/entropy-sdk-solidity/IEntropyConsumer.sol";

// Import OpenZeppelin contracts for security and access control.
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

/// @title Mutable-Bet-Limits CoinFlip Contract with Commission Wallet
/// @notice This contract implements a coin flip game using secure randomness via the Entropy SDK.
/// When a player wins, the full win amount (double their bet) is split:
/// - A commission (calculated in basis points) is sent to a designated commission wallet.
/// - The remaining amount is sent to the player.
/// The commission wallet is initially set to 0x86605872B0cbDF364C283E76921ee22546c692f2 and can be updated.
contract CoinFlip is IEntropyConsumer, ReentrancyGuard, Pausable {
    /*//////////////////////////////////////////////////////////////
                              EVENTS
    //////////////////////////////////////////////////////////////*/
    event FlipRequested(uint64 sequenceNumber, address indexed player, uint256 betAmount);
    event FlipResult(uint64 sequenceNumber, bool isHeads, address indexed player, uint256 betAmount, uint256 payout);
    event BetRefunded(uint64 sequenceNumber, address indexed player, uint256 betAmount);
    event BetLimitsUpdated(uint256 newMinBet, uint256 newMaxBet);
    event ProviderUpdated(address newProvider);
    event EntropyUpdated(address newEntropy);
    event CommissionWalletUpdated(address newCommissionWallet);

    /*//////////////////////////////////////////////////////////////
                        CONFIGURABLE PARAMETERS
    //////////////////////////////////////////////////////////////*/

    // Commission is defined in basis points (e.g., 2.5% = 250)
    uint256 public constant COMMISSION = 250;
    uint256 public constant BASIS_POINTS = 10000;
    uint256 public constant REFUND_DELAY = 1 days;

    // Mutable bet limits (modifiable by the owner)
    uint256 public minBet;
    uint256 public maxBet;

    // The wallet that will receive the commission fees.
    address public commissionWallet;

    // Counter for pending bets
    uint256 public pendingBetsCount;

    /*//////////////////////////////////////////////////////////////
                            STATE VARIABLES
    //////////////////////////////////////////////////////////////*/

    IEntropy public entropy;
    address public provider;
    address public immutable owner;

    // Structure representing a bet
    struct Bet {
        address player;
        uint256 betAmount;
        uint256 timestamp;
    }

    // Mapping to track pending bets using a sequence number.
    mapping(uint64 => Bet) public pendingBets;

    /*//////////////////////////////////////////////////////////////
                              MODIFIERS
    //////////////////////////////////////////////////////////////*/

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    /*//////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    /// @notice Initializes the contract with the Entropy parameters, bet limits, and commission wallet.
    /// @param _entropy The Entropy contract address.
    /// @param _provider The randomness provider address.
    /// @param _minBet The initial minimum bet.
    /// @param _maxBet The initial maximum bet.
    /// @param _commissionWallet The commission wallet address.
    constructor(
        address _entropy,
        address _provider,
        uint256 _minBet,
        uint256 _maxBet,
        address _commissionWallet
    ) payable {
        require(_minBet <= _maxBet, "Initial min bet must not exceed max bet");
        entropy = IEntropy(_entropy);
        provider = _provider;
        owner = msg.sender;
        minBet = _minBet;
        maxBet = _maxBet;
        commissionWallet = _commissionWallet;
    }

    /*//////////////////////////////////////////////////////////////
                            OWNER FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Updates the minimum and maximum bet limits.
    function setBetLimits(uint256 _minBet, uint256 _maxBet) external onlyOwner {
        require(_minBet <= _maxBet, "Min bet must not exceed max bet");
        minBet = _minBet;
        maxBet = _maxBet;
        emit BetLimitsUpdated(_minBet, _maxBet);
    }

    /// @notice Updates the randomness provider address.
    function updateProvider(address _provider) external onlyOwner {
        require(pendingBetsCount == 0, "Pending bets exist");
        provider = _provider;
        emit ProviderUpdated(_provider);
    }

    /// @notice Updates the Entropy contract address.
    function updateEntropy(address _entropy) external onlyOwner {
        require(pendingBetsCount == 0, "Pending bets exist");
        entropy = IEntropy(_entropy);
        emit EntropyUpdated(_entropy);
    }

    /// @notice Updates the commission wallet address.
    function updateCommissionWallet(address _commissionWallet) external onlyOwner {
        commissionWallet = _commissionWallet;
        emit CommissionWalletUpdated(_commissionWallet);
    }

    /// @notice Pauses the contract.
    function pause() external onlyOwner {
        _pause();
    }

    /// @notice Unpauses the contract.
    function unpause() external onlyOwner {
        _unpause();
    }

    /*//////////////////////////////////////////////////////////////
                       IEntropyConsumer IMPLEMENTATION
    //////////////////////////////////////////////////////////////*/

    /// @notice Returns the Entropy contract address.
    function getEntropy() internal view override returns (address) {
        return address(entropy);
    }

    /// @notice Internal callback invoked when randomness is available.
    /// @dev Processes the bet outcome. For a winning bet, the full win amount (2×bet) is split:
    /// - The commission is sent to the commission wallet.
    /// - The remaining payout is sent to the player.
    function entropyCallback(
        uint64 sequenceNumber,
        address _unusedProvider,
        bytes32 randomNumber
    ) internal override {
        _unusedProvider; // Silence unused parameter warning.
        Bet memory bet = pendingBets[sequenceNumber];
        if (bet.player == address(0)) {
            // Bet already processed or refunded.
            return;
        }

        // Determine win condition: if the random number is even, the player wins.
        bool isHeads = (uint256(randomNumber) % 2 == 0);
        uint256 payout = 0;

        if (isHeads) {
            // Full win amount is twice the bet.
            uint256 fullWin = 2 * bet.betAmount;
            // Commission is a percentage of the full win.
            uint256 commissionAmount = (2 * bet.betAmount * COMMISSION) / BASIS_POINTS;
            // Player receives the win minus the commission.
            uint256 playerPayout = fullWin - commissionAmount;
            require(address(this).balance >= fullWin, "Insufficient funds for payout");

            // Transfer commission directly to the commission wallet.
            (bool commissionSent, ) = commissionWallet.call{value: commissionAmount}("");
            require(commissionSent, "Commission transfer failed");

            // Transfer the remaining payout to the player.
            (bool playerSent, ) = bet.player.call{value: playerPayout}("");
            require(playerSent, "Payout transfer failed");
            payout = playerPayout;
        }
        // Remove the bet and update the pending bets counter.
        delete pendingBets[sequenceNumber];
        pendingBetsCount--;

        emit FlipResult(sequenceNumber, isHeads, bet.player, bet.betAmount, payout);
    }

    /// @notice External wrapper for the entropy callback.
    /// @dev This function is called by the Entropy provider. It ensures that only the trusted
    /// Entropy contract can trigger the callback.
    function receiveEntropy(
        uint64 sequenceNumber,
        address _unusedProvider,
        bytes32 randomNumber
    ) external nonReentrant whenNotPaused {
        require(msg.sender == address(entropy), "Unauthorized caller");
        entropyCallback(sequenceNumber, _unusedProvider, randomNumber);
    }

    /*//////////////////////////////////////////////////////////////
                             BETTING FUNCTION
    //////////////////////////////////////////////////////////////*/

    /// @notice Initiates a coin flip bet.
    /// @dev The caller must send enough ETH to cover both the bet and the randomness fee.
    function flip(bytes32 userRandomNumber) external payable whenNotPaused nonReentrant {
        uint128 requestFee = entropy.getFee(provider);
        require(msg.value >= requestFee + minBet, "Not enough ETH for bet + fee");
        require(msg.value <= requestFee + maxBet, "Bet exceeds maximum allowed");

        uint256 betAmount = msg.value - requestFee;
        uint64 sequenceNumber = entropy.requestWithCallback{value: requestFee}(provider, userRandomNumber);

        pendingBets[sequenceNumber] = Bet({
            player: msg.sender,
            betAmount: betAmount,
            timestamp: block.timestamp
        });
        pendingBetsCount++;

        emit FlipRequested(sequenceNumber, msg.sender, betAmount);
    }

    /*//////////////////////////////////////////////////////////////
                    PENDING BET REFUND FUNCTION
    //////////////////////////////////////////////////////////////*/

    /// @notice Allows a player to claim a refund if the bet remains pending beyond the refund delay.
    function claimRefund(uint64 sequenceNumber) external nonReentrant {
        Bet memory bet = pendingBets[sequenceNumber];
        require(bet.player != address(0), "No pending bet found");
        require(msg.sender == bet.player, "Not the bet owner");
        require(block.timestamp >= bet.timestamp + REFUND_DELAY, "Refund period not reached");

        delete pendingBets[sequenceNumber];
        pendingBetsCount--;

        (bool sent, ) = bet.player.call{value: bet.betAmount}("");
        require(sent, "Refund transfer failed");

        emit BetRefunded(sequenceNumber, bet.player, bet.betAmount);
    }

    /*//////////////////////////////////////////////////////////////
                          POOL MANAGEMENT
    //////////////////////////////////////////////////////////////*/

    /// @notice Allows the owner to deposit ETH into the contract.
    function deposit() external payable onlyOwner {}

    /// @notice Allows the owner to withdraw ETH from the contract.
    function withdraw(uint256 amount) external onlyOwner nonReentrant {
        require(address(this).balance >= amount, "Insufficient contract balance");
        (bool sent, ) = owner.call{value: amount}("");
        require(sent, "Withdrawal failed");
    }

    /*//////////////////////////////////////////////////////////////
                      EMERGENCY RESOLUTION FUNCTION
    //////////////////////////////////////////////////////////////*/

    /// @notice Emergency function to manually resolve a bet.
    function emergencyResolveBet(
        uint64 sequenceNumber,
        bool isHeadsOverride,
        uint256 payoutOverride
    ) external onlyOwner nonReentrant {
        Bet memory bet = pendingBets[sequenceNumber];
        require(bet.player != address(0), "No pending bet found");

        if (isHeadsOverride) {
            require(address(this).balance >= payoutOverride, "Insufficient funds for payout");
            (bool sent, ) = bet.player.call{value: payoutOverride}("");
            require(sent, "Payout transfer failed");
        }

        delete pendingBets[sequenceNumber];
        pendingBetsCount--;

        emit FlipResult(sequenceNumber, isHeadsOverride, bet.player, bet.betAmount, payoutOverride);
    }

    /*//////////////////////////////////////////////////////////////
                           FALLBACK FUNCTION
    //////////////////////////////////////////////////////////////*/

    /// @notice Fallback function to accept ETH sent directly to the contract.
    receive() external payable {}
}

File 2 of 8 : IEntropy.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;

import "./EntropyEvents.sol";

interface IEntropy is EntropyEvents {
    // Register msg.sender as a randomness provider. The arguments are the provider's configuration parameters
    // and initial commitment. Re-registering the same provider rotates the provider's commitment (and updates
    // the feeInWei).
    //
    // chainLength is the number of values in the hash chain *including* the commitment, that is, chainLength >= 1.
    function register(
        uint128 feeInWei,
        bytes32 commitment,
        bytes calldata commitmentMetadata,
        uint64 chainLength,
        bytes calldata uri
    ) external;

    // Withdraw a portion of the accumulated fees for the provider msg.sender.
    // Calling this function will transfer `amount` wei to the caller (provided that they have accrued a sufficient
    // balance of fees in the contract).
    function withdraw(uint128 amount) external;

    // Withdraw a portion of the accumulated fees for provider. The msg.sender must be the fee manager for this provider.
    // Calling this function will transfer `amount` wei to the caller (provided that they have accrued a sufficient
    // balance of fees in the contract).
    function withdrawAsFeeManager(address provider, uint128 amount) external;

    // As a user, request a random number from `provider`. Prior to calling this method, the user should
    // generate a random number x and keep it secret. The user should then compute hash(x) and pass that
    // as the userCommitment argument. (You may call the constructUserCommitment method to compute the hash.)
    //
    // This method returns a sequence number. The user should pass this sequence number to
    // their chosen provider (the exact method for doing so will depend on the provider) to retrieve the provider's
    // number. The user should then call fulfillRequest to construct the final random number.
    //
    // This method will revert unless the caller provides a sufficient fee (at least getFee(provider)) as msg.value.
    // Note that excess value is *not* refunded to the caller.
    function request(
        address provider,
        bytes32 userCommitment,
        bool useBlockHash
    ) external payable returns (uint64 assignedSequenceNumber);

    // Request a random number. The method expects the provider address and a secret random number
    // in the arguments. It returns a sequence number.
    //
    // The address calling this function should be a contract that inherits from the IEntropyConsumer interface.
    // The `entropyCallback` method on that interface will receive a callback with the generated random number.
    //
    // This method will revert unless the caller provides a sufficient fee (at least getFee(provider)) as msg.value.
    // Note that excess value is *not* refunded to the caller.
    function requestWithCallback(
        address provider,
        bytes32 userRandomNumber
    ) external payable returns (uint64 assignedSequenceNumber);

    // Fulfill a request for a random number. This method validates the provided userRandomness and provider's proof
    // against the corresponding commitments in the in-flight request. If both values are validated, this function returns
    // the corresponding random number.
    //
    // Note that this function can only be called once per in-flight request. Calling this function deletes the stored
    // request information (so that the contract doesn't use a linear amount of storage in the number of requests).
    // If you need to use the returned random number more than once, you are responsible for storing it.
    function reveal(
        address provider,
        uint64 sequenceNumber,
        bytes32 userRevelation,
        bytes32 providerRevelation
    ) external returns (bytes32 randomNumber);

    // Fulfill a request for a random number. This method validates the provided userRandomness
    // and provider's revelation against the corresponding commitment in the in-flight request. If both values are validated
    // and the requestor address is a contract address, this function calls the requester's entropyCallback method with the
    // sequence number, provider address and the random number as arguments. Else if the requestor is an EOA, it won't call it.
    //
    // Note that this function can only be called once per in-flight request. Calling this function deletes the stored
    // request information (so that the contract doesn't use a linear amount of storage in the number of requests).
    // If you need to use the returned random number more than once, you are responsible for storing it.
    //
    // Anyone can call this method to fulfill a request, but the callback will only be made to the original requester.
    function revealWithCallback(
        address provider,
        uint64 sequenceNumber,
        bytes32 userRandomNumber,
        bytes32 providerRevelation
    ) external;

    function getProviderInfo(
        address provider
    ) external view returns (EntropyStructs.ProviderInfo memory info);

    function getDefaultProvider() external view returns (address provider);

    function getRequest(
        address provider,
        uint64 sequenceNumber
    ) external view returns (EntropyStructs.Request memory req);

    function getFee(address provider) external view returns (uint128 feeAmount);

    function getAccruedPythFees()
        external
        view
        returns (uint128 accruedPythFeesInWei);

    function setProviderFee(uint128 newFeeInWei) external;

    function setProviderFeeAsFeeManager(
        address provider,
        uint128 newFeeInWei
    ) external;

    function setProviderUri(bytes calldata newUri) external;

    // Set manager as the fee manager for the provider msg.sender.
    // After calling this function, manager will be able to set the provider's fees and withdraw them.
    // Only one address can be the fee manager for a provider at a time -- calling this function again with a new value
    // will override the previous value. Call this function with the all-zero address to disable the fee manager role.
    function setFeeManager(address manager) external;

    function constructUserCommitment(
        bytes32 userRandomness
    ) external pure returns (bytes32 userCommitment);

    function combineRandomValues(
        bytes32 userRandomness,
        bytes32 providerRandomness,
        bytes32 blockHash
    ) external pure returns (bytes32 combinedRandomness);
}

File 3 of 8 : IEntropyConsumer.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;

abstract contract IEntropyConsumer {
    // This method is called by Entropy to provide the random number to the consumer.
    // It asserts that the msg.sender is the Entropy contract. It is not meant to be
    // override by the consumer.
    function _entropyCallback(
        uint64 sequence,
        address provider,
        bytes32 randomNumber
    ) external {
        address entropy = getEntropy();
        require(entropy != address(0), "Entropy address not set");
        require(msg.sender == entropy, "Only Entropy can call this function");

        entropyCallback(sequence, provider, randomNumber);
    }

    // getEntropy returns Entropy contract address. The method is being used to check that the
    // callback is indeed from Entropy contract. The consumer is expected to implement this method.
    // Entropy address can be found here - https://docs.pyth.network/entropy/contract-addresses
    function getEntropy() internal view virtual returns (address);

    // This method is expected to be implemented by the consumer to handle the random number.
    // It will be called by _entropyCallback after _entropyCallback ensures that the call is
    // indeed from Entropy contract.
    function entropyCallback(
        uint64 sequence,
        address provider,
        bytes32 randomNumber
    ) internal virtual;
}

File 4 of 8 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 5 of 8 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 6 of 8 : EntropyEvents.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "./EntropyStructs.sol";

interface EntropyEvents {
    event Registered(EntropyStructs.ProviderInfo provider);

    event Requested(EntropyStructs.Request request);
    event RequestedWithCallback(
        address indexed provider,
        address indexed requestor,
        uint64 indexed sequenceNumber,
        bytes32 userRandomNumber,
        EntropyStructs.Request request
    );

    event Revealed(
        EntropyStructs.Request request,
        bytes32 userRevelation,
        bytes32 providerRevelation,
        bytes32 blockHash,
        bytes32 randomNumber
    );
    event RevealedWithCallback(
        EntropyStructs.Request request,
        bytes32 userRandomNumber,
        bytes32 providerRevelation,
        bytes32 randomNumber
    );

    event ProviderFeeUpdated(address provider, uint128 oldFee, uint128 newFee);

    event ProviderUriUpdated(address provider, bytes oldUri, bytes newUri);

    event ProviderFeeManagerUpdated(
        address provider,
        address oldFeeManager,
        address newFeeManager
    );

    event Withdrawal(
        address provider,
        address recipient,
        uint128 withdrawnAmount
    );
}

File 7 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 8 of 8 : EntropyStructs.sol
// SPDX-License-Identifier: Apache 2

pragma solidity ^0.8.0;

contract EntropyStructs {
    struct ProviderInfo {
        uint128 feeInWei;
        uint128 accruedFeesInWei;
        // The commitment that the provider posted to the blockchain, and the sequence number
        // where they committed to this. This value is not advanced after the provider commits,
        // and instead is stored to help providers track where they are in the hash chain.
        bytes32 originalCommitment;
        uint64 originalCommitmentSequenceNumber;
        // Metadata for the current commitment. Providers may optionally use this field to help
        // manage rotations (i.e., to pick the sequence number from the correct hash chain).
        bytes commitmentMetadata;
        // Optional URI where clients can retrieve revelations for the provider.
        // Client SDKs can use this field to automatically determine how to retrieve random values for each provider.
        // TODO: specify the API that must be implemented at this URI
        bytes uri;
        // The first sequence number that is *not* included in the current commitment (i.e., an exclusive end index).
        // The contract maintains the invariant that sequenceNumber <= endSequenceNumber.
        // If sequenceNumber == endSequenceNumber, the provider must rotate their commitment to add additional random values.
        uint64 endSequenceNumber;
        // The sequence number that will be assigned to the next inbound user request.
        uint64 sequenceNumber;
        // The current commitment represents an index/value in the provider's hash chain.
        // These values are used to verify requests for future sequence numbers. Note that
        // currentCommitmentSequenceNumber < sequenceNumber.
        //
        // The currentCommitment advances forward through the provider's hash chain as values
        // are revealed on-chain.
        bytes32 currentCommitment;
        uint64 currentCommitmentSequenceNumber;
        // An address that is authorized to set / withdraw fees on behalf of this provider.
        address feeManager;
    }

    struct Request {
        // Storage slot 1 //
        address provider;
        uint64 sequenceNumber;
        // The number of hashes required to verify the provider revelation.
        uint32 numHashes;
        // Storage slot 2 //
        // The commitment is keccak256(userCommitment, providerCommitment). Storing the hash instead of both saves 20k gas by
        // eliminating 1 store.
        bytes32 commitment;
        // Storage slot 3 //
        // The number of the block where this request was created.
        // Note that we're using a uint64 such that we have an additional space for an address and other fields in
        // this storage slot. Although block.number returns a uint256, 64 bits should be plenty to index all of the
        // blocks ever generated.
        uint64 blockNumber;
        // The address that requested this random number.
        address requester;
        // If true, incorporate the blockhash of blockNumber into the generated random value.
        bool useBlockhash;
        // If true, the requester will be called back with the generated random value.
        bool isRequestWithCallback;
        // There are 2 remaining bytes of free space in this slot.
    }
}

Settings
{
  "viaIR": false,
  "codegen": "yul",
  "remappings": [
    "@pythnetwork/entropy-sdk-solidity/=node_modules/@pythnetwork/entropy-sdk-solidity/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "evmVersion": "cancun",
  "outputSelection": {
    "*": {
      "*": [
        "abi"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "mode": "3",
    "fallback_to_optimizing_for_size": false,
    "disable_system_request_memoization": true
  },
  "metadata": {},
  "libraries": {},
  "enableEraVMExtensions": false,
  "forceEVMLA": false
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_entropy","type":"address"},{"internalType":"address","name":"_provider","type":"address"},{"internalType":"uint256","name":"_minBet","type":"uint256"},{"internalType":"uint256","name":"_maxBet","type":"uint256"},{"internalType":"address","name":"_commissionWallet","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinBet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxBet","type":"uint256"}],"name":"BetLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"betAmount","type":"uint256"}],"name":"BetRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newCommissionWallet","type":"address"}],"name":"CommissionWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newEntropy","type":"address"}],"name":"EntropyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"betAmount","type":"uint256"}],"name":"FlipRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"indexed":false,"internalType":"bool","name":"isHeads","type":"bool"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"betAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"FlipResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newProvider","type":"address"}],"name":"ProviderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMMISSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REFUND_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequence","type":"uint64"},{"internalType":"address","name":"provider","type":"address"},{"internalType":"bytes32","name":"randomNumber","type":"bytes32"}],"name":"_entropyCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"internalType":"bool","name":"isHeadsOverride","type":"bool"},{"internalType":"uint256","name":"payoutOverride","type":"uint256"}],"name":"emergencyResolveBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"entropy","outputs":[{"internalType":"contract IEntropy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"userRandomNumber","type":"bytes32"}],"name":"flip","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"pendingBets","outputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingBetsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"sequenceNumber","type":"uint64"},{"internalType":"address","name":"_unusedProvider","type":"address"},{"internalType":"bytes32","name":"randomNumber","type":"bytes32"}],"name":"receiveEntropy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBet","type":"uint256"},{"internalType":"uint256","name":"_maxBet","type":"uint256"}],"name":"setBetLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_commissionWallet","type":"address"}],"name":"updateCommissionWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entropy","type":"address"}],"name":"updateEntropy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_provider","type":"address"}],"name":"updateProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

9c4d535b0000000000000000000000000000000000000000000000000000000000000000010002579ced1fb3e25d680c1ecda3b6ff74c54f30f4b4f227bb5ab9dbd59179000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000858687fd592112f7046e394a3bf10d0c11ff9e630000000000000000000000006cc14824ea2918f5de5c2f75a9da968ad4bd6344000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000086605872b0cbdf364c283e76921ee22546c692f2

Deployed Bytecode

0x0001000000000002000900000000000200000000000103550000006003100270000001eb033001970000000100200190000000200000c13d0000008002000039000000400020043f000000040030008c000000630000413d000000000201043b000000e002200270000001f50020009c000000670000a13d000001f60020009c000000780000a13d000001f70020009c000000ce0000a13d000001f80020009c000001d00000213d000001fb0020009c0000034e0000613d000001fc0020009c000003e90000c13d0000000001000416000000000001004b000003e90000c13d0000271001000039000000800010043f0000021b01000041000007aa0001042e0000001f02300039000001ec02200197000000a002200039000000400020043f0000001f0430018f000001ed05300198000000a0025000390000002e0000613d000000a006000039000000000701034f000000007807043c0000000006860436000000000026004b0000002a0000c13d000000000004004b0000003b0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000009f0030008c000003e90000a13d000000a00300043d000001ee0030009c000003e90000213d000000c00400043d000001ee0040009c000003e90000213d000001200100043d000001ee0010009c000003e90000213d000001000500043d000000e00600043d0000000102000039000000000020041b000000000702041a0000025107700197000000000072041b000000000056004b000002060000a13d000000400100043d0000006402100039000001f10300004100000000003204350000004402100039000001f2030000410000000000320435000000240210003900000027030000390000000000320435000001f3020000410000000000210435000000040210003900000020030000390000000000320435000001eb0010009c000001eb010080410000004001100210000001f4011001c7000007ab00010430000000000003004b000003e90000c13d0000000001000019000007aa0001042e000002070020009c000000a90000213d0000020f0020009c000000f50000213d000002130020009c000002220000613d000002140020009c0000023a0000613d000002150020009c000003e90000c13d0000000001000416000000000001004b000003e90000c13d0000024f01000041000000800010043f0000021b01000041000007aa0001042e000002000020009c000001190000213d000002040020009c0000023f0000613d000002050020009c000002440000613d000002060020009c000003e90000c13d000000440030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000002402100370000000000202043b000500000002001d0000000401100370000000000101043b000400000001001d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee011001970000000002000411000000000012004b000003a70000c13d000000400100043d00000005030000290000000404000029000000000034004b000003bc0000a13d00000044021000390000022e03000041000000000032043500000024021000390000001f03000039000003ad0000013d000002080020009c000001440000213d0000020c0020009c000002a10000613d0000020d0020009c000002a60000613d0000020e0020009c000003e90000c13d000000640030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000402100370000000000302043b0000021c0030009c000003e90000213d0000002402100370000000000202043b000001ee0020009c000003e90000213d0000004401100370000000000201043b0000000601000039000000000101041a000001ee01100198000003d00000c13d000001f301000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f0000024601000041000000c40010043f0000021e01000041000007ab00010430000001fd0020009c000003600000613d000001fe0020009c000003680000613d000001ff0020009c000003e90000c13d000000640030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000402100370000000000302043b0000021c0030009c000003e90000213d0000002402100370000000000202043b000001ee0020009c000003e90000213d0000004401100370000000000201043b000000000100041a000000020010008c000002fa0000613d0000000201000039000000000010041b0000000101000039000000000101041a000000ff00100190000003b80000c13d0000000601000039000000000101041a000001ee011001970000000004000411000000000014004b000004610000c13d000000000103001907a906500000040f000004b00000013d000002100020009c000002dc0000613d000002110020009c000002fe0000613d000002120020009c000003e90000c13d0000000001000416000000000001004b000003e90000c13d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee021001970000000001000411000000000021004b000003a70000c13d0000000103000039000000000203041a000000ff00200190000003d70000c13d0000024a01000041000000000010043f0000023001000041000007ab00010430000002010020009c000003030000613d000002020020009c0000032e0000613d000002030020009c000003e90000c13d000000240030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000401100370000000000101043b000500000001001d0000021c0010009c000003e90000213d000000000100041a000000020010008c000002fa0000613d0000000201000039000000000010041b0000000501000029000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f0000000100200190000003e90000613d000000400400043d000002200040009c0000042b0000a13d0000024001000041000000000010043f0000004101000039000000040010043f0000024101000041000007ab00010430000002090020009c0000033c0000613d0000020a0020009c000003430000613d0000020b0020009c000003e90000c13d000000640030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000402100370000000000202043b000500000002001d0000021c0020009c000003e90000213d0000002402100370000000000302043b000000000003004b0000000002000039000000010200c039000400000003001d000000000023004b000003e90000c13d0000004401100370000000000101043b000300000001001d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee011001970000000002000411000000000012004b000003a70000c13d000000000100041a000000020010008c000002fa0000613d0000000201000039000000000010041b0000000501000029000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f0000000100200190000003e90000613d000000400200043d000200000002001d000002200020009c0000013e0000213d000000000101043b00000002030000290000006002300039000000400020043f000000000201041a000001ee0220019800000000042304360000000102100039000000000202041a000100000004001d000000000024043500000040023000390000000201100039000000000101041a0000000000120435000004390000613d000000040000006b000005750000c13d0000000501000029000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f0000000100200190000003e90000613d000000000101043b000000000001041b0000000102100039000000000002041b0000000201100039000000000001041b0000000501000039000000000201041a000000000002004b0000045b0000613d000000010220008a000000000021041b0000000201000029000000000201043300000001010000290000000001010433000000400300043d0000006004300039000000030500002900000000005404350000004004300039000000000014043500000020013000390000000404000029000000000041043500000005010000290000000000130435000001eb0030009c000001eb0300804100000040013002100000000003000414000001eb0030009c000001eb03008041000000c003300210000000000113019f0000023e011001c7000001ee052001970000800d0200003900000002030000390000023f04000041000005ff0000013d000001f90020009c000003710000613d000001fa0020009c000003e90000c13d000000240030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000401100370000000000101043b000500000001001d000001ee0010009c000003e90000213d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee011001970000000002000411000000000012004b000003a70000c13d0000000401000039000000000201041a000001ef022001970000000503000029000000000232019f000000000021041b000000400100043d0000000000310435000001eb0010009c000001eb0100804100000040011002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f00000218011001c70000800d0200003900000001030000390000021904000041000003e60000013d0000000607000039000000000807041a000001ef08800197000000000338019f000000000037041b0000000703000039000000000703041a000001ef07700197000000000447019f000000000043041b0000000003000411000000800030043f0000000204000039000000000064041b0000000304000039000000000054041b0000000404000039000000000504041a000001ef05500197000000000115019f000000000014041b00000140000004430000016000300443000000200100003900000100001004430000012000200443000001f001000041000007aa0001042e000000240030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000401100370000000000101043b0000021c0010009c000003e90000213d000000000010043f0000000801000039000000200010043f07a907740000040f0000000202100039000000000202041a0000000103100039000000000303041a000000000101041a000001ee01100197000000800010043f000000a00030043f000000c00020043f0000025001000041000007aa0001042e0000000001000416000000000001004b000003e90000c13d00000007010000390000036c0000013d0000000001000416000000000001004b000003e90000c13d0000000501000039000003640000013d000000240030008c000003e90000413d0000000101000039000000000101041a000000ff00100190000003b80000c13d000000000100041a000000020010008c000002fa0000613d0000000201000039000000000010041b0000000601000039000000000101041a0000000702000039000000000202041a0000023103000041000000800030043f000001ee02200197000500000002001d000000840020043f0000000003000414000001ee02100197000001eb0030009c000001eb03008041000000c00130021000000232011001c7000400000002001d07a907a40000040f0000006003100270000001eb03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000000800a0000390000026f0000613d000000000801034f000000008908043c000000000a9a043600000000005a004b0000026b0000c13d000000000006004b0000027c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000003eb0000613d0000001f01400039000000600110018f00000080021001bf000300000002001d000000400020043f000000200030008c000003e90000413d000000800200043d000200000002001d000002330020009c000003e90000213d0000000202000039000000000202041a0000000203000029000000000032001a0000045b0000413d00000000023200190000000005000416000000000025004b0000046b0000813d000001f3020000410000000304000029000000000024043500000084021001bf00000020030000390000000000320435000000c40210003900000239030000410000000000320435000000a4011000390000001c020000390000000000210435000000400140021000000222011001c7000007ab000104300000000001000416000000000001004b000003e90000c13d00000006010000390000036c0000013d000000240030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000401100370000000000101043b000500000001001d000001ee0010009c000003e90000213d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee011001970000000002000411000000000012004b000003a70000c13d0000000501000039000000000101041a000000000001004b000004240000c13d0000000601000039000000000201041a000001ef022001970000000503000029000000000232019f000000000021041b000000400100043d0000000000310435000001eb0010009c000001eb0100804100000040011002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f00000218011001c70000800d0200003900000001030000390000024804000041000003e60000013d000000240030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000401100370000000000101043b000500000001001d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000301043b000001ee013001970000000002000411000000000012004b000003a70000c13d000000000100041a000000020010008c000004090000c13d0000024e01000041000000000010043f0000023001000041000007ab000104300000000001000416000000000001004b000003e90000c13d0000000301000039000003640000013d0000000001000416000000000001004b000003e90000c13d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee021001970000000001000411000000000021004b000003a70000c13d0000000103000039000000000203041a000000ff00200190000003b80000c13d000002510220019700000001022001bf000000000023041b000000400200043d0000000000120435000001eb0020009c000001eb0200804100000040012002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f00000218011001c70000800d020000390000022c04000041000003e60000013d0000000001000416000000000001004b000003e90000c13d0000000001000412000900000001001d000800000000003d000080050100003900000044030000390000000004000415000000090440008a0000000504400210000002160200004107a907810000040f0000036d0000013d0000000001000416000000000001004b000003e90000c13d000000fa01000039000000800010043f0000021b01000041000007aa0001042e0000000001000416000000000001004b000003e90000c13d0000000101000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f0000021b01000041000007aa0001042e0000000001000412000700000001001d000600000000003d000080050100003900000044030000390000000004000415000000070440008a0000000504400210000002160200004107a907810000040f000001ee011001970000000002000411000000000012004b0000000001000039000000010100603907a9063c0000040f0000000001000019000007aa0001042e0000000001000416000000000001004b000003e90000c13d0000000201000039000000000101041a000000800010043f0000021b01000041000007aa0001042e0000000001000416000000000001004b000003e90000c13d0000000401000039000000000101041a000001ee01100197000000800010043f0000021b01000041000007aa0001042e000000240030008c000003e90000413d0000000002000416000000000002004b000003e90000c13d0000000401100370000000000101043b000500000001001d000001ee0010009c000003e90000213d000002160100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000217011001c7000080050200003907a907a40000040f0000000100200190000005890000613d000000000101043b000001ee011001970000000002000411000000000012004b000003a70000c13d0000000501000039000000000101041a000000000001004b000004240000c13d0000000701000039000000000201041a000001ef022001970000000503000029000000000232019f000000000021041b000000400100043d0000000000310435000001eb0010009c000001eb0100804100000040011002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f00000218011001c70000800d0200003900000001030000390000021a04000041000003e60000013d000000400100043d00000044021000390000024b030000410000000000320435000000240210003900000009030000390000000000320435000001f3020000410000000000210435000000040210003900000020030000390000000000320435000001eb0010009c000001eb01008041000000400110021000000222011001c7000007ab000104300000022f01000041000000000010043f0000023001000041000007ab000104300000000202000039000000000042041b0000000302000039000000000032041b000000200210003900000000003204350000000000410435000001eb0010009c000001eb0100804100000040011002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f0000021f011001c70000800d0200003900000001030000390000022d04000041000003e60000013d0000000004000411000000000014004b000004400000c13d000000000103001907a906500000040f0000000001000019000007aa0001042e0000025102200197000000000023041b000000400200043d0000000000120435000001eb0020009c000001eb0200804100000040012002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f00000218011001c70000800d02000039000002490400004107a9079f0000040f0000000100200190000000650000c13d0000000001000019000007ab000104300000001f0530018f000001ed06300198000000400200043d0000000004620019000003f60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003f20000c13d000000000005004b000004030000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001eb0020009c000001eb020080410000004002200210000000000112019f000007ab00010430000400000003001d0000000201000039000000000010041b0000023a010000410000000000100443000000000100041000000004001004430000000001000414000001eb0010009c000001eb01008041000000c0011002100000023b011001c70000800a0200003907a907a40000040f0000000100200190000005890000613d000000000101043b0000000503000029000000000031004b0000044c0000813d000000400100043d00000044021000390000024d03000041000000000032043500000024021000390000001d03000039000003ad0000013d000000400100043d00000044021000390000024703000041000000000032043500000024021000390000001203000039000003ad0000013d000000000201043b0000006001400039000000400010043f000000000102041a000001ee0110019800000000051404360000000103200039000000000303041a000000000035043500000040034000390000000202200039000000000202041a0000000000230435000004540000c13d000000400100043d00000044021000390000024203000041000000000032043500000024021000390000001403000039000003ad0000013d000001f301000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000024301000041000000c40010043f0000024401000041000000e40010043f0000024501000041000007ab000104300000000001000414000001eb0010009c000001eb01008041000000c001100210000000000003004b000004810000c13d0000000402000029000004850000013d0000000003000411000000000013004b000004b40000c13d000200000005001d000300000004001d00040226002000a4000004bf0000413d0000024001000041000000000010043f0000001101000039000000040010043f0000024101000041000007ab00010430000001f301000041000000800010043f0000002001000039000000840010043f0000001301000039000000a40010043f0000021d01000041000000c40010043f0000021e01000041000007ab000104300000000302000039000000000202041a000000000032001a0000045b0000413d0000000004320019000000a40210003900000084031001bf000000000045004b000004d40000a13d000001f30400004100000003050000290000000000450435000000200400003900000000004304350000001b030000390000000000320435000000c40110003900000238020000410000000000210435000000400150021000000222011001c7000007ab0001043000000227011001c700008009020000390000000404000029000000000500001907a9079f0000040f0000006003100270000001eb03300198000004ae0000613d0000001f04300039000001ec044001970000003f044000390000022804400197000000400500043d0000000004450019000000000054004b000000000600003900000001060040390000021c0040009c0000013e0000213d00000001006001900000013e0000c13d000000400040043f0000001f0430018f0000000006350436000001ed053001980000000003560019000004a10000613d000000000701034f000000007807043c0000000006860436000000000036004b0000049d0000c13d000000000004004b000004ae0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000004b80000613d0000000101000039000000000010041b0000000001000019000007aa0001042e000000400100043d00000044021000390000022103000041000004bb0000013d000000400100043d00000044021000390000024c03000041000000000032043500000024021000390000001103000039000003ad0000013d000002240100004100000000001004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000225011001c70000800b0200003907a907a40000040f0000000100200190000005890000613d000000000101043b000000040010006c0000058a0000813d000000400100043d00000044021000390000022b03000041000000000032043500000024021000390000001903000039000003ad0000013d0000023401000041000000030400002900000000001404350000000501000029000000000013043500000004010000390000000001100367000000000101043b000000000012043500000040014002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f000000020000006b000004e80000c13d00000236011001c70000000402000029000004ed0000013d00000235011001c7000080090200003900000002030000290000000404000029000000000500001907a9079f0000040f0000006003100270000001eb03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000305700029000004fd0000613d000000000801034f0000000309000029000000008a08043c0000000009a90436000000000059004b000004f90000c13d000000000006004b0000050a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000005690000613d0000001f01400039000000600110018f0000000301100029000500000001001d000000400010043f000000200030008c000003e90000413d00000003010000290000000001010433000400000001001d0000021c0010009c000003e90000213d0000000002000416000000020220006a00000005030000290000006001300039000000400010043f0000002001300039000200000002001d000300000001001d000000000021043500000000010004110000000000130435000002240100004100000000001004430000000001000414000001eb0010009c000001eb01008041000000c00110021000000225011001c70000800b0200003907a907a40000040f0000000100200190000005890000613d000000000101043b00000005020000290000004002200039000100000002001d00000000001204350000000401000029000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f0000000100200190000003e90000613d00000005020000290000000002020433000001ee02200197000000000101043b000000000301041a000001ef03300197000000000223019f000000000021041b000000030200002900000000020204330000000103100039000000000023041b000000020110003900000001020000290000000002020433000000000021041b0000000501000039000000000201041a000000010220003a0000045b0000613d000000000021041b000000400100043d00000020021000390000000203000029000000000032043500000004020000290000000000210435000001eb0010009c000001eb0100804100000040011002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f0000021f011001c70000800d02000039000000020300003900000237040000410000000005000411000005ff0000013d0000001f0530018f000001ed06300198000000400200043d0000000004620019000003f60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005700000c13d000003f60000013d0000023a010000410000000000100443000000000100041000000004001004430000000001000414000001eb0010009c000001eb01008041000000c0011002100000023b011001c70000800a0200003907a907a40000040f0000000100200190000005890000613d000000000101043b000000030010006c000005b00000813d000000400100043d00000044021000390000023d03000041000004200000013d000000000001042f0000000501000029000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f0000000100200190000003e90000613d000000000101043b000000000001041b0000000102100039000000000002041b0000000201100039000000000001041b0000000501000039000000000201041a000000000002004b0000045b0000613d000000010220008a000000000021041b00000003010000290000000001010433000001ee04100197000000020100002900000000030104330000000001000414000001eb0010009c000001eb01008041000000c001100210000000000003004b000005bb0000c13d0000000002040019000005be0000013d00000002010000290000000001010433000001ee041001970000000001000414000001eb0010009c000001eb01008041000000c001100210000000030000006b000006030000c13d0000000002040019000006070000013d00000227011001c70000800902000039000000000500001907a9079f0000040f0000006003100270000001eb03300198000005e70000613d0000001f04300039000001ec044001970000003f044000390000022804400197000000400500043d0000000004450019000000000054004b000000000600003900000001060040390000021c0040009c0000013e0000213d00000001006001900000013e0000c13d000000400040043f0000001f0430018f0000000006350436000001ed053001980000000003560019000005da0000613d000000000701034f000000007807043c0000000006860436000000000036004b000005d60000c13d000000000004004b000005e70000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000400100043d0000000100200190000006360000613d00000003020000290000000002020433000000020300002900000000030304330000002004100039000000000034043500000005030000290000000000310435000001eb0010009c000001eb0100804100000040011002100000000003000414000001eb0030009c000001eb03008041000000c003300210000000000113019f0000021f011001c7000001ee052001970000800d0200003900000002030000390000022a0400004107a9079f0000040f0000000100200190000003e90000613d000004b00000013d00000227011001c700008009020000390000000303000029000000000500001907a9079f0000040f0000006003100270000001eb03300198000006300000613d0000001f04300039000001ec044001970000003f044000390000022804400197000000400500043d0000000004450019000000000054004b000000000600003900000001060040390000021c0040009c0000013e0000213d00000001006001900000013e0000c13d000000400040043f0000001f0430018f0000000006350436000001ed053001980000000003560019000006230000613d000000000701034f000000007807043c0000000006860436000000000036004b0000061f0000c13d000000000004004b000006300000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000019a0000c13d000000400100043d00000044021000390000023c03000041000006380000013d00000044021000390000022903000041000000000032043500000024021000390000001603000039000003ad0000013d000000000001004b0000063f0000613d000000000001042d000000400100043d00000044021000390000024b030000410000000000320435000000240210003900000009030000390000000000320435000001f3020000410000000000210435000000040210003900000020030000390000000000320435000001eb0010009c000001eb01008041000000400110021000000222011001c7000007ab000104300007000000000002000600000002001d0000021c01100197000700000001001d000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f0000000100200190000007450000613d000000400400043d000002520040009c000007470000813d000000000201043b0000006001400039000000400010043f000000000102041a000001ee0110019800000000031404360000000101200039000000000101041a000500000003001d000000000013043500000040034000390000000202200039000000000202041a0000000000230435000007440000613d0000000602000029000000010020019000000000020000390000000102006039000300000002001d000400000000001d000600000004001d0000070c0000c13d000002530010009c0000074d0000213d0000000102100212000001f4031000c9000006820000613d00000000012300d9000000fa0010008c0000074d0000c13d000400000003001d000200000002001d0000023a010000410000000000100443000000000100041000000004001004430000000001000414000001eb0010009c000001eb01008041000000c0011002100000023b011001c70000800a0200003907a907a40000040f0000000100200190000007530000613d000000000101043b000000020010006c0000000402000029000007540000413d000027100320011a0000000401000039000000000101041a000001ee041001970000000001000414000001eb0010009c000001eb01008041000000c0011002100000270f0020008c000100000003001d000006a20000213d0000000002040019000006a50000013d00000227011001c70000800902000039000000000500001907a9079f0000040f0000006003100270000001eb033001980000000609000029000006cf0000613d0000001f04300039000001ec044001970000003f044000390000022804400197000000400500043d0000000004450019000000000054004b000000000600003900000001060040390000021c0040009c000007470000213d0000000100600190000007470000c13d000000400040043f0000001f0430018f0000000006350436000001ed053001980000000003560019000006c20000613d000000000701034f000000007807043c0000000006860436000000000036004b000006be0000c13d000000000004004b000006cf0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000075b0000613d000000010500002900000002035000690000000001090433000001ee041001970000000001000414000001eb0010009c000001eb01008041000000c001100210000000020050006b000400000003001d000006de0000c13d0000000002040019000006e10000013d00000227011001c70000800902000039000000000500001907a9079f0000040f0000006003100270000001eb033001980000070a0000613d0000001f04300039000001ec044001970000003f044000390000022804400197000000400500043d0000000004450019000000000054004b000000000600003900000001060040390000021c0040009c000007470000213d0000000100600190000007470000c13d000000400040043f0000001f0430018f0000000006350436000001ed053001980000000003560019000006fd0000613d000000000701034f000000007807043c0000000006860436000000000036004b000006f90000c13d000000000004004b0000070a0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000007620000613d0000000701000029000000000010043f0000000801000039000000200010043f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f00000006030000290000000100200190000007450000613d000000000101043b000000000001041b0000000102100039000000000002041b0000000201100039000000000001041b0000000501000039000000000201041a000000000002004b0000074d0000613d000000010220008a000000000021041b000000000203043300000005010000290000000001010433000000400300043d0000006004300039000000040500002900000000005404350000004004300039000000000014043500000020013000390000000304000029000000000041043500000007010000290000000000130435000001eb0030009c000001eb0300804100000040013002100000000003000414000001eb0030009c000001eb03008041000000c003300210000000000113019f0000023e011001c7000001ee052001970000800d0200003900000002030000390000023f0400004107a9079f0000040f0000000100200190000007450000613d000000000001042d0000000001000019000007ab000104300000024001000041000000000010043f0000004101000039000000040010043f0000024101000041000007ab000104300000024001000041000000000010043f0000001101000039000000040010043f0000024101000041000007ab00010430000000000001042f000000400100043d00000044021000390000023d03000041000000000032043500000024021000390000001d03000039000007680000013d000000400100043d00000044021000390000025403000041000000000032043500000024021000390000001a03000039000007680000013d000000400100043d00000044021000390000023c030000410000000000320435000000240210003900000016030000390000000000320435000001f3020000410000000000210435000000040210003900000020030000390000000000320435000001eb0010009c000001eb01008041000000400110021000000222011001c7000007ab00010430000000000001042f0000000001000414000001eb0010009c000001eb01008041000000c0011002100000021f011001c7000080100200003907a907a40000040f00000001002001900000077f0000613d000000000101043b000000000001042d0000000001000019000007ab0001043000000000050100190000000000200443000000050030008c0000078f0000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b000007870000413d000001eb0030009c000001eb0300804100000060013002100000000002000414000001eb0020009c000001eb02008041000000c002200210000000000112019f00000255011001c7000000000205001907a907a40000040f00000001002001900000079e0000613d000000000101043b000000000001042d000000000001042f000007a2002104210000000102000039000000000001042d0000000002000019000000000001042d000007a7002104230000000102000039000000000001042d0000000002000019000000000001042d000007a900000432000007aa0001042e000007ab0001043000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000002000000000000000000000000000000800000010000000000000000006d61782062657400000000000000000000000000000000000000000000000000496e697469616c206d696e20626574206d757374206e6f74206578636565642008c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000000000000000000000006f6da607000000000000000000000000000000000000000000000000000000009619367c00000000000000000000000000000000000000000000000000000000d0e30daf00000000000000000000000000000000000000000000000000000000ef70768900000000000000000000000000000000000000000000000000000000ef70768a00000000000000000000000000000000000000000000000000000000f33b554100000000000000000000000000000000000000000000000000000000d0e30db000000000000000000000000000000000000000000000000000000000e1f1c4a7000000000000000000000000000000000000000000000000000000009619367d0000000000000000000000000000000000000000000000000000000097c0262a00000000000000000000000000000000000000000000000000000000aac0d0ca000000000000000000000000000000000000000000000000000000008456cb58000000000000000000000000000000000000000000000000000000008456cb59000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000094e47d45000000000000000000000000000000000000000000000000000000006f6da608000000000000000000000000000000000000000000000000000000006ffd8001000000000000000000000000000000000000000000000000000000007687dd490000000000000000000000000000000000000000000000000000000047ce07cb00000000000000000000000000000000000000000000000000000000562df3d400000000000000000000000000000000000000000000000000000000562df3d5000000000000000000000000000000000000000000000000000000005c975abb0000000000000000000000000000000000000000000000000000000066d5a0070000000000000000000000000000000000000000000000000000000047ce07cc0000000000000000000000000000000000000000000000000000000048d2a0e90000000000000000000000000000000000000000000000000000000052a5f1f8000000000000000000000000000000000000000000000000000000002e1a7d4c000000000000000000000000000000000000000000000000000000002e1a7d4d000000000000000000000000000000000000000000000000000000002e5b2168000000000000000000000000000000000000000000000000000000003f4ba83a00000000000000000000000000000000000000000000000000000000001072f800000000000000000000000000000000000000000000000000000000085d488300000000000000000000000000000000000000000000000000000000190da595310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000200000000000000000000000000000000000020000000000000000000000000c351f413a1509bc81bfe4de8610c006f09e33119a20bc411d55c086d01b508f004edb8310ed01a0a03457cedcf27942dd9b4a7ef37772645bbc59e4e8da004ed0000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff556e617574686f72697a65642063616c6c65720000000000000000000000000000000000000000000000000000000000000000640000008000000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f4e6f742074686520626574206f776e65720000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeae7f796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeae80020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe0526566756e64207472616e73666572206661696c656400000000000000000000aebae97e281949f8464f8527b21754d09481743f6b34db08c67e2327dd04313f526566756e6420706572696f64206e6f7420726561636865640000000000000062e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258f483a8cf66fadba78e10f404e5f1639eb2a336535936e1af01f333d1215378d14d696e20626574206d757374206e6f7420657863656564206d61782062657400d93c0665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b88c914800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff19cb825f0000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000044000000000000000000000000b62a1f69ec4d2c7230e305d426e96517bf2a66fdb9b83733c3c7a7b57113c72e4265742065786365656473206d6178696d756d20616c6c6f77656400000000004e6f7420656e6f7567682045544820666f7220626574202b20666565000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3902000002000000000000000000000000000000240000000000000000000000005061796f7574207472616e73666572206661696c656400000000000000000000496e73756666696369656e742066756e647320666f72207061796f757400000002000000000000000000000000000000000000800000000000000000000000006441374cbd7e16d3a8eb01f6767172a1d9fe279fa6b7a6f228c619f75d8507834e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000004e6f2070656e64696e672062657420666f756e640000000000000000000000004f6e6c7920456e74726f70792063616e2063616c6c20746869732066756e6374696f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000800000000000000000456e74726f70792061646472657373206e6f742073657400000000000000000050656e64696e672062657473206578697374000000000000000000000000000015e1b67efe2ffca496262879fedc4f8fa469cc50aadeffce4b41a54913f58f335db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa8dfc202b000000000000000000000000000000000000000000000000000000004e6f74206f776e657200000000000000000000000000000000000000000000005769746864726177616c206661696c6564000000000000000000000000000000496e73756666696369656e7420636f6e74726163742062616c616e63650000003ee5aeb50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000060000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000ffffffffffffffa07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff436f6d6d697373696f6e207472616e73666572206661696c65640000000000000200000200000000000000000000000000000000000000000000000000000000db00cd8e98cd8a54e59d914fa2507a8fe2c01a23e2a2a31f75b99fcda4a2c025

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

000000000000000000000000858687fd592112f7046e394a3bf10d0c11ff9e630000000000000000000000006cc14824ea2918f5de5c2f75a9da968ad4bd6344000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000086605872b0cbdf364c283e76921ee22546c692f2

-----Decoded View---------------
Arg [0] : _entropy (address): 0x858687fD592112f7046E394A3Bf10D0C11fF9e63
Arg [1] : _provider (address): 0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344
Arg [2] : _minBet (uint256): 10000000000000000
Arg [3] : _maxBet (uint256): 1000000000000000000
Arg [4] : _commissionWallet (address): 0x86605872B0cbDF364C283E76921ee22546c692f2

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000858687fd592112f7046e394a3bf10d0c11ff9e63
Arg [1] : 0000000000000000000000006cc14824ea2918f5de5c2f75a9da968ad4bd6344
Arg [2] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [3] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [4] : 00000000000000000000000086605872b0cbdf364c283e76921ee22546c692f2


Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.