Source Code
Overview
ETH Balance
0.047421481710836779 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 22 from a total of 22 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Flip | 5769067 | 2 hrs ago | IN | 0.01436042 ETH | 0.00000489 | ||||
Flip | 5768992 | 2 hrs ago | IN | 0.01436042 ETH | 0.00000488 | ||||
Flip | 5768315 | 2 hrs ago | IN | 0.01412036 ETH | 0.00000496 | ||||
Flip | 5768121 | 3 hrs ago | IN | 0.01412036 ETH | 0.00000488 | ||||
Flip | 5768060 | 3 hrs ago | IN | 0.01412036 ETH | 0.00000496 | ||||
Flip | 5767944 | 3 hrs ago | IN | 0.01403432 ETH | 0.00000472 | ||||
Flip | 5767850 | 3 hrs ago | IN | 0.01403432 ETH | 0.00000773 | ||||
Flip | 5767586 | 3 hrs ago | IN | 0.01052837 ETH | 0.00001098 | ||||
Flip | 5756057 | 6 hrs ago | IN | 0.01076665 ETH | 0.00001062 | ||||
Flip | 5755869 | 6 hrs ago | IN | 0.01076665 ETH | 0.00000807 | ||||
Flip | 5755674 | 6 hrs ago | IN | 0.01076665 ETH | 0.00001062 | ||||
Flip | 5755364 | 7 hrs ago | IN | 0.01084033 ETH | 0.00001608 | ||||
Flip | 5751826 | 8 hrs ago | IN | 0.01788092 ETH | 0.0000114 | ||||
Flip | 5751579 | 8 hrs ago | IN | 0.01068639 ETH | 0.0000114 | ||||
Flip | 5751488 | 8 hrs ago | IN | 0.01068639 ETH | 0.00001716 | ||||
Flip | 5750774 | 8 hrs ago | IN | 0.01272442 ETH | 0.0000108 | ||||
Flip | 5750623 | 9 hrs ago | IN | 0.01413708 ETH | 0.00001087 | ||||
Flip | 5750588 | 9 hrs ago | IN | 0.01413708 ETH | 0.0000108 | ||||
Flip | 5750258 | 9 hrs ago | IN | 0.01413171 ETH | 0.00001248 | ||||
Flip | 5749540 | 9 hrs ago | IN | 0.01774965 ETH | 0.00001028 | ||||
Flip | 5749264 | 9 hrs ago | IN | 0.01774965 ETH | 0.0000155 | ||||
Flip | 5722846 | 20 hrs ago | IN | 0.01756058 ETH | 0.00000701 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5769069 | 2 hrs ago | 0 ETH | ||||
5769069 | 2 hrs ago | 0 ETH | ||||
5769069 | 2 hrs ago | 0 ETH | ||||
5769069 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0.0000105 ETH | ||||
5769067 | 2 hrs ago | 0.0000105 ETH | ||||
5769067 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0 ETH | ||||
5769067 | 2 hrs ago | 0.01436042 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768994 | 2 hrs ago | 0.02798235 ETH | ||||
5768994 | 2 hrs ago | 0.02798235 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768994 | 2 hrs ago | 0.00071749 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768994 | 2 hrs ago | 0 ETH | ||||
5768992 | 2 hrs ago | 0 ETH | ||||
5768992 | 2 hrs ago | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
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)
// 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 {} }
// 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); }
// 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; }
// 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; } }
// 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()); } }
// 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 ); }
// 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; } }
// 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. } }
{ "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 }
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.