Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days ago | 0 ETH | ||||
5712437 | 3 days 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:
Pinata
Compiler Version
v0.8.28+commit.7893614a
ZkSolc Version
v1.5.11
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.28; import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IEntropyConsumer} from "@pythnetwork/entropy-sdk-solidity/IEntropyConsumer.sol"; import {IEntropy} from "@pythnetwork/entropy-sdk-solidity/IEntropy.sol"; /// @title Pinata - A decentralized prize game using Pyth's entropy /// @author Jean Ayala /// @notice This contract implements a game where users can hit a pinata for prizes /// @dev Uses Pyth Network's entropy for random number generation and implements reentrancy protection contract Pinata is ReentrancyGuard, Ownable, IEntropyConsumer { IEntropy private entropy; // EVENTS /// @notice Emitted when a user wins a regular prize /// @param user Address of the winner /// @param amount Prize amount won event UserWonPrize(address user, uint256 amount); /// @notice Emitted when a user breaks the pinata and wins the jackpot /// @param user Address of the winner /// @param amount Jackpot amount won event UserWonJackpot(address user, uint256 amount); /// @notice Emitted when a user attempts to hit the pinata /// @param user Address of the player /// @param pinata Address of this contract /// @param sequenceNumber Unique identifier for this attempt event UserTriesToHit(address user, address pinata, uint256 sequenceNumber); /// @notice Emitted when the prize pool receives additional funds /// @param user Address of the contributor /// @param amount Amount added to the prize pool event PrizePoolRefilled(address user, uint256 amount); /// @notice Emitted when funds are withdrawn from the prize pool /// @param user Address of the withdrawer /// @param amount Amount withdrawn event PrizePoolWithdrawed(address user, uint256 amount); /// @notice Emitted with the result of a hit attempt /// @param user Address of the player /// @param entropyProvider Address of the entropy provider /// @param sequenceNumber Unique identifier for this attempt /// @param firstNumber First number in the sequence /// @param secondNumber Second number in the sequence /// @param thirdNumber Third number in the sequence /// @param timesHit Total number of times the pinata has been hit /// @param totalPayed Total amount paid out in prizes event HitResult( address user, address entropyProvider, uint256 sequenceNumber, uint256 firstNumber, uint256 secondNumber, uint256 thirdNumber, uint256 timesHit, uint256 totalPayed ); /// @notice Emitted when benefits are withdrawn /// @param recipient Address receiving the benefits /// @param amount Amount withdrawn /// @param isCreator Whether the recipient is the creator or platform event BenefitsWithdrawn( address indexed recipient, uint256 amount, bool isCreator ); /// @notice Emitted when the game state is reset /// @param user Address that triggered the reset /// @param sequenceNumber Sequence number at reset /// @param timestamp Time of reset event StateReset(address indexed user, uint256 sequenceNumber, uint256 timestamp); /// @notice Emitted when fees are accumulated /// @param creatorAmount Amount accumulated for creator /// @param platformAmount Amount accumulated for platform /// @param timestamp Time of accumulation event FeesAccumulated(uint256 creatorAmount, uint256 platformAmount, uint256 timestamp); // STATES /// @notice Address of the entropy provider for random number generation address private entropyProvider; /// @notice Address that receives platform fees address public platformAddress; /// @notice Indicates if the pinata has been broken (jackpot won) bool public pinataIsBroken = false; /// @notice Indicates if the jackpot sequence has been initialized bool public hasJackpotSequence; /// @notice Indicates if winning sequences have been initialized bool private sequencesInitialized; /// @notice Maximum multiplier for prizes uint256 public maxMultiplier; /// @notice Total number of times the pinata has been hit uint256 public hasBeenHit; /// @notice Total amount paid out in prizes uint256 public hasBeenPaid; /// @notice Cost to hit the pinata once uint256 public hitCost; /// @notice Fee percentage for the creator (in basis points) uint256 public creatorFee; /// @notice Accumulated benefits for the creator uint256 public creatorBenefits; /// @notice Fee percentage for the platform (in basis points) uint256 public platformFee; /// @notice Accumulated benefits for the platform uint256 public platformBenefits; /// @notice Hash of the jackpot winning sequence bytes32 public jackpotSequence; /// @notice Maximum range for the second number in sequences uint256 public secondNumberMaxRange; /// @notice Initial prize pool amount uint256 public originalPrizePool; /// @notice Amount withdrawn by the owner uint256 public ownerWithdrawn; /// @notice Maximum total fees (15%) uint256 public constant MAX_TOTAL_FEES = 15; /// @notice Mapping of range index to allowed range values mapping(uint8 => uint256) private allowedRanges; /// @notice Mapping of player address to their current sequence number mapping(address => uint256) public playerNumbers; /// @notice Mapping of sequence number to player address mapping(uint256 => address) private numberToPlayer; /// @notice Mapping of sequence hash to prize amount mapping(bytes32 => uint256) public winningSequences; /// @notice Initializes the Pinata contract /// @dev Sets up the initial state, prize pool, and winning sequences /// @param _initialOwner Address of the contract owner /// @param _prizePool Initial amount for the prize pool /// @param _hitCost Cost to hit the pinata /// @param _creatorFee Fee percentage for creator (in basis points) /// @param _platformFee Fee percentage for platform (in basis points) /// @param _platformAddress Address to receive platform fees /// @param _entropyAddress Address of the entropy contract /// @param _entropyProvider Address of the entropy provider /// @param _rangeIndex Index for selecting the number range constructor( address _initialOwner, uint256 _prizePool, uint256 _hitCost, uint256 _creatorFee, uint256 _platformFee, address _platformAddress, address _entropyAddress, address _entropyProvider, uint8 _rangeIndex ) payable Ownable(_initialOwner) { require(_initialOwner != address(0), "Invalid owner address"); require(_platformAddress != address(0), "Invalid platform address"); require(_entropyAddress != address(0), "Invalid entropy address"); require(_entropyProvider != address(0), "Invalid entropy provider"); require(_creatorFee <= 1000, "Fees cannot exceed 10%"); require( (_creatorFee + _platformFee) <= MAX_TOTAL_FEES * 10000, "Fees cant be more than 15%" ); require(msg.value >= _prizePool, "Insufficient initial prize pool"); // Initialize allowed ranges allowedRanges[0] = 6; allowedRanges[1] = 8; allowedRanges[2] = 12; allowedRanges[3] = 18; allowedRanges[4] = 24; require(_rangeIndex <= 4, "Invalid range index"); secondNumberMaxRange = allowedRanges[_rangeIndex]; require( _prizePool >= (_hitCost * (secondNumberMaxRange - 1)), "Prize pool cant cover max prize" ); maxMultiplier = secondNumberMaxRange - 1; hitCost = _hitCost; _initializeWinningSequences(); _initializeJackpotSequence(); creatorFee = _creatorFee; platformFee = _platformFee; platformAddress = _platformAddress; originalPrizePool = _prizePool; entropy = IEntropy(_entropyAddress); entropyProvider = _entropyProvider; } // FUNCTIONS // A function to try to hit the pinata function hitPinata(bytes32 userRandomNumber) public payable nonReentrant { require(!pinataIsBroken, "This pinata has been broken and the jackpot claimed"); uint256 _hitCost = hitCost; // Cache storage read uint256 _maxMultiplier = maxMultiplier; // Cache storage read uint256 fee = entropy.getFee(entropyProvider); // Explicit overflow check for totalCost require(_hitCost <= type(uint256).max - fee, "Cost overflow"); uint256 totalCost = _hitCost + fee; // Explicit overflow check for maxPrize require(_hitCost <= type(uint256).max / _maxMultiplier, "Prize calculation overflow"); uint256 maxPrize = _hitCost * _maxMultiplier; require(playerNumbers[msg.sender] == 0, "user is already playing"); // this is 0 again once the user finish playing require(msg.value >= totalCost, "no enought payment to hit the pinata"); require( address(this).balance >= maxPrize + creatorBenefits + platformBenefits, "Insufficient contract balance for potential prizes" ); // here we call entropy of pyth uint64 sequenceNumber = entropy.requestWithCallback{value: fee}( entropyProvider, userRandomNumber ); playerNumbers[msg.sender] = sequenceNumber; numberToPlayer[sequenceNumber] = msg.sender; // this will be deleted once the user finish playing // Calculate fees based on hitCost using basis points with precision loss protection // First multiply all components to maintain precision uint256 creatorAmount = (_hitCost * creatorFee); uint256 platformAmount = (_hitCost * platformFee); // Perform division last to minimize precision loss creatorAmount = creatorAmount / 10000; platformAmount = platformAmount / 10000; // Explicit overflow checks for benefits accumulation require(creatorBenefits <= type(uint256).max - creatorAmount, "Creator benefits overflow"); require(platformBenefits <= type(uint256).max - platformAmount, "Platform benefits overflow"); creatorBenefits += creatorAmount; platformBenefits += platformAmount; emit FeesAccumulated(creatorAmount, platformAmount, block.timestamp); emit UserTriesToHit(msg.sender, address(this), sequenceNumber); // Refund excess payment if user sent more than required uint256 excess = msg.value - totalCost; if (excess > 0) { (bool success, ) = payable(msg.sender).call{value: excess}(""); require(success, "Refund transfer failed"); } } function entropyCallback( uint64 sequenceNumber, address provider, bytes32 randomNumber ) internal override { address user = numberToPlayer[sequenceNumber]; require(user != address(0), "Invalid user address"); hasBeenHit += 1; uint256[3] memory sequence = generateSequence( randomNumber, secondNumberMaxRange ); uint256 prize = getPrizeForSequence(sequence); if (prize > 0) { sendPrize(prize, user); } delete numberToPlayer[sequenceNumber]; playerNumbers[user] = 0; emit HitResult( user, provider, sequenceNumber, sequence[0], sequence[1], sequence[2], hasBeenHit, hasBeenPaid ); } // Maps a random number into a range between minRange and maxRange (inclusive) function mapRandomNumber( bytes32 randomNumber, uint256 minRange, uint256 maxRange ) internal pure returns (uint256) { uint256 range = maxRange - minRange + 1; return minRange + (uint256(randomNumber) % range); } function generateSequence( bytes32 randomNumber, uint256 maxRange ) internal pure returns (uint256[3] memory) { uint256 firstResult = mapRandomNumber( keccak256(abi.encodePacked(randomNumber, "first")), 1, maxRange ); uint256 secondResult = mapRandomNumber( keccak256(abi.encodePacked(randomNumber, "second")), 1, maxRange ); uint256 thirdResult = mapRandomNumber( keccak256(abi.encodePacked(randomNumber, "third")), 1, maxRange ); uint256[3] memory sequence = [firstResult, secondResult, thirdResult]; return sequence; } // Function to withdraw accumulated benefits for either creator or platform function withdrawBenefits(bool isCreator) public nonReentrant { uint256 amount; address recipient; if (isCreator) { require( creatorBenefits > 0, "No creator benefits available to withdraw" ); amount = creatorBenefits; creatorBenefits = 0; recipient = owner(); } else { require( msg.sender == platformAddress, "Only platform can withdraw platform benefits" ); require( platformBenefits > 0, "No platform benefits available to withdraw" ); amount = platformBenefits; platformBenefits = 0; recipient = platformAddress; } emit BenefitsWithdrawn(recipient, amount, isCreator); (bool success, ) = payable(recipient).call{value: amount}(""); require(success, "Transfer failed"); } function getEntropy() internal view override returns (address) { return address(entropy); } // Function to get the prize amount for a given sequence // This function also calculates the jackpot minus creator or platform benefits function getPrizeForSequence(uint256[3] memory _sequence) public view returns (uint256) { // Create sequence array directly without additional conversion uint8[] memory sequence = new uint8[](3); for(uint256 i = 0; i < 3; i++) { require(_sequence[i] <= type(uint8).max, "Sequence number too large"); sequence[i] = uint8(_sequence[i]); } bytes32 keyHash = keccak256(abi.encodePacked(sequence)); if (hasJackpotSequence && keyHash == jackpotSequence) { return address(this).balance - creatorBenefits - platformBenefits; } return winningSequences[keyHash]; } // A function to send a prize, minus the creator and plaform benefits function sendPrize(uint256 _amount, address _winner) internal { require(_winner != address(0), "Invalid winner address"); require(_amount > 0, "Prize amount must be greater than 0"); require( _amount <= address(this).balance - creatorBenefits - platformBenefits, "Insufficient contract balance" ); // Calculate fees using basis points uint256 creatorAmount = (_amount * creatorFee) / 10000; uint256 platformAmount = (_amount * platformFee) / 10000; uint256 finalPrizeAmount = _amount - creatorAmount - platformAmount; // Check if this is a jackpot win bool isJackpot = finalPrizeAmount == address(this).balance - creatorBenefits - platformBenefits; // Update state before transfer creatorBenefits += creatorAmount; platformBenefits += platformAmount; hasBeenPaid += finalPrizeAmount; if (isJackpot) { pinataIsBroken = true; emit UserWonJackpot(_winner, finalPrizeAmount); } else { emit UserWonPrize(_winner, finalPrizeAmount); } // Send prize to user (bool success, ) = payable(_winner).call{value: finalPrizeAmount}(""); require(success, "Prize transfer failed"); } function _initializeWinningSequences() private { require(!sequencesInitialized, "Sequences already initialized"); // Initialize full sequences (all three numbers match) for (uint8 i = 1; i < secondNumberMaxRange; i++) { uint8[] memory sequence = new uint8[](3); sequence[0] = i; sequence[1] = i; sequence[2] = i; bytes32 keyHash = keccak256(abi.encodePacked(sequence)); winningSequences[keyHash] = i * hitCost; } // Initialize partial sequences (two numbers match) for (uint8 i = 1; i < secondNumberMaxRange; i++) { require(hitCost <= type(uint256).max / i, "Prize calculation overflow"); for (uint8 j = 1; j <= secondNumberMaxRange; j++) { if (i != j) { // Pattern: [i,i,j] - Prize is hitCost * (i/2) uint8[] memory seq1 = new uint8[](3); seq1[0] = i; seq1[1] = i; seq1[2] = j; bytes32 keyHash1 = keccak256(abi.encodePacked(seq1)); winningSequences[keyHash1] = (hitCost * i) / 2; // Changed order of operations // Pattern: [j,i,i] - Prize is hitCost * (i/2) uint8[] memory seq3 = new uint8[](3); seq3[0] = j; seq3[1] = i; seq3[2] = i; bytes32 keyHash3 = keccak256(abi.encodePacked(seq3)); winningSequences[keyHash3] = (hitCost * i) / 2; // Changed order of operations } } } sequencesInitialized = true; } function _initializeJackpotSequence() private { require(!hasJackpotSequence, "Jackpot sequence already initialized"); uint8[] memory sequence = new uint8[](3); sequence[0] = uint8(secondNumberMaxRange); sequence[1] = uint8(secondNumberMaxRange); sequence[2] = uint8(secondNumberMaxRange); jackpotSequence = keccak256(abi.encodePacked(sequence)); hasJackpotSequence = true; } // Function to refill the prize pool function refillPrizePool() public payable nonReentrant { require(msg.value > 0, "Must send some ETH to refill"); require(!pinataIsBroken, "Cannot refill a broken pinata"); emit PrizePoolRefilled(msg.sender, msg.value); } function withdrawPrizePool() external onlyOwner nonReentrant { require(!pinataIsBroken, "Cannot withdraw from broken pinata"); require( address(this).balance > creatorBenefits + platformBenefits, "No funds available for withdrawal" ); uint256 availableForWithdrawal = originalPrizePool - ownerWithdrawn; require(availableForWithdrawal > 0, "No prize pool left to withdraw"); uint256 actualBalance = address(this).balance - creatorBenefits - platformBenefits; uint256 withdrawAmount = availableForWithdrawal; if (actualBalance < withdrawAmount) { withdrawAmount = actualBalance; } // Calculate required balance for max prize uint256 maxPrize = hitCost * maxMultiplier; require( (actualBalance - withdrawAmount) >= maxPrize, "Withdrawal would leave insufficient funds for max prize" ); ownerWithdrawn += withdrawAmount; (bool success, ) = payable(owner()).call{value: withdrawAmount}(""); require(success, "Transfer failed"); } }
// 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: 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: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// 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.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.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: 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. } }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"uint256","name":"_prizePool","type":"uint256"},{"internalType":"uint256","name":"_hitCost","type":"uint256"},{"internalType":"uint256","name":"_creatorFee","type":"uint256"},{"internalType":"uint256","name":"_platformFee","type":"uint256"},{"internalType":"address","name":"_platformAddress","type":"address"},{"internalType":"address","name":"_entropyAddress","type":"address"},{"internalType":"address","name":"_entropyProvider","type":"address"},{"internalType":"uint8","name":"_rangeIndex","type":"uint8"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isCreator","type":"bool"}],"name":"BenefitsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"creatorAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeesAccumulated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"entropyProvider","type":"address"},{"indexed":false,"internalType":"uint256","name":"sequenceNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"thirdNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timesHit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalPayed","type":"uint256"}],"name":"HitResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PrizePoolRefilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PrizePoolWithdrawed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"sequenceNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StateReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pinata","type":"address"},{"indexed":false,"internalType":"uint256","name":"sequenceNumber","type":"uint256"}],"name":"UserTriesToHit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserWonJackpot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserWonPrize","type":"event"},{"inputs":[],"name":"MAX_TOTAL_FEES","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":[],"name":"creatorBenefits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"_sequence","type":"uint256[3]"}],"name":"getPrizeForSequence","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasBeenHit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasBeenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasJackpotSequence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hitCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"userRandomNumber","type":"bytes32"}],"name":"hitPinata","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"jackpotSequence","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalPrizePool","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":"ownerWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pinataIsBroken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformBenefits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerNumbers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refillPrizePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondNumberMaxRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"winningSequences","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isCreator","type":"bool"}],"name":"withdrawBenefits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPrizePool","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b00000000000000000000000000000000000000000000000000000000000000000100033113596d2e3786e268b9382e6a6eeac35ac61acb5a88604f98be8f9413000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000007ea1bb15c6d91827a37697c75b2eeee930c0c18800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ea1bb15c6d91827a37697c75b2eeee930c0c188000000000000000000000000858687fd592112f7046e394a3bf10d0c11ff9e630000000000000000000000006cc14824ea2918f5de5c2f75a9da968ad4bd63440000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0004000000000002000c0000000000020000006004100270000002a10340019700030000003103550002000000010355000002a10040019d00000001002001900000002d0000c13d0000008002000039000000400020043f000000040030008c000008fe0000413d000000000201043b000000e002200270000002c00020009c000000690000a13d000002c10020009c000000780000213d000002cb0020009c000000bc0000a13d000002cc0020009c000001110000213d000002cf0020009c000001720000613d000002d00020009c000008fe0000c13d000000000100041a000000020010008c000001f40000613d0000000201000039000000000010041b0000000001000416000000000001004b0000022e0000c13d000002ad01000041000000800010043f0000002001000039000000840010043f0000001c01000039000000a40010043f000002ff01000041000000c40010043f000002fd0100004100000a80000104300000001f02300039000002a2022001970000008002200039000000400020043f0000001f0430018f000002a30530019800000080025000390000003b0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000370000c13d000000000004004b000000480000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000001200030008c000008fe0000413d000000800600043d000002a40060009c000008fe0000213d000001200200043d000002a40020009c000008fe0000213d000001400100043d000c00000001001d000002a40010009c000008fe0000213d000001600100043d000b00000001001d000002a40010009c000008fe0000213d000001800100043d000a00000001001d000000ff0010008c000008fe0000213d000001000300043d000000e00400043d000000c00700043d000000a00100043d0000000105000039000000000050041b000000000006004b000002010000c13d000002e801000041000000000010043f000000040000043f000002e70100004100000a8000010430000002d40020009c000000850000a13d000002d50020009c0000009d0000a13d000002d60020009c000001080000213d000002d90020009c000001600000613d000002da0020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000601000039000001d20000013d000002c20020009c000000c70000a13d000002c30020009c0000013e0000213d000002c60020009c000001790000613d000002c70020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000c01000039000001d20000013d000002de0020009c000000920000213d000002e20020009c000001560000613d000002e30020009c000001470000613d000002e40020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000d01000039000001d20000013d000002df0020009c0000015b0000613d000002e00020009c0000014c0000613d000002e10020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000e01000039000001d20000013d000002db0020009c000001d60000613d000002dc0020009c000001a00000613d000002dd0020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000101000039000000000201041a000002a4052001970000000003000411000000000035004b000002240000c13d000002a502200197000000000021041b0000000001000414000002a10010009c000002a101008041000000c001100210000002a6011001c70000800d020000390000000303000039000002a70400004100000000060000190a7e0a740000040f0000000100200190000008fe0000613d000000000100001900000a7f0001042e000002d10020009c000001ef0000613d000002d20020009c000001be0000613d000002d30020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000001001000039000001d20000013d000002c80020009c000001f80000613d000002c90020009c000001c30000613d000002ca0020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000101000039000000000101041a000002a4021001970000000001000411000000000012004b000002290000c13d000000000100041a000000020010008c000001f40000613d0000000201000039000000000010041b0000000401000039000000000101041a000002e900100198000002c10000c13d000002ed010000410000000000100443000000000100041000000004001004430000000001000414000002a10010009c000002a101008041000000c001100210000002ee011001c70000800a020000390a7e0a790000040f0000000100200190000008bb0000613d0000000a02000039000000000402041a0000000c02000039000000000302041a000000000043001a0000049e0000413d0000000002430019000000000101043b000000000021004b000003450000a13d0000001001000039000000000201041a0000000f01000039000000000101041a000000000121004b0000049e0000413d000a00000004001d000b00000003001d000900000002001d000c00000001001d000003c70000c13d000000400100043d0000004402100039000002f303000041000000000032043500000024021000390000001e03000039000002b60000013d000002d70020009c000001670000613d000002d80020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000101000039000001fc0000013d000002cd0020009c0000017e0000613d000002ce0020009c000008fe0000c13d000000240030008c000008fe0000413d0000000002000416000000000002004b000008fe0000c13d0000000401100370000000000101043b000000000001004b0000000002000039000000010200c039000000000021004b000008fe0000c13d000000000200041a000000020020008c000001f40000613d0000000202000039000000000020041b000000000001004b000002cd0000c13d0000000402000039000000000202041a000002a4022001970000000005000411000000000025004b0000031e0000c13d0000000c02000039000000000302041a000000000003004b000003590000c13d000002ad01000041000000800010043f0000002001000039000000840010043f0000002a01000039000000a40010043f000002fa01000041000000c40010043f000002fb01000041000000e40010043f000002ec0100004100000a8000010430000002c40020009c000001830000613d000002c50020009c000008fe0000c13d0000000001000416000000000001004b000008fe0000c13d0000000701000039000001d20000013d0000000001000416000000000001004b000008fe0000c13d0000000501000039000001d20000013d000000240030008c000008fe0000413d0000000002000416000000000002004b000008fe0000c13d0000000401100370000000000101043b000000000010043f0000001401000039000001ce0000013d0000000001000416000000000001004b000008fe0000c13d0000000801000039000001d20000013d0000000001000416000000000001004b000008fe0000c13d0000000b01000039000001d20000013d0000000001000416000000000001004b000008fe0000c13d0000000401000039000000000101041a000002b0001001980000016d0000013d0000000001000416000000000001004b000008fe0000c13d0000000401000039000000000101041a000002e9001001980000000001000039000000010100c039000000800010043f000002e50100004100000a7f0001042e0000000001000416000000000001004b000008fe0000c13d0000000f01000039000000800010043f000002e50100004100000a7f0001042e0000000001000416000000000001004b000008fe0000c13d0000000901000039000001d20000013d0000000001000416000000000001004b000008fe0000c13d0000000f01000039000001d20000013d000000240030008c000008fe0000413d0000000002000416000000000002004b000008fe0000c13d0000000401100370000000000601043b000002a40060009c000008fe0000213d0000000101000039000000000201041a000002a4052001970000000003000411000000000035004b000002240000c13d000000000006004b000000640000613d000002a502200197000000000262019f000000000021041b0000000001000414000002a10010009c000002a101008041000000c001100210000002a6011001c70000800d020000390000000303000039000002a704000041000000b70000013d000000640030008c000008fe0000413d0000000002000416000000000002004b000008fe0000c13d0000000402100370000000000202043b000003090020009c000008fe0000213d0000002403100370000000000303043b000c00000003001d000002a40030009c000008fe0000213d0000004401100370000000000401043b0000000201000039000000000101041a000002a401100198000002dd0000c13d000002ad01000041000000800010043f0000002001000039000000840010043f0000001701000039000000a40010043f0000032901000041000000c40010043f000002fd0100004100000a80000104300000000001000416000000000001004b000008fe0000c13d0000000a01000039000001d20000013d000000240030008c000008fe0000413d0000000002000416000000000002004b000008fe0000c13d0000000401100370000000000101043b000002a40010009c000008fe0000213d000000000010043f0000001201000039000000200010043f000000400200003900000000010000190a7e0a5f0000040f000000000101041a000000800010043f000002e50100004100000a7f0001042e000000640030008c000008fe0000413d0000000002000416000000000002004b000008fe0000c13d000000e002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002402100370000000000202043b000000a00020043f0000004401100370000000000101043b000000c00010043f00000080010000390a7e097c0000040f000000400200043d0000000000120435000002a10020009c000002a10200804100000040012002100000032a011001c700000a7f0001042e000000240030008c000008fe0000413d000000000100041a000000020010008c000002420000c13d0000031901000041000000000010043f0000031a0100004100000a80000104300000000001000416000000000001004b000008fe0000c13d0000000401000039000000000101041a000002a401100197000000800010043f000002e50100004100000a7f0001042e000500000007001d000800000004001d000700000003001d000600000001001d000000000105041a000900000002001d000002a502100197000000000262019f000000000025041b0000000002000414000002a405100197000002a10020009c000002a102008041000000c001200210000002a6011001c70000800d020000390000000303000039000002a7040000410a7e0a740000040f00000001002001900000000902000029000008fe0000613d0000000403000039000000000103041a000002a801100197000000000013041b000000000002004b000002ae0000c13d000000400100043d0000004402100039000002bf03000041000000000032043500000024021000390000001803000039000002b60000013d000002e601000041000000000010043f000000040030043f000002e70100004100000a8000010430000002e602000041000000000020043f000000040010043f000002e70100004100000a80000104300000000402000039000000000202041a000002e900200198000002980000c13d0000000002000411000002a402200197000000800020043f000000a00010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002f8011001c70000800d020000390000000103000039000002fe040000410a7e0a740000040f00000001002001900000037b0000c13d000008fe0000013d0000000201000039000000000010041b0000000402000039000000000202041a000002e900200198000002a20000c13d0000000502000039000000000202041a000b00000002001d0000000802000039000000000202041a000c00000002001d000000000101041a0000000302000039000000000202041a0000030203000041000000800030043f000002a402200197000a00000002001d000000840020043f0000000003000414000002a402100197000002a10030009c000002a103008041000000c00130021000000303011001c7000900000002001d0a7e0a790000040f000000800a0000390000006003100270000002a103300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf0000026d0000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000002690000c13d000000000006004b0000027a0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f00030000000103550000000100200190000002fa0000613d0000001f01400039000000600210018f00000080012001bf000000400010043f000000200030008c000008fe0000413d000000800300043d000800000003001d000003040030009c000008fe0000213d00000008050000290000032b035001670000000c04000029000000000034004b0000038c0000a13d000002ad03000041000000000031043500000084032001bf00000020040000390000000000430435000000c40320003900000318040000410000000000430435000000a4022000390000000d03000039000004020000013d000002ad01000041000000800010043f0000002001000039000000840010043f0000001d01000039000000a40010043f000002fc01000041000000c40010043f000002fd0100004100000a8000010430000002ad01000041000000800010043f0000002001000039000000840010043f0000003301000039000000a40010043f0000030001000041000000c40010043f0000030101000041000000e40010043f000002ec0100004100000a80000104300000000c0000006b000003180000c13d000000400100043d0000004402100039000002be030000410000000000320435000000240210003900000017030000390000000000320435000002ad020000410000000000210435000000040210003900000020030000390000000000320435000002a10010009c000002a1010080410000004001100210000002ae011001c700000a8000010430000002ad01000041000000800010043f0000002001000039000000840010043f0000002201000039000000a40010043f000002ea01000041000000c40010043f000002eb01000041000000e40010043f000002ec0100004100000a80000104300000000a02000039000000000302041a000000000003004b0000032a0000c13d000002ad01000041000000800010043f0000002001000039000000840010043f0000002901000039000000a40010043f000002f401000041000000c40010043f000002f501000041000000e40010043f000002ec0100004100000a80000104300000000003000411000000000013004b0000032f0000c13d000b00000004001d0000030901200197000a00000001001d000000000010043f0000001301000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000000000101041a000002a401100198000003960000c13d000000400100043d00000044021000390000032803000041000000000032043500000024021000390000001403000039000002b60000013d0000001f0530018f000002a306300198000000400200043d0000000004620019000003050000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003010000c13d000000000005004b000003120000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000002a10020009c000002a1020080410000004002200210000000000112019f00000a80000104300000000b0000006b0000033b0000c13d000000400100043d0000004402100039000002bd03000041000002200000013d000002ad01000041000000800010043f0000002001000039000000840010043f0000002c01000039000000a40010043f000002f601000041000000c40010043f000002f701000041000000e40010043f000002ec0100004100000a8000010430000000000002041b0000000102000039000000000202041a000002a4052001970000035a0000013d000002ad01000041000000800010043f0000002001000039000000840010043f0000002301000039000000a40010043f0000031b01000041000000c40010043f0000031c01000041000000e40010043f000002ec0100004100000a80000104300000000802000029000003e90020008c0000037f0000413d000000400100043d0000004402100039000002bc03000041000000000032043500000024021000390000001603000039000002b60000013d000000400100043d0000006402100039000002ef0300004100000000003204350000004402100039000002f0030000410000000000320435000000240210003900000021030000390000000000320435000002ad020000410000000000210435000000040210003900000020030000390000000000320435000002a10010009c000002a1010080410000004001100210000002b3011001c700000a8000010430000000000002041b000c00000003001d000000800030043f000000a00010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002f8011001c70000800d020000390000000203000039000002f904000041000b00000005001d0a7e0a740000040f0000000100200190000008fe0000613d0000000001000414000002a10010009c000002a101008041000000c001100210000002a6011001c700008009020000390000000c030000290000000b0400002900000000050000190a7e0a740000040f000c00000002001d0000006002100270000102a10020019d00030000000103550a7e0a1b0000040f0000000c01000029000000010110018f0a7e0a4a0000040f0000000101000039000000000010041b000000000100001900000a7f0001042e000000070020002a0000049e0000413d00000008020000290000000701200029000002a90010009c000003bd0000a13d000000400100043d0000004402100039000002bb03000041000000000032043500000024021000390000001a03000039000002b60000013d000000000045001a0000049e0000413d0000000b0000006b000003f40000c13d0000031701000041000000000010043f0000001201000039000000040010043f000002e70100004100000a8000010430000900000001001d0000000601000039000000000101041a000000010110003a0000049e0000613d0000000602000039000000000012041b000000400100043d0000031d0010009c000003b70000213d0000000c02000029000802a40020019b0000000e02000039000000000202041a000c00000002001d0000006002100039000000400020043f00000000030000310000000203300367000000003403043c0000000001410436000000000021004b000003a90000c13d000000400100043d00000040021000390000031e030000410000000000320435000000250200003900000000022104360000000b0300002900000000003204350000031d0010009c000004880000a13d0000031701000041000000000010043f0000004101000039000000040010043f000002e70100004100000a80000104300000000001000416000000060010006c000004060000813d000000400100043d0000004402100039000002ba03000041000000000032043500000024021000390000001f03000039000002b60000013d000002ed010000410000000000100443000000000100041000000004001004430000000001000414000002a10010009c000002a101008041000000c001100210000002ee011001c70000800a020000390a7e0a790000040f0000000100200190000008bb0000613d000000000101043b0000000a0110006c0000000c050000290000000b020000290000049e0000413d000000000121004b0000049e0000413d000000000051004b00000000050140190000000502000039000000000302041a0000000802000039000000000402041a00000000024300a9000000000004004b000003e70000613d00000000044200d9000000000034004b0000049e0000c13d0000000001510049000000000021004b0000054f0000813d000000400100043d0000006402100039000002f10300004100000000003204350000004402100039000002f2030000410000000000320435000000240210003900000037030000390000034e0000013d000000010300008a0000000b033000fa0000000c0030006b000004600000a13d000002ad03000041000000000031043500000084032001bf00000020040000390000000000430435000000c403200039000002b7040000410000000000430435000000a4022000390000001a0300003900000000003204350000004001100210000002ae011001c700000a8000010430000000000000043f0000001101000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000602000039000000000021041b0000000101000039000000000010043f0000001101000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000802000039000000000021041b0000000201000039000000000010043f0000001101000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000c02000039000000000021041b0000000301000039000000000010043f0000001101000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000001202000039000000000021041b0000000401000039000000000010043f0000001101000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d0000000a02000029000000ff0220018f000000000101043b0000001803000039000000000031041b000000050020008c000005920000413d000000400100043d0000004402100039000002b903000041000000000032043500000024021000390000001303000039000002b60000013d0000000b020000290007000c002000bd0000000c0000006b000004680000613d00000007020000290000000c012000fa0000000b0010006c0000049e0000c13d0000000001000411000000000010043f0000001201000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000000000101041a000000000001004b000004a40000c13d0000000802000029000b000c0020002d00000000020004160000000b0020006c000005620000813d000000400100043d000000640210003900000315030000410000000000320435000000440210003900000316030000410000000000320435000000240210003900000024030000390000034e0000013d0000006003100039000000400030043f000002a10020009c000002a10200804100000040022002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d0000000c0000006b000004a80000c13d0000031701000041000000000010043f0000001101000039000000040010043f000002e70100004100000a8000010430000000400100043d00000044021000390000030503000041000002b30000013d000000000101043b000700000001001d000000400100043d00000040021000390000031f03000041000000000032043500000020021000390000000b030000290000000000320435000000260300003900000000003104350000031d0010009c000003b70000213d0000006003100039000000400030043f000002a10020009c000002a10200804100000040022002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000600000001001d000000400100043d00000040021000390000032003000041000000000032043500000020021000390000000b030000290000000000320435000000250300003900000000003104350000031d0010009c000003b70000213d0000006003100039000000400030043f000002a10020009c000002a10200804100000040022002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000400200043d000b00000002001d0000031d0020009c000003b70000213d00000007020000290000000c202000fa000000010220003900000006030000290000000c303000fa0000000103300039000000000501043b0000000b010000290000006004100039000000400040043f0000002004100039000700000004001d000000000034043500000000002104350000000c205000fa00000001022000390000004003100039000c00000003001d00000000002304350a7e097c0000040f000600000001001d000000000001004b000007c80000c13d0000000a01000029000000000010043f0000001301000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000000000201041a000002a502200197000000000021041b0000000901000029000000000010043f0000001201000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000000000001041b0000000b010000290000000001010433000000070200002900000000020204330000000c0300002900000000030304330000000604000039000000000404041a0000000705000039000000000505041a000000400600043d000000e0076000390000000000570435000000c0056000390000000000450435000000a0046000390000000000340435000000800360003900000000002304350000006002600039000000000012043500000040016000390000000a02000029000000000021043500000020016000390000000802000029000000000021043500000009010000290000000000160435000002a10060009c000002a10600804100000040016002100000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f00000326011001c70000800d0200003900000001030000390000032704000041000000b70000013d00000000030500190000000901000029000000000015001a00000010020000390000049e0000413d0000000001130019000000000012041b0000000101000039000000000201041a0000000001000414000002a10010009c000002a101008041000000c001100210000000000003004b000002a60110c1c7000002a40420019700008009020000390000000002046019000003710000013d000002ed010000410000000000100443000000000100041000000004001004430000000001000414000002a10010009c000002a101008041000000c001100210000002ee011001c70000800a020000390a7e0a790000040f0000000100200190000008bb0000613d000000000101043b0000000a02000039000000000202041a000000070020002a0000049e0000413d00000007022000290000000c03000039000000000303041a000000000023001a0000049e0000413d0000000004230019000000400300043d0000002402300039000700000003001d0000000403300039000000000041004b000005b10000813d000002ad01000041000000070400002900000000001404350000002001000039000000000013043500000032010000390000000000120435000000640140003900000313020000410000000000210435000000440140003900000314020000410000000000210435000002a10040009c000002a1040080410000004001400210000002b3011001c700000a8000010430000000000020043f0000001101000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000000000101041a0000000e02000039000000000012041b000000000001004b0000049e0000613d000000010210008a00000005032000b9000000050000006b000005ab0000613d00000005043000fa000000000024004b0000049e0000c13d000000060030006b0000064a0000813d000000400100043d0000004402100039000002b803000041000003c30000013d0000030601000041000000070400002900000000001404350000000a01000029000000000013043500000004010000390000000201100367000000000101043b0000000000120435000002a10040009c000002a101000041000000000104401900000040011002100000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000000080000006b000005c80000c13d00000308011001c70000000902000029000005cd0000013d00000307011001c700008009020000390000000803000029000000090400002900000000050000190a7e0a740000040f0000006003100270000002a103300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000705700029000005dd0000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b000005d90000c13d000000000006004b000005ea0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000100000003001f000300000001035500000001002001900000063e0000613d0000001f01400039000000600210018f0000000701200029000000000021004b00000000020000390000000102004039000003090010009c000003b70000213d0000000100200190000003b70000c13d000000400010043f000000200030008c000008fe0000413d00000007010000290000000001010433000a00000001001d000003090010009c000008fe0000213d0000000001000411000000000010043f0000001201000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000a02000029000000000021041b000000000020043f0000001301000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b000000000201041a000002a5022001970000000003000411000000000232019f000000000021041b0000000901000039000000000301041a0000000c013000b90000000c0000006b0000000002000019000006310000613d0000000c021000fa000000000032004b0000049e0000c13d0000000b02000039000000000302041a0000000c023000b90000000c042000fa000000000034004b0000049e0000c13d000027100110011a0000032b041001670000000a03000039000000000303041a000000000043004b000008550000a13d000000400100043d00000044021000390000031203000041000000000032043500000024021000390000001903000039000002b60000013d0000001f0530018f000002a306300198000000400200043d0000000004620019000003050000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006450000c13d000003050000013d0000000503000039000000000023041b00000008020000390000000503000029000000000032041b0000000402000039000000000202041a000002ab00200198000007e60000c13d000000020010008c000007730000413d0000000107000039000000400100043d000002af0010009c000003b70000213d0000008002100039000000400020043f00000003030000390000000003310436000000000400003100000002044003670000000005030019000000004604043c0000000005650436000000000025004b000006600000c13d00000000007304350000006003100039000000000073043500000040041000390000000000740435000000400100043d000000200210003900000000007204350000000004040433000000ff0440018f000000400510003900000000004504350000000003030433000000ff0330018f0000006004100039000000000034043500000060030000390000000000310435000002af0010009c000003b70000213d000a00000007001d0000008003100039000000400030043f000002a10020009c000002a10200804100000040022002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000802000039000000000202041a0000000a0300002900000000043200a9000000000003004b000006970000613d00000000033400d9000000000023004b0000049e0000c13d000500000004001d000000000010043f0000001401000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000502000029000000000021041b0000000a02000029000000ff0020008c0000049e0000613d0000000e01000039000000000101041a0000000102200039000000ff0720018f000000000017004b000006560000413d000000020010008c000007730000413d000a00010000003d000000010100008a0000000a011000fa0000000802000039000000000202041a000000000012004b000009000000213d0000000a01000029000500ff0010019300000001070000390000000a0070006b0000000502000029000007650000613d000000400100043d000002af0010009c000003b70000213d0000008002100039000000400020043f00000003030000390000000003310436000000000400003100000002044003670000000005030019000000004604043c0000000005650436000000000025004b000006c90000c13d0000000a0200002900000000002304350000006003100039000000000073043500000040041000390000000000240435000000400100043d0000002002100039000000050500002900000000005204350000000004040433000000ff0440018f000000400510003900000000004504350000000003030433000000ff0330018f0000006004100039000000000034043500000060030000390000000000310435000002af0010009c000003b70000213d000300000007001d0000008003100039000000400030043f000002a10020009c000002a10200804100000040022002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000802000039000000000202041a0004000a002000bd000000000002004b000007010000613d00000004022000f90000000a0020006c0000049e0000c13d000000000010043f0000001401000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b00000004020000290000000102200270000000000021041b000000400100043d000002af0010009c0000000307000029000003b70000213d0000008002100039000000400020043f00000003030000390000000003310436000000000400003100000002044003670000000005030019000000004604043c0000000005650436000000000025004b0000071c0000c13d000000000073043500000060031000390000000a02000029000000000023043500000040041000390000000000240435000000ff0570018f000000400100043d0000002002100039000300000005001d00000000005204350000000004040433000000ff0440018f000000400510003900000000004504350000000003030433000000ff0330018f0000006004100039000000000034043500000060030000390000000000310435000002af0010009c000003b70000213d0000008003100039000000400030043f000002a10020009c000002a10200804100000040022002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b0000000802000039000000000202041a0004000a002000bd000000000002004b000007540000613d00000004022000f90000000a0020006c0000049e0000c13d000000000010043f0000001401000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f0000000100200190000008fe0000613d000000000101043b00000004020000290000000102200270000000000021041b0000000302000029000000ff0020008c0000049e0000613d00000001072000390000000e01000039000000000101041a000000000012004b000006bc0000413d0000000502000029000000ff0020008c0000049e0000613d0000000502000029000a00010020003d0000000a0010006b000006b30000413d000000400100043d000a00000001001d0000000401000039000000000101041a000500000001001d000002b000100198000007ed0000c13d00000080020000390000000a010000290a7e093d0000040f00000003010000390000000a020000290000000001120436000000800220003900000000030000310000000203300367000000003403043c0000000001410436000000000021004b000007830000c13d0000000e01000039000000000101041a000400000001001d0000000a010000290a7e094f0000040f0000000402000029000000ff0220018f000400000002001d00000000002104350000000a010000290a7e09590000040f000000040200002900000000002104350000000a010000290a7e09640000040f00000004020000290000000000210435000000400100043d000400000001001d0000002002100039000300000002001d0000000a010000290a7e096f0000040f00000004030000290000000002310049000000200120008a000000000013043500000000010300190a7e093d0000040f0000000401000029000000000201043300000003010000290a7e0a5f0000040f0000000d02000039000000000012041b00000009010000390000000802000029000000000021041b0000000b010000390000000702000029000000000021041b0000000501000029000002b40110019700000009011001af000002b5011001c70000000402000039000000000012041b0000000f010000390000000602000029000000000021041b0000000203000039000000000103041a000002a5011001970000000c011001af000000000013041b0000000303000039000000000103041a000002a5011001970000000b011001af000000000013041b000000200100003900000100001004430000012000000443000002b60100004100000a7f0001042e000002ed010000410000000000100443000000000100041000000004001004430000000001000414000002a10010009c000002a101008041000000c001100210000002ee011001c70000800a020000390a7e0a790000040f0000000100200190000008bb0000613d0000000a02000039000000000202041a000000000101043b000500000002001d000000000121004b0000049e0000413d0000000c02000039000000000202041a000400000002001d000000000121004b0000049e0000413d000000060010006b000008010000a13d000000400100043d00000044021000390000032503000041000007e90000013d000000400100043d0000004402100039000002ac03000041000000000032043500000024021000390000001d03000039000002b60000013d0000000a030000290000006401300039000002b10200004100000000002104350000004401300039000002b2020000410000000000210435000000240130003900000024020000390000000000210435000002ad010000410000000000130435000000040130003900000020020000390000000000210435000002a10030009c000002a1030080410000004001300210000002b3011001c700000a80000104300000000901000039000000000201041a00000006012000b900000006031000fa000000000023004b0000049e0000c13d0000000b02000039000000000302041a00000006023000b900000006042000fa000000000034004b0000049e0000c13d000027100310011a000300000003001d00060006003000730000049e0000413d000027100220011a000100000002001d00020006002000730000049e0000413d000002ed010000410000000000100443000000000100041000000004001004430000000001000414000002a10010009c000002a101008041000000c001100210000002ee011001c70000800a020000390a7e0a790000040f0000000100200190000008bb0000613d000000000101043b000000050110006c0000049e0000413d000000040110006c0000049e0000413d0000000303000029000000050030002a0000049e0000413d000000030300002900000005023000290000000a03000039000000000023041b0000000403000029000000010030002a0000049e0000413d000000040300002900000001023000290000000c03000039000000000023041b0000000702000039000000000302041a000000020030002a0000049e0000413d0000000203300029000000000032041b000000400200043d0000002003200039000000020010006b000008e20000c13d0000000401000039000000000401041a000002a80440019700000322044001c7000000000041041b0000000901000029000000000012043500000002010000290000000000130435000002a10020009c000002a10200804100000040012002100000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002aa011001c70000800d0200003900000001030000390000032304000041000008f20000013d000027100220011a0000032b052001670000000c04000039000000000404041a000000000054004b0000085f0000a13d000000400100043d00000044021000390000031103000041000003880000013d000000000013001a0000049e0000413d00000000031300190000000a05000039000000000035041b000000000024001a0000049e0000413d00000000032400190000000c04000039000000000034041b000000400400043d00000020034000390000000000230435000c00000004001d00000000001404350000030a0100004100000000001004430000000001000414000002a10010009c000002a101008041000000c0011002100000030b011001c70000800b020000390a7e0a790000040f0000000100200190000008bb0000613d000000000101043b0000000c0300002900000040023000390000000000120435000002a10030009c000002a10300804100000040013002100000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f0000030c011001c70000800d0200003900000001030000390000030d040000410a7e0a740000040f0000000100200190000008fe0000613d000000400100043d00000040021000390000000a03000029000000000032043500000020021000390000000003000410000000000032043500000000020004110000000000210435000002a10010009c000002a10100804100000040011002100000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f0000030c011001c70000800d0200003900000001030000390000030e040000410a7e0a740000040f0000000100200190000008fe0000613d00000000020004160000000b0320006c0000037b0000613d0000000001000414000002a10010009c000002a101008041000000c001100210000002a6011001c70000800902000039000000000400041100000000050000190a7e0a740000040f00030000000103550000006003100270000102a10030019d000002a103300198000008bc0000c13d00000001002001900000037b0000c13d000000400100043d00000044021000390000031003000041000003410000013d000000000001042f0000001f04300039000002a2044001970000003f044000390000030f04400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000003090040009c000003b70000213d0000000100600190000003b70000c13d000000400040043f0000001f0430018f0000000006350436000002a3053001980000000003560019000008d40000613d000000000701034f000000007807043c0000000006860436000000000036004b000008d00000c13d000000000004004b000008b50000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000008b50000013d0000000901000029000000000012043500000002010000290000000000130435000002a10020009c000002a10200804100000040012002100000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002aa011001c70000800d02000039000000010300003900000321040000410a7e0a740000040f0000000100200190000008fe0000613d0000000001000414000002a10010009c000002a101008041000000c0011002100000000103000029000000060030006b000009040000c13d0000000902000029000009090000013d000000000100001900000a8000010430000000400100043d0000004402100039000002b703000041000003880000013d000002a6011001c700008009020000390000000203000029000000090400002900000000050000190a7e0a740000040f00030000000103550000006003100270000102a10030019d000002a103300198000009340000613d0000001f04300039000002a2044001970000003f044000390000030f04400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000003090040009c000003b70000213d0000000100600190000003b70000c13d000000400040043f0000001f0430018f0000000006350436000002a3053001980000000003560019000009270000613d000000000701034f000000007807043c0000000006860436000000000036004b000009230000c13d000000000004004b000009340000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000005050000c13d000000400100043d00000044021000390000032403000041000000000032043500000024021000390000001503000039000002b60000013d0000001f022000390000032c022001970000000001120019000000000021004b00000000020000390000000102004039000003090010009c000009490000213d0000000100200190000009490000c13d000000400010043f000000000001042d0000031701000041000000000010043f0000004101000039000000040010043f000002e70100004100000a80000104300000000012010434000000000002004b000009530000613d000000000001042d0000031701000041000000000010043f0000003201000039000000040010043f000002e70100004100000a80000104300000000002010433000000010020008c0000095e0000a13d0000004001100039000000000001042d0000031701000041000000000010043f0000003201000039000000040010043f000002e70100004100000a80000104300000000002010433000000020020008c000009690000a13d0000006001100039000000000001042d0000031701000041000000000010043f0000003201000039000000040010043f000002e70100004100000a80000104300000000003010433000000000003004b0000097a0000613d000000000400001900000020011000390000000005010433000000ff0550018f00000000025204360000000104400039000000000034004b000009730000413d0000000001020019000000000001042d000000400300043d0000032d0030009c00000a0c0000813d0000008004300039000000400040043f00000003020000390000000002230436000000000500003100000002055003670000000006020019000000005705043c0000000006760436000000000046004b000009860000c13d0000000004000019000000050540021000000000061500190000000006060433000000ff0060008c000009f50000213d0000000007030433000000000074004b00000a060000813d00000000055200190000000000650435000000020040008c00000001044000390000098b0000413d000000400100043d00000020041000390000000003030433000000000003004b0000000005040019000009a60000613d000000000600001900000000050400190000000027020434000000ff0770018f00000000057504360000000106600039000000000036004b000009a00000413d0000000002150049000000200320008a00000000003104350000001f022000390000032c032001970000000002130019000000000032004b00000000030000390000000103004039000003090020009c00000a0c0000213d000000010030019000000a0c0000c13d000000400020043f000002a10040009c000002a10400804100000040024002100000000001010433000002a10010009c000002a1010080410000006001100210000000000121019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f000000010020019000000a120000613d000000000101043b0000000402000039000000000202041a000002b000200198000009e60000613d0000000d02000039000000000202041a000000000021004b000009e60000c13d000002ed010000410000000000100443000000000100041000000004001004430000000001000414000002a10010009c000002a101008041000000c001100210000002ee011001c70000800a020000390a7e0a790000040f000000010020019000000a1a0000613d0000000a02000039000000000202041a000000000101043b000000000121004b00000a140000413d0000000c02000039000000000202041a000000000121004b00000a140000413d000000000001042d000000000010043f0000001401000039000000200010043f0000000001000414000002a10010009c000002a101008041000000c001100210000002aa011001c700008010020000390a7e0a790000040f000000010020019000000a120000613d000000000101043b000000000101041a000000000001042d000000400100043d00000044021000390000032e030000410000000000320435000000240210003900000019030000390000000000320435000002ad020000410000000000210435000000040210003900000020030000390000000000320435000002a10010009c000002a1010080410000004001100210000002ae011001c700000a80000104300000031701000041000000000010043f0000003201000039000000040010043f000002e70100004100000a80000104300000031701000041000000000010043f0000004101000039000000040010043f000002e70100004100000a8000010430000000000100001900000a80000104300000031701000041000000000010043f0000001101000039000000040010043f000002e70100004100000a8000010430000000000001042f000000010100003200000a430000613d0000001f031000390000032c033001970000003f033000390000032c04300197000000400300043d0000000004430019000000000034004b00000000050000390000000105004039000003090040009c00000a440000213d000000010050019000000a440000c13d000000400040043f00000000051304360000032c021001980000001f0310018f0000000001250019000000030400036700000a360000613d000000000604034f000000006706043c0000000005750436000000000015004b00000a320000c13d000000000003004b00000a430000613d000000000224034f0000000303300210000000000401043300000000043401cf000000000434022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000242019f0000000000210435000000000001042d0000031701000041000000000010043f0000004101000039000000040010043f000002e70100004100000a8000010430000000000001004b00000a4d0000613d000000000001042d000000400100043d00000044021000390000032f03000041000000000032043500000024021000390000000f030000390000000000320435000002ad020000410000000000210435000000040210003900000020030000390000000000320435000002a10010009c000002a1010080410000004001100210000002ae011001c700000a8000010430000000000001042f000002a10010009c000002a1010080410000004001100210000002a10020009c000002a1020080410000006002200210000000000112019f0000000002000414000002a10020009c000002a102008041000000c002200210000000000112019f000002a6011001c700008010020000390a7e0a790000040f000000010020019000000a720000613d000000000101043b000000000001042d000000000100001900000a800001043000000a77002104210000000102000039000000000001042d0000000002000019000000000001042d00000a7c002104230000000102000039000000000001042d0000000002000019000000000001042d00000a7e0000043200000a7f0001042e00000a800001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000249f00200000000000000000000000000000000000040000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000053657175656e63657320616c726561647920696e697469616c697a656400000008c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f00000000000000000000ff000000000000000000000000000000000000000000697a6564000000000000000000000000000000000000000000000000000000004a61636b706f742073657175656e636520616c726561647920696e697469616c0000000000000000000000000000000000000084000000000000000000000000ffffffffffffffffff0000ff0000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000002000000000000000000000000000000400000010000000000000000005072697a652063616c63756c6174696f6e206f766572666c6f770000000000005072697a6520706f6f6c2063616e7420636f766572206d6178207072697a6500496e76616c69642072616e676520696e64657800000000000000000000000000496e73756666696369656e7420696e697469616c207072697a6520706f6f6c00466565732063616e74206265206d6f7265207468616e20313525000000000000466565732063616e6e6f74206578636565642031302500000000000000000000496e76616c696420656e74726f70792070726f76696465720000000000000000496e76616c696420656e74726f70792061646472657373000000000000000000496e76616c696420706c6174666f726d206164647265737300000000000000000000000000000000000000000000000000000000000000000000000090dd336c00000000000000000000000000000000000000000000000000000000dbe55e5500000000000000000000000000000000000000000000000000000000e88958db00000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000fed5760100000000000000000000000000000000000000000000000000000000e88958dc00000000000000000000000000000000000000000000000000000000efa7b7ea00000000000000000000000000000000000000000000000000000000dbe55e5600000000000000000000000000000000000000000000000000000000e03a028800000000000000000000000000000000000000000000000000000000e0470fd900000000000000000000000000000000000000000000000000000000c3a1ed4700000000000000000000000000000000000000000000000000000000d472706900000000000000000000000000000000000000000000000000000000d472706a00000000000000000000000000000000000000000000000000000000d7be375c00000000000000000000000000000000000000000000000000000000c3a1ed4800000000000000000000000000000000000000000000000000000000c7cc2aaa0000000000000000000000000000000000000000000000000000000090dd336d00000000000000000000000000000000000000000000000000000000b95298f100000000000000000000000000000000000000000000000000000000c20615ed000000000000000000000000000000000000000000000000000000004407176b000000000000000000000000000000000000000000000000000000007c57505600000000000000000000000000000000000000000000000000000000853e6e9b00000000000000000000000000000000000000000000000000000000853e6e9c000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000007c57505700000000000000000000000000000000000000000000000000000000844622ab000000000000000000000000000000000000000000000000000000004407176c0000000000000000000000000000000000000000000000000000000052a5f1f800000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000026232a2d0000000000000000000000000000000000000000000000000000000026232a2e00000000000000000000000000000000000000000000000000000000306c183f00000000000000000000000000000000000000000000000000000000426c0601000000000000000000000000000000000000000000000000000000000025ebc8000000000000000000000000000000000000000000000000000000000187aea000000000000000000000000000000000000000000000000000000000230b38060000000000000000000000000000000000000020000000800000000000000000118cdaa70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000001e4fbdf7000000000000000000000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000043616e6e6f742077697468647261772066726f6d2062726f6b656e2070696e61746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3902000002000000000000000000000000000000240000000000000000000000006c000000000000000000000000000000000000000000000000000000000000004e6f2066756e647320617661696c61626c6520666f7220776974686472617761656e742066756e647320666f72206d6178207072697a650000000000000000005769746864726177616c20776f756c64206c6561766520696e737566666963694e6f207072697a6520706f6f6c206c65667420746f20776974686472617700004e6f2063726561746f722062656e656669747320617661696c61626c6520746f20776974686472617700000000000000000000000000000000000000000000004f6e6c7920706c6174666f726d2063616e20776974686472617720706c6174666f726d2062656e656669747300000000000000000000000000000000000000000200000000000000000000000000000000000040000000800000000000000000084f5bb573a7dde8cde642d85003e8767daffa880c55fa83803f8092ab20f3a94e6f20706c6174666f726d2062656e656669747320617661696c61626c6520746f2077697468647261770000000000000000000000000000000000000000000043616e6e6f7420726566696c6c20612062726f6b656e2070696e61746100000000000000000000000000000000000000000000640000008000000000000000002a544dcc8decd9cca173554732e494ef7fbc420d6913d2ecc77f73c495a268664d7573742073656e6420736f6d652045544820746f20726566696c6c00000000546869732070696e61746120686173206265656e2062726f6b656e20616e6420746865206a61636b706f7420636c61696d656400000000000000000000000000b88c914800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff7573657220697320616c726561647920706c6179696e6700000000000000000019cb825f0000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000600000000000000000000000007126aa3af200db0d4edb3b56e30373c13d35ab8777d34bfe4a7bfea1c0d5466642cad0a438324312ec672ff183cb18ec3e80cecbe16e9e9afe0c50c6103ba22500000000000000000000000000000000000000000000000000000003ffffffe0526566756e64207472616e73666572206661696c656400000000000000000000506c6174666f726d2062656e6566697473206f766572666c6f7700000000000043726561746f722062656e6566697473206f766572666c6f77000000000000007220706f74656e7469616c207072697a65730000000000000000000000000000496e73756666696369656e7420636f6e74726163742062616c616e636520666f6e617461000000000000000000000000000000000000000000000000000000006e6f20656e6f75676874207061796d656e7420746f20686974207468652070694e487b7100000000000000000000000000000000000000000000000000000000436f7374206f766572666c6f77000000000000000000000000000000000000003ee5aeb50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000004f6e6c7920456e74726f70792063616e2063616c6c20746869732066756e6374696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f66697273740000000000000000000000000000000000000000000000000000007365636f6e640000000000000000000000000000000000000000000000000000746869726400000000000000000000000000000000000000000000000000000030ba756a93f9f2a201d40ca443aa7c6dbfda2aa892f3808d5ba60cd841cba0c50000000000000000000000010000000000000000000000000000000000000000ea65c08335687565ecf0d3988e02d5d6380bf321f7c117e69460946d2ac70b005072697a65207472616e73666572206661696c65640000000000000000000000496e73756666696369656e7420636f6e74726163742062616c616e6365000000020000000000000000000000000000000000010000000000000000000000000058a22df16b525dbf6db3b25495f925c89731c06efb8a37afa95e454d237ea75f496e76616c696420757365722061646472657373000000000000000000000000456e74726f70792061646472657373206e6f74207365740000000000000000000000000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff8053657175656e6365206e756d62657220746f6f206c61726765000000000000005472616e73666572206661696c65640000000000000000000000000000000000aa6dbb7a3e245c799333c5b019e00dbc43789bd519187e0007a57446af61b806
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007ea1bb15c6d91827a37697c75b2eeee930c0c18800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ea1bb15c6d91827a37697c75b2eeee930c0c188000000000000000000000000858687fd592112f7046e394a3bf10d0c11ff9e630000000000000000000000006cc14824ea2918f5de5c2f75a9da968ad4bd63440000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initialOwner (address): 0x7ea1Bb15c6D91827a37697c75b2Eeee930c0C188
Arg [1] : _prizePool (uint256): 0
Arg [2] : _hitCost (uint256): 0
Arg [3] : _creatorFee (uint256): 0
Arg [4] : _platformFee (uint256): 0
Arg [5] : _platformAddress (address): 0x7ea1Bb15c6D91827a37697c75b2Eeee930c0C188
Arg [6] : _entropyAddress (address): 0x858687fD592112f7046E394A3Bf10D0C11fF9e63
Arg [7] : _entropyProvider (address): 0x6CC14824Ea2918f5De5C2f75A9Da968ad4BD6344
Arg [8] : _rangeIndex (uint8): 0
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000007ea1bb15c6d91827a37697c75b2eeee930c0c188
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000007ea1bb15c6d91827a37697c75b2eeee930c0c188
Arg [6] : 000000000000000000000000858687fd592112f7046e394a3bf10d0c11ff9e63
Arg [7] : 0000000000000000000000006cc14824ea2918f5de5c2f75a9da968ad4bd6344
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ 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.