Overview
S Balance
S Value
$17.27 (@ $0.70/S)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 269 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Enter Astro Spin | 10301127 | 4 hrs ago | IN | 10.36000001 S | 0.00724872 | ||||
Perform Upkeep | 10299781 | 4 hrs ago | IN | 0.036 S | 0.0048721 | ||||
Enter Astro Spin | 10299770 | 4 hrs ago | IN | 2.32897873 S | 0.0058173 | ||||
Enter Astro Spin | 10299728 | 4 hrs ago | IN | 1.59413519 S | 0.00541985 | ||||
Enter Astro Spin | 10299663 | 4 hrs ago | IN | 1.79788889 S | 0.00569475 | ||||
Enter Astro Spin | 10299615 | 4 hrs ago | IN | 1.16403134 S | 0.00559057 | ||||
Enter Astro Spin | 10299570 | 4 hrs ago | IN | 1.1192609 S | 0.00541985 | ||||
Enter Astro Spin | 10299524 | 4 hrs ago | IN | 1.32388203 S | 0.00707109 | ||||
Enter Astro Spin | 10299478 | 4 hrs ago | IN | 1.26084003 S | 0.00541985 | ||||
Enter Astro Spin | 10299425 | 4 hrs ago | IN | 0.97680002 S | 0.00541985 | ||||
Enter Astro Spin | 10299403 | 4 hrs ago | IN | 2.36000001 S | 0.01008089 | ||||
Enter Astro Spin | 10299191 | 4 hrs ago | IN | 10.36000001 S | 0.00724872 | ||||
Perform Upkeep | 10298799 | 4 hrs ago | IN | 0.036 S | 0.0048721 | ||||
Enter Astro Spin | 10298785 | 4 hrs ago | IN | 1.55737539 S | 0.00671158 | ||||
Enter Astro Spin | 10298737 | 4 hrs ago | IN | 1.00985602 S | 0.00541985 | ||||
Enter Astro Spin | 10298690 | 4 hrs ago | IN | 1.62640003 S | 0.00541985 | ||||
Enter Astro Spin | 10298671 | 4 hrs ago | IN | 8.36000001 S | 0.0065038 | ||||
Enter Astro Spin | 10294248 | 5 hrs ago | IN | 5.36000001 S | 0.00724872 | ||||
Perform Upkeep | 10294120 | 5 hrs ago | IN | 0.036 S | 0.0048721 | ||||
Enter Astro Spin | 10294095 | 5 hrs ago | IN | 0.75083916 S | 0.00541985 | ||||
Enter Astro Spin | 10294046 | 5 hrs ago | IN | 0.84321414 S | 0.00219665 | ||||
Enter Astro Spin | 10294001 | 5 hrs ago | IN | 0.55206035 S | 0.00541985 | ||||
Enter Astro Spin | 10293957 | 5 hrs ago | IN | 0.76423634 S | 0.00541985 | ||||
Enter Astro Spin | 10293913 | 5 hrs ago | IN | 0.82767202 S | 0.00541985 | ||||
Enter Astro Spin | 10293866 | 5 hrs ago | IN | 0.46960001 S | 0.0058438 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10299784 | 4 hrs ago | 4.1371634 S | ||||
10299784 | 4 hrs ago | 16.54865361 S | ||||
10299781 | 4 hrs ago | 0.036 S | ||||
10298805 | 4 hrs ago | 3.22272627 S | ||||
10298805 | 4 hrs ago | 12.89090511 S | ||||
10298799 | 4 hrs ago | 0.036 S | ||||
10294125 | 5 hrs ago | 1.20952438 S | ||||
10294125 | 5 hrs ago | 4.83809755 S | ||||
10294120 | 5 hrs ago | 0.036 S | ||||
10292689 | 5 hrs ago | 12 S | ||||
10292683 | 5 hrs ago | 0.036 S | ||||
10288878 | 5 hrs ago | 1.40064824 S | ||||
10288878 | 5 hrs ago | 5.60259299 S | ||||
10288872 | 5 hrs ago | 0.036 S | ||||
10288373 | 5 hrs ago | 16.56000082 S | ||||
10287893 | 5 hrs ago | 1.60041106 S | ||||
10287893 | 5 hrs ago | 6.40164427 S | ||||
10287889 | 5 hrs ago | 0.036 S | ||||
10287408 | 6 hrs ago | 0.49622967 S | ||||
10287408 | 6 hrs ago | 1.9849187 S | ||||
10287405 | 6 hrs ago | 0.036 S | ||||
10284201 | 6 hrs ago | 2.02303385 S | ||||
10284201 | 6 hrs ago | 8.0921354 S | ||||
10284197 | 6 hrs ago | 0.0442831 S | ||||
10280005 | 6 hrs ago | 57.24000286 S |
Loading...
Loading
Contract Name:
AstroSpin
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.16; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@pythnetwork/entropy-sdk-solidity/IEntropy.sol"; import "@pythnetwork/entropy-sdk-solidity/IEntropyConsumer.sol"; error AstroSpin__NotEnoughEth(); error AstroSpin__TransferFailed(); error AstroSpin__NotOpen(); error AstroSpin__UpkeepNotNeeded( uint256 currentBalance, uint256 numPlayers, uint256 astroSpinState ); contract AstroSpin is IEntropyConsumer, Ownable, ReentrancyGuard { // Entropy IEntropy entropy; address entropyProvider; /* state variables */ uint256 public i_minEntranceFee; address payable[] public s_players; address payable public treasuryWallet; bool public feeEnabled = true; uint256 public feePool; uint256 public astroSpinFee; address payable[] public s_recentWinner; mapping(address => bool) public isPlayerEntered; uint256 public roundCount = 0; mapping(address => uint256) public contributions; address public caller; /** Variables */ enum AstroSpinState { OPEN, CALCULATING } AstroSpinState private s_AstroSpinState; uint256 private s_lastTimeStamp; /* events */ event AstroSpinEnterRequest(uint64 sequenceNumber); event AstroSpinEnterResult(uint64 sequenceNumber); event AstroSpinEnter(address indexed player, uint256 amount); event AstroSpinResult(uint64 sequenceNumber); event RefundProcessed(address indexed player, uint256 amount); event RefundCompleted(uint256 playerCount, uint256 totalAmount); event RequestedAstroSpinWinner(uint256 indexed requestId); event WinnerPicked( address indexed winner, uint256 prize, uint256 contribution ); event TreasuryChanged(address indexed newTreasury); // Events for tracking refund status event RefundIssued(address to, uint256 amount); event RefundFailed(address to, uint256 amount); event SpecialWalletPoolFilled(uint256 amount, uint256 newTotal); /** * @notice Constructor initializes the AstroSpin contract * @param minEntranceFee The fee required to enter the game * @param _treasuryWallet Address where treasury funds will be sent * @param _entropy Address of the Entropy contract for randomness * @param _entropyProvider Address of the entropy provider */ constructor( uint256 minEntranceFee, address payable _treasuryWallet, address _entropy, address _entropyProvider, address _caller ) { i_minEntranceFee = minEntranceFee; s_AstroSpinState = AstroSpinState.OPEN; treasuryWallet = _treasuryWallet; entropy = IEntropy(_entropy); entropyProvider = _entropyProvider; caller = _caller; } modifier onlyCaller() { require( msg.sender == caller || msg.sender == owner(), "Only the caller or owner can call this function" ); _; } function setUpkeepCaller(address _newCaller) external onlyOwner { require(_newCaller != address(0), "New caller cannot be zero address"); caller = _newCaller; } // This method is required by the IEntropyConsumer interface function getEntropy() internal view override returns (address) { return address(entropy); } function getFlipFee() public view returns (uint256 fee) { fee = entropy.getFee(entropyProvider); } function getAstroSpinFee() public view returns (uint256 fee) { fee = astroSpinFee; } function setFee(uint256 _feeMultiplier) public onlyOwner { require(_feeMultiplier > 0, "Fee multiplier must be greater than zero"); uint256 flipFee = entropy.getFee(entropyProvider); astroSpinFee = (flipFee * _feeMultiplier); } function toggleFee(bool _enabled) public onlyOwner { feeEnabled = _enabled; } function enterAstroSpin() public payable { require(s_AstroSpinState == AstroSpinState.OPEN, "AstroSpin__NotOpen"); uint256 fee = feeEnabled ? astroSpinFee : 0; feePool += fee; require(msg.value >= i_minEntranceFee, "AstroSpin__NotEnoughEth"); contributions[msg.sender] += msg.value - fee; if (!isPlayerEntered[msg.sender]) { s_players.push(payable(msg.sender)); isPlayerEntered[msg.sender] = true; } emit AstroSpinEnter(msg.sender, contributions[msg.sender]); } /** * @notice Initiates the random winner selection process if conditions are met * @dev Checks if game is open, has balance and minimum players before requesting entropy * @param userRandomNumber Additional entropy input from user */ function performUpkeep( bytes32 userRandomNumber ) external payable onlyCaller { bool isOpen = AstroSpinState.OPEN == s_AstroSpinState; bool hasBalance = address(this).balance > 0; bool hasPlayers = s_players.length >= 2; bool upkeepNeeded = (isOpen && hasBalance && hasPlayers); if (!upkeepNeeded) { revert AstroSpin__UpkeepNotNeeded( address(this).balance, s_players.length, uint256(s_AstroSpinState) ); } s_AstroSpinState = AstroSpinState.CALCULATING; uint256 fee = entropy.getFee(entropyProvider); uint64 sequenceNumber = entropy.requestWithCallback{ value: fee }( entropyProvider, userRandomNumber ); emit RequestedAstroSpinWinner(sequenceNumber); emit AstroSpinEnterRequest(sequenceNumber); } /** * @notice Callback function called by entropy provider with random number * @dev Selects winner based on weighted contributions and distributes prizes * @param sequenceNumber The sequence number of the entropy request * @param randomNumber The random number provided by entropy source */ function entropyCallback( uint64 sequenceNumber, address, bytes32 randomNumber ) internal override { delete s_recentWinner; uint256 totalContributions = 0; for (uint256 i = 0; i < s_players.length; i++) { totalContributions += contributions[s_players[i]]; } require(totalContributions > 0, "Total contributions must be positive"); uint256 winningThreshold = uint256(randomNumber) % totalContributions; uint256 cumulativeContribution = 0; address payable recentWinner = payable(address(0)); for (uint256 i = 0; i < s_players.length; i++) { cumulativeContribution += contributions[s_players[i]]; if (winningThreshold < cumulativeContribution) { recentWinner = s_players[i]; break; } } uint256 pool = address(this).balance - feePool; uint256 prizes; uint256 treasuryAmount; // Check if winner's contribution is greater than potential prize uint256 potentialPrize = (pool * 80) / 100; if (contributions[recentWinner] > potentialPrize) { // If winner would get less than their contribution, give them the full pool prizes = pool; treasuryAmount = 0; } else { // Otherwise proceed with normal 80/20 split prizes = potentialPrize; treasuryAmount = (pool * 20) / 100; } // Transfer prize directly to winner (bool prizeSuccess, ) = recentWinner.call{ value: prizes }(""); require(prizeSuccess, "Prize transfer failed"); // Transfer treasury amount to treasury wallet if any if (treasuryAmount > 0) { (bool treasurySuccess, ) = treasuryWallet.call{ value: treasuryAmount }(""); require(treasurySuccess, "Treasury transfer failed"); } s_recentWinner.push(recentWinner); emit WinnerPicked(recentWinner, prizes, contributions[recentWinner]); emit AstroSpinResult(sequenceNumber); // Reset for next AstroSpin for (uint256 i = 0; i < s_players.length; i++) { address player = s_players[i]; contributions[player] = 0; isPlayerEntered[player] = false; } roundCount++; s_AstroSpinState = AstroSpinState.OPEN; s_players = new address payable[](0); s_lastTimeStamp = block.timestamp; } function getContractBalance() public view returns (uint256) { return address(this).balance; } function getBalanceWithoutPlatformFund() public view returns (uint256) { if (feePool > address(this).balance) { return 0; } uint256 totalDeductions = address(this).balance - feePool; return totalDeductions; } function getAstroSpinState() public view returns (AstroSpinState) { return s_AstroSpinState; } function getMinEntranceFee() public view returns (uint256) { return i_minEntranceFee; } function getPlayer(uint256 index) public view returns (address) { return s_players[index]; } function getAllPlayers() public view returns (address payable[] memory) { return s_players; } function getRecentWinners() public view returns (address payable[] memory) { return s_recentWinner; } function getLastTimeStamp() public view returns (uint256) { return s_lastTimeStamp; } function getNumberOfPlayers() public view returns (uint256) { return s_players.length; } function getRoundCount() public view returns (uint256) { return roundCount; } function getFeePool() public view returns (uint256) { return feePool; } function transferFeeFunds(address payable _to) public onlyOwner { require(_to != address(0), "Invalid address"); require(feePool > 0, "No funds to transfer"); uint256 amountToTransfer = feePool; feePool = 0; // Reset before transfer to prevent reentrancy (bool success, ) = _to.call{ value: amountToTransfer }(""); require(success, "Transfer failed"); } function getPlayerContributionsPercentages() public view returns (address[] memory, uint256[] memory, uint256[] memory) { address[] memory players = new address[](s_players.length); uint256[] memory percentages = new uint256[](s_players.length); uint256[] memory contributionsArray = new uint256[](s_players.length); uint256 total = 0; // Calculate total contributions for (uint256 i = 0; i < s_players.length; i++) { total += contributions[s_players[i]]; } // Calculate each player's percentage of total contributions and get their contribution for (uint256 i = 0; i < s_players.length; i++) { players[i] = s_players[i]; contributionsArray[i] = contributions[s_players[i]]; // Store individual contributions if (total > 0) { percentages[i] = (contributions[s_players[i]] * 100) / total; } else { percentages[i] = 0; } } return (players, percentages, contributionsArray); } // Function to update the entrance fee function updateEntranceFee(uint256 _newMinEntranceFee) external onlyOwner { i_minEntranceFee = _newMinEntranceFee; } function setTreasury(address payable _newTreasury) public onlyOwner { require( _newTreasury != address(0), "New treasury cannot be the zero address" ); treasuryWallet = _newTreasury; emit TreasuryChanged(_newTreasury); } function refundAllParticipants() external onlyOwner nonReentrant { require(s_players.length > 0, "No players to refund"); // Store length since we'll modify the array uint256 playerCount = s_players.length; // Track refund amount for validation uint256 totalRefunded = 0; // Process refunds for (uint256 i = 0; i < playerCount; i++) { address payable player = s_players[i]; uint256 playerContribution = contributions[player]; if (playerContribution > 0) { // Update state before transfer to prevent reentrancy uint256 amountToRefund = playerContribution; contributions[player] = 0; isPlayerEntered[player] = false; // Process refund (bool success, ) = player.call{ value: amountToRefund }(""); require(success, "Refund transfer failed"); totalRefunded += amountToRefund; emit RefundProcessed(player, amountToRefund); } } // Reset contract state s_AstroSpinState = AstroSpinState.OPEN; s_players = new address payable[](0); emit RefundCompleted(playerCount, totalRefunded); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../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. * * By default, the owner account will be the one that deploys the contract. 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; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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 v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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 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; 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 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // 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 v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @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. } }
// SPDX-License-Identifier: Apache 2 pragma solidity ^0.8.0; import "./EntropyEvents.sol"; interface IEntropy is EntropyEvents { // Register msg.sender as a randomness provider. The arguments are the provider's configuration parameters // and initial commitment. Re-registering the same provider rotates the provider's commitment (and updates // the feeInWei). // // chainLength is the number of values in the hash chain *including* the commitment, that is, chainLength >= 1. function register( uint128 feeInWei, bytes32 commitment, bytes calldata commitmentMetadata, uint64 chainLength, bytes calldata uri ) external; // Withdraw a portion of the accumulated fees for the provider msg.sender. // Calling this function will transfer `amount` wei to the caller (provided that they have accrued a sufficient // balance of fees in the contract). function withdraw(uint128 amount) external; // Withdraw a portion of the accumulated fees for provider. The msg.sender must be the fee manager for this provider. // Calling this function will transfer `amount` wei to the caller (provided that they have accrued a sufficient // balance of fees in the contract). function withdrawAsFeeManager(address provider, uint128 amount) external; // As a user, request a random number from `provider`. Prior to calling this method, the user should // generate a random number x and keep it secret. The user should then compute hash(x) and pass that // as the userCommitment argument. (You may call the constructUserCommitment method to compute the hash.) // // This method returns a sequence number. The user should pass this sequence number to // their chosen provider (the exact method for doing so will depend on the provider) to retrieve the provider's // number. The user should then call fulfillRequest to construct the final random number. // // This method will revert unless the caller provides a sufficient fee (at least getFee(provider)) as msg.value. // Note that excess value is *not* refunded to the caller. function request( address provider, bytes32 userCommitment, bool useBlockHash ) external payable returns (uint64 assignedSequenceNumber); // Request a random number. The method expects the provider address and a secret random number // in the arguments. It returns a sequence number. // // The address calling this function should be a contract that inherits from the IEntropyConsumer interface. // The `entropyCallback` method on that interface will receive a callback with the generated random number. // // This method will revert unless the caller provides a sufficient fee (at least getFee(provider)) as msg.value. // Note that excess value is *not* refunded to the caller. function requestWithCallback( address provider, bytes32 userRandomNumber ) external payable returns (uint64 assignedSequenceNumber); // Fulfill a request for a random number. This method validates the provided userRandomness and provider's proof // against the corresponding commitments in the in-flight request. If both values are validated, this function returns // the corresponding random number. // // Note that this function can only be called once per in-flight request. Calling this function deletes the stored // request information (so that the contract doesn't use a linear amount of storage in the number of requests). // If you need to use the returned random number more than once, you are responsible for storing it. function reveal( address provider, uint64 sequenceNumber, bytes32 userRevelation, bytes32 providerRevelation ) external returns (bytes32 randomNumber); // Fulfill a request for a random number. This method validates the provided userRandomness // and provider's revelation against the corresponding commitment in the in-flight request. If both values are validated // and the requestor address is a contract address, this function calls the requester's entropyCallback method with the // sequence number, provider address and the random number as arguments. Else if the requestor is an EOA, it won't call it. // // Note that this function can only be called once per in-flight request. Calling this function deletes the stored // request information (so that the contract doesn't use a linear amount of storage in the number of requests). // If you need to use the returned random number more than once, you are responsible for storing it. // // Anyone can call this method to fulfill a request, but the callback will only be made to the original requester. function revealWithCallback( address provider, uint64 sequenceNumber, bytes32 userRandomNumber, bytes32 providerRevelation ) external; function getProviderInfo( address provider ) external view returns (EntropyStructs.ProviderInfo memory info); function getDefaultProvider() external view returns (address provider); function getRequest( address provider, uint64 sequenceNumber ) external view returns (EntropyStructs.Request memory req); function getFee(address provider) external view returns (uint128 feeAmount); function getAccruedPythFees() external view returns (uint128 accruedPythFeesInWei); function setProviderFee(uint128 newFeeInWei) external; function setProviderFeeAsFeeManager( address provider, uint128 newFeeInWei ) external; function setProviderUri(bytes calldata newUri) external; // Set manager as the fee manager for the provider msg.sender. // After calling this function, manager will be able to set the provider's fees and withdraw them. // Only one address can be the fee manager for a provider at a time -- calling this function again with a new value // will override the previous value. Call this function with the all-zero address to disable the fee manager role. function setFeeManager(address manager) external; function constructUserCommitment( bytes32 userRandomness ) external pure returns (bytes32 userCommitment); function combineRandomValues( bytes32 userRandomness, bytes32 providerRandomness, bytes32 blockHash ) external pure returns (bytes32 combinedRandomness); }
// SPDX-License-Identifier: Apache 2 pragma solidity ^0.8.0; abstract contract IEntropyConsumer { // This method is called by Entropy to provide the random number to the consumer. // It asserts that the msg.sender is the Entropy contract. It is not meant to be // override by the consumer. function _entropyCallback( uint64 sequence, address provider, bytes32 randomNumber ) external { address entropy = getEntropy(); require(entropy != address(0), "Entropy address not set"); require(msg.sender == entropy, "Only Entropy can call this function"); entropyCallback(sequence, provider, randomNumber); } // getEntropy returns Entropy contract address. The method is being used to check that the // callback is indeed from Entropy contract. The consumer is expected to implement this method. // Entropy address can be found here - https://docs.pyth.network/entropy/contract-addresses function getEntropy() internal view virtual returns (address); // This method is expected to be implemented by the consumer to handle the random number. // It will be called by _entropyCallback after _entropyCallback ensures that the call is // indeed from Entropy contract. function entropyCallback( uint64 sequence, address provider, bytes32 randomNumber ) internal virtual; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"minEntranceFee","type":"uint256"},{"internalType":"address payable","name":"_treasuryWallet","type":"address"},{"internalType":"address","name":"_entropy","type":"address"},{"internalType":"address","name":"_entropyProvider","type":"address"},{"internalType":"address","name":"_caller","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"currentBalance","type":"uint256"},{"internalType":"uint256","name":"numPlayers","type":"uint256"},{"internalType":"uint256","name":"astroSpinState","type":"uint256"}],"name":"AstroSpin__UpkeepNotNeeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AstroSpinEnter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"AstroSpinEnterRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"AstroSpinEnterResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"sequenceNumber","type":"uint64"}],"name":"AstroSpinResult","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":"uint256","name":"playerCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"RefundCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundProcessed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"RequestedAstroSpinWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTotal","type":"uint256"}],"name":"SpecialWalletPoolFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"prize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"contribution","type":"uint256"}],"name":"WinnerPicked","type":"event"},{"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":"astroSpinFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"caller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enterAstroSpin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPlayers","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAstroSpinFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAstroSpinState","outputs":[{"internalType":"enum AstroSpin.AstroSpinState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceWithoutPlatformFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFlipFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinEntranceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfPlayers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPlayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlayerContributionsPercentages","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRecentWinners","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoundCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"i_minEntranceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPlayerEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"userRandomNumber","type":"bytes32"}],"name":"performUpkeep","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"refundAllParticipants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roundCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"s_players","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"s_recentWinner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeMultiplier","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newCaller","type":"address"}],"name":"setUpkeepCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"toggleFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"transferFeeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinEntranceFee","type":"uint256"}],"name":"updateEntranceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526006805460ff60a01b1916600160a01b1790556000600b553480156200002957600080fd5b506040516200227f3803806200227f8339810160408190526200004c9162000128565b6200005733620000bf565b60018055600494909455600d8054600680546001600160a01b03199081166001600160a01b03978816179091556002805482169587169590951790945560038054909416928516929092179092556001600160a81b031916929091169190911790556200019c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200012557600080fd5b50565b600080600080600060a086880312156200014157600080fd5b85519450602086015162000155816200010f565b604087015190945062000168816200010f565b60608701519093506200017b816200010f565b60808701519092506200018e816200010f565b809150509295509295909350565b6120d380620001ac6000396000f3fe6080604052600436106102295760003560e01c8063868e4c6111610123578063e2a6b148116100ab578063f077b9741161006f578063f077b974146105fe578063f0f4426014610613578063f2fde38b14610633578063fc9c8d3914610653578063fd6673f51461067357600080fd5b8063e2a6b14814610567578063e55ae4e814610587578063e7249616146105a7578063ee786355146105c7578063efa1c482146105dc57600080fd5b8063ae2e933b116100f2578063ae2e933b146104c5578063ae771f6b146104db578063c1c244e8146104fb578063d604e29b14610510578063df66a8361461054057600080fd5b8063868e4c61146104435780638da5cb5b14610463578063a1e9b51114610481578063a771ebc71461049457600080fd5b80634edbf60a116101b1578063715018a611610175578063715018a6146103cd57806377ec0f9a146103e257806378270f7c146103f85780637d346f721461040d5780637f1fce781461042357600080fd5b80634edbf60a1461034157806352a5f1f81461036557806369fe0e2d146103855780636de7da78146103a55780636f9fb98a146103ba57600080fd5b80633b35c517116101f85780633b35c517146102925780634244b0da146102a757806342aaa9e4146102c757806342e94c90146102dc5780634626402b1461030957600080fd5b8063046596fa14610235578063127f0b3f1461023f57806325f2277514610268578063385160641461027d57600080fd5b3661023057005b600080fd5b61023d610688565b005b34801561024b57600080fd5b50610255600b5481565b6040519081526020015b60405180910390f35b34801561027457600080fd5b50610255610860565b34801561028957600080fd5b50600754610255565b34801561029e57600080fd5b50600454610255565b3480156102b357600080fd5b5061023d6102c2366004611d73565b6108e3565b3480156102d357600080fd5b506102556108f0565b3480156102e857600080fd5b506102556102f7366004611da1565b600c6020526000908152604090205481565b34801561031557600080fd5b50600654610329906001600160a01b031681565b6040516001600160a01b03909116815260200161025f565b34801561034d57600080fd5b50610356610918565b60405161025f93929190611e00565b34801561037157600080fd5b5061023d610380366004611e8b565b610bee565b34801561039157600080fd5b5061023d6103a0366004611d73565b610ccf565b3480156103b157600080fd5b50600b54610255565b3480156103c657600080fd5b5047610255565b3480156103d957600080fd5b5061023d610dc9565b3480156103ee57600080fd5b5061025560045481565b34801561040457600080fd5b50600854610255565b34801561041957600080fd5b5061025560085481565b34801561042f57600080fd5b5061023d61043e366004611da1565b610ddd565b34801561044f57600080fd5b5061023d61045e366004611ecc565b610e67565b34801561046f57600080fd5b506000546001600160a01b0316610329565b61023d61048f366004611d73565b610e8d565b3480156104a057600080fd5b506006546104b590600160a01b900460ff1681565b604051901515815260200161025f565b3480156104d157600080fd5b5061025560075481565b3480156104e757600080fd5b506103296104f6366004611d73565b611141565b34801561050757600080fd5b50600e54610255565b34801561051c57600080fd5b506104b561052b366004611da1565b600a6020526000908152604090205460ff1681565b34801561054c57600080fd5b50600d54600160a01b900460ff1660405161025f9190611f04565b34801561057357600080fd5b50610329610582366004611d73565b61116b565b34801561059357600080fd5b506103296105a2366004611d73565b61117b565b3480156105b357600080fd5b5061023d6105c2366004611da1565b6111ab565b3480156105d357600080fd5b5061023d6112e6565b3480156105e857600080fd5b506105f1611520565b60405161025f9190611f2c565b34801561060a57600080fd5b506105f1611582565b34801561061f57600080fd5b5061023d61062e366004611da1565b6115e2565b34801561063f57600080fd5b5061023d61064e366004611da1565b61169a565b34801561065f57600080fd5b50600d54610329906001600160a01b031681565b34801561067f57600080fd5b50600554610255565b6000600d54600160a01b900460ff1660018111156106a8576106a8611eee565b146106ef5760405162461bcd60e51b815260206004820152601260248201527120b9ba3937a9b834b72fafa737ba27b832b760711b60448201526064015b60405180910390fd5b600654600090600160a01b900460ff1661070a57600061070e565b6008545b905080600760008282546107229190611f8f565b90915550506004543410156107795760405162461bcd60e51b815260206004820152601760248201527f417374726f5370696e5f5f4e6f74456e6f75676845746800000000000000000060448201526064016106e6565b6107838134611fa2565b336000908152600c6020526040812080549091906107a2908490611f8f565b9091555050336000908152600a602052604090205460ff16610819576005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b031916339081179091556000908152600a60205260409020805460ff191690911790555b336000818152600c60209081526040918290205491519182527f54c1120c1b252c0b6ef35a1b86ebb8365d71cac345475d39526567501e7dc0b9910160405180910390a250565b600254600354604051631711922960e31b81526001600160a01b039182166004820152600092919091169063b88c914890602401602060405180830381865afa1580156108b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d59190611fb5565b6001600160801b0316905090565b6108eb611713565b600455565b60004760075411156109025750600090565b6000600754476109129190611fa2565b92915050565b6060806060600060058054905067ffffffffffffffff81111561093d5761093d611fde565b604051908082528060200260200182016040528015610966578160200160208202803683370190505b5060055490915060009067ffffffffffffffff81111561098857610988611fde565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5060055490915060009067ffffffffffffffff8111156109d3576109d3611fde565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b5090506000805b600554811015610a6757600c600060058381548110610a2457610a24611ff4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610a539083611f8f565b915080610a5f8161200a565b915050610a03565b5060005b600554811015610be15760058181548110610a8857610a88611ff4565b9060005260206000200160009054906101000a90046001600160a01b0316858281518110610ab857610ab8611ff4565b60200260200101906001600160a01b031690816001600160a01b031681525050600c600060058381548110610aef57610aef611ff4565b60009182526020808320909101546001600160a01b031683528201929092526040019020548351849083908110610b2857610b28611ff4565b60209081029190910101528115610bae5781600c600060058481548110610b5157610b51611ff4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610b81906064612023565b610b8b9190612058565b848281518110610b9d57610b9d611ff4565b602002602001018181525050610bcf565b6000848281518110610bc257610bc2611ff4565b6020026020010181815250505b80610bd98161200a565b915050610a6b565b5092969195509350915050565b6000610c026002546001600160a01b031690565b90506001600160a01b038116610c5a5760405162461bcd60e51b815260206004820152601760248201527f456e74726f70792061646472657373206e6f742073657400000000000000000060448201526064016106e6565b336001600160a01b03821614610cbe5760405162461bcd60e51b815260206004820152602360248201527f4f6e6c7920456e74726f70792063616e2063616c6c20746869732066756e637460448201526234b7b760e91b60648201526084016106e6565b610cc984848461176d565b50505050565b610cd7611713565b60008111610d385760405162461bcd60e51b815260206004820152602860248201527f466565206d756c7469706c696572206d7573742062652067726561746572207460448201526768616e207a65726f60c01b60648201526084016106e6565b600254600354604051631711922960e31b81526001600160a01b039182166004820152600092919091169063b88c914890602401602060405180830381865afa158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad9190611fb5565b6001600160801b03169050610dc28282612023565b6008555050565b610dd1611713565b610ddb6000611c36565b565b610de5611713565b6001600160a01b038116610e455760405162461bcd60e51b815260206004820152602160248201527f4e65772063616c6c65722063616e6e6f74206265207a65726f206164647265736044820152607360f81b60648201526084016106e6565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610e6f611713565b60068054911515600160a01b0260ff60a01b19909216919091179055565b600d546001600160a01b0316331480610eb057506000546001600160a01b031633145b610f145760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c79207468652063616c6c6572206f72206f776e65722063616e2063616c60448201526e36103a3434b990333ab731ba34b7b760891b60648201526084016106e6565b600d54600090600160a01b900460ff166001811115610f3557610f35611eee565b6005549015915047151590600211156000838015610f505750825b8015610f595750815b905080610fad57600554600d54479190600160a01b900460ff166001811115610f8457610f84611eee565b60405162bf9ea560e61b81526004810193909352602483019190915260448201526064016106e6565b600d8054600160a01b60ff60a01b19909116179055600254600354604051631711922960e31b81526001600160a01b039182166004820152600092919091169063b88c914890602401602060405180830381865afa158015611013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110379190611fb5565b6002546003546040516319cb825f60e01b81526001600160a01b039182166004820152602481018a90526001600160801b039390931693506000929116906319cb825f90849060440160206040518083038185885af115801561109e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110c3919061206c565b60405190915067ffffffffffffffff8216907f5beb2af3b50debed400e3605ba22bb501038c089d951d7fa560cf94db564ddb890600090a260405167ffffffffffffffff821681527f7f45e714f78c137943988efd3188c92c586458180c00f18f5ac76b00bbd256d29060200160405180910390a150505050505050565b6005818154811061115157600080fd5b6000918252602090912001546001600160a01b0316905081565b6009818154811061115157600080fd5b60006005828154811061119057611190611ff4565b6000918252602090912001546001600160a01b031692915050565b6111b3611713565b6001600160a01b0381166111fb5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016106e6565b6000600754116112445760405162461bcd60e51b8152602060048201526014602482015273273790333ab73239903a37903a3930b739b332b960611b60448201526064016106e6565b600780546000918290556040519091906001600160a01b0384169083908381818185875af1925050503d8060008114611299576040519150601f19603f3d011682016040523d82523d6000602084013e61129e565b606091505b50509050806112e15760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016106e6565b505050565b6112ee611713565b6112f6611c86565b60055461133c5760405162461bcd60e51b8152602060048201526014602482015273139bc81c1b185e595c9cc81d1bc81c99599d5b9960621b60448201526064016106e6565b6005546000805b828110156114b05760006005828154811061136057611360611ff4565b60009182526020808320909101546001600160a01b0316808352600c909152604090912054909150801561149b576001600160a01b0382166000818152600c60209081526040808320839055600a909152808220805460ff191690555183929083908381818185875af1925050503d80600081146113fa576040519150601f19603f3d011682016040523d82523d6000602084013e6113ff565b606091505b50509050806114495760405162461bcd60e51b81526020600482015260166024820152751499599d5b99081d1c985b9cd9995c8819985a5b195960521b60448201526064016106e6565b6114538287611f8f565b9550836001600160a01b03167f3367befd2b2f39615cd79917c2153263c4af1d3945ec003e5d5bfc13a8d858338360405161149091815260200190565b60405180910390a250505b505080806114a89061200a565b915050611343565b50600d805460ff60a01b1916905560408051600081526020810191829052516114db91600591611cdf565b5060408051838152602081018390527f9f97ef2400be5b14e0697468c831e96e59bb11d1872740c533add66e3521537d910160405180910390a15050610ddb60018055565b6060600580548060200260200160405190810160405280929190818152602001828054801561157857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161155a575b5050505050905090565b60606009805480602002602001604051908101604052809291908181526020018280548015611578576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161155a575050505050905090565b6115ea611713565b6001600160a01b0381166116505760405162461bcd60e51b815260206004820152602760248201527f4e65772074726561737572792063616e6e6f7420626520746865207a65726f206044820152666164647265737360c81b60648201526084016106e6565b600680546001600160a01b0319166001600160a01b0383169081179091556040517fc714d22a2f08b695f81e7c707058db484aa5b4d6b4c9fd64beb10fe85832f60890600090a250565b6116a2611713565b6001600160a01b0381166117075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e6565b61171081611c36565b50565b6000546001600160a01b03163314610ddb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e6565b61177960096000611d44565b6000805b6005548110156117e157600c60006005838154811061179e5761179e611ff4565b60009182526020808320909101546001600160a01b031683528201929092526040019020546117cd9083611f8f565b9150806117d98161200a565b91505061177d565b506000811161183e5760405162461bcd60e51b8152602060048201526024808201527f546f74616c20636f6e747269627574696f6e73206d75737420626520706f73696044820152637469766560e01b60648201526084016106e6565b600061184a8284612089565b905060008060005b6005548110156118ed57600c60006005838154811061187357611873611ff4565b60009182526020808320909101546001600160a01b031683528201929092526040019020546118a29084611f8f565b9250828410156118db57600581815481106118bf576118bf611ff4565b6000918252602090912001546001600160a01b031691506118ed565b806118e58161200a565b915050611852565b506000600754476118fe9190611fa2565b9050600080806064611911856050612023565b61191b9190612058565b6001600160a01b0386166000908152600c602052604090205490915081101561194a5783925060009150611967565b915081606461195a856014612023565b6119649190612058565b91505b6000856001600160a01b03168460405160006040518083038185875af1925050503d80600081146119b4576040519150601f19603f3d011682016040523d82523d6000602084013e6119b9565b606091505b5050905080611a025760405162461bcd60e51b8152602060048201526015602482015274141c9a5e99481d1c985b9cd9995c8819985a5b1959605a1b60448201526064016106e6565b8215611aad576006546040516000916001600160a01b03169085908381818185875af1925050503d8060008114611a55576040519150601f19603f3d011682016040523d82523d6000602084013e611a5a565b606091505b5050905080611aab5760405162461bcd60e51b815260206004820152601860248201527f5472656173757279207472616e73666572206661696c6564000000000000000060448201526064016106e6565b505b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319166001600160a01b0388169081179091556000818152600c6020908152604091829020548251888152918201527f7e57d825a2478cc8123a008d7d1e20c0f6e8cbca89a7bc100c9b05ecb3698deb910160405180910390a260405167ffffffffffffffff8d1681527ffdd45ca0b53cc67af770583f046be250f4ed6e8fa7412fa42ca5565ba08051f59060200160405180910390a160005b600554811015611be357600060058281548110611b9c57611b9c611ff4565b60009182526020808320909101546001600160a01b03168252600c81526040808320839055600a9091529020805460ff191690555080611bdb8161200a565b915050611b7d565b50600b8054906000611bf48361200a565b9091555050600d805460ff60a01b191690556040805160008152602081019182905251611c2391600591611cdf565b505042600e555050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403611cd85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106e6565b6002600155565b828054828255906000526020600020908101928215611d34579160200282015b82811115611d3457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cff565b50611d40929150611d5e565b5090565b508054600082559060005260206000209081019061171091905b5b80821115611d405760008155600101611d5f565b600060208284031215611d8557600080fd5b5035919050565b6001600160a01b038116811461171057600080fd5b600060208284031215611db357600080fd5b8135611dbe81611d8c565b9392505050565b600081518084526020808501945080840160005b83811015611df557815187529582019590820190600101611dd9565b509495945050505050565b606080825284519082018190526000906020906080840190828801845b82811015611e425781516001600160a01b031684529284019290840190600101611e1d565b50505083810382850152611e568187611dc5565b9150508281036040840152611e6b8185611dc5565b9695505050505050565b67ffffffffffffffff8116811461171057600080fd5b600080600060608486031215611ea057600080fd5b8335611eab81611e75565b92506020840135611ebb81611d8c565b929592945050506040919091013590565b600060208284031215611ede57600080fd5b81358015158114611dbe57600080fd5b634e487b7160e01b600052602160045260246000fd5b6020810160028310611f2657634e487b7160e01b600052602160045260246000fd5b91905290565b6020808252825182820181905260009190848201906040850190845b81811015611f6d5783516001600160a01b031683529284019291840191600101611f48565b50909695505050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561091257610912611f79565b8181038181111561091257610912611f79565b600060208284031215611fc757600080fd5b81516001600160801b0381168114611dbe57600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161201c5761201c611f79565b5060010190565b600081600019048311821515161561203d5761203d611f79565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261206757612067612042565b500490565b60006020828403121561207e57600080fd5b8151611dbe81611e75565b60008261209857612098612042565b50069056fea264697066735822122053bcde1c9d6ffb8966a188966c6e388ca0c079ab81ffcf4f76251ad13669ca5a64736f6c63430008100033000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000007c817d793715baaee120624e6ce499b29aa105ac00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e32000000000000000000000000052deaa1c84233f7bb8c8a45baede41091c6165060000000000000000000000005df4707980440d7beb2ad83dfa0321889fb27aed
Deployed Bytecode
0x6080604052600436106102295760003560e01c8063868e4c6111610123578063e2a6b148116100ab578063f077b9741161006f578063f077b974146105fe578063f0f4426014610613578063f2fde38b14610633578063fc9c8d3914610653578063fd6673f51461067357600080fd5b8063e2a6b14814610567578063e55ae4e814610587578063e7249616146105a7578063ee786355146105c7578063efa1c482146105dc57600080fd5b8063ae2e933b116100f2578063ae2e933b146104c5578063ae771f6b146104db578063c1c244e8146104fb578063d604e29b14610510578063df66a8361461054057600080fd5b8063868e4c61146104435780638da5cb5b14610463578063a1e9b51114610481578063a771ebc71461049457600080fd5b80634edbf60a116101b1578063715018a611610175578063715018a6146103cd57806377ec0f9a146103e257806378270f7c146103f85780637d346f721461040d5780637f1fce781461042357600080fd5b80634edbf60a1461034157806352a5f1f81461036557806369fe0e2d146103855780636de7da78146103a55780636f9fb98a146103ba57600080fd5b80633b35c517116101f85780633b35c517146102925780634244b0da146102a757806342aaa9e4146102c757806342e94c90146102dc5780634626402b1461030957600080fd5b8063046596fa14610235578063127f0b3f1461023f57806325f2277514610268578063385160641461027d57600080fd5b3661023057005b600080fd5b61023d610688565b005b34801561024b57600080fd5b50610255600b5481565b6040519081526020015b60405180910390f35b34801561027457600080fd5b50610255610860565b34801561028957600080fd5b50600754610255565b34801561029e57600080fd5b50600454610255565b3480156102b357600080fd5b5061023d6102c2366004611d73565b6108e3565b3480156102d357600080fd5b506102556108f0565b3480156102e857600080fd5b506102556102f7366004611da1565b600c6020526000908152604090205481565b34801561031557600080fd5b50600654610329906001600160a01b031681565b6040516001600160a01b03909116815260200161025f565b34801561034d57600080fd5b50610356610918565b60405161025f93929190611e00565b34801561037157600080fd5b5061023d610380366004611e8b565b610bee565b34801561039157600080fd5b5061023d6103a0366004611d73565b610ccf565b3480156103b157600080fd5b50600b54610255565b3480156103c657600080fd5b5047610255565b3480156103d957600080fd5b5061023d610dc9565b3480156103ee57600080fd5b5061025560045481565b34801561040457600080fd5b50600854610255565b34801561041957600080fd5b5061025560085481565b34801561042f57600080fd5b5061023d61043e366004611da1565b610ddd565b34801561044f57600080fd5b5061023d61045e366004611ecc565b610e67565b34801561046f57600080fd5b506000546001600160a01b0316610329565b61023d61048f366004611d73565b610e8d565b3480156104a057600080fd5b506006546104b590600160a01b900460ff1681565b604051901515815260200161025f565b3480156104d157600080fd5b5061025560075481565b3480156104e757600080fd5b506103296104f6366004611d73565b611141565b34801561050757600080fd5b50600e54610255565b34801561051c57600080fd5b506104b561052b366004611da1565b600a6020526000908152604090205460ff1681565b34801561054c57600080fd5b50600d54600160a01b900460ff1660405161025f9190611f04565b34801561057357600080fd5b50610329610582366004611d73565b61116b565b34801561059357600080fd5b506103296105a2366004611d73565b61117b565b3480156105b357600080fd5b5061023d6105c2366004611da1565b6111ab565b3480156105d357600080fd5b5061023d6112e6565b3480156105e857600080fd5b506105f1611520565b60405161025f9190611f2c565b34801561060a57600080fd5b506105f1611582565b34801561061f57600080fd5b5061023d61062e366004611da1565b6115e2565b34801561063f57600080fd5b5061023d61064e366004611da1565b61169a565b34801561065f57600080fd5b50600d54610329906001600160a01b031681565b34801561067f57600080fd5b50600554610255565b6000600d54600160a01b900460ff1660018111156106a8576106a8611eee565b146106ef5760405162461bcd60e51b815260206004820152601260248201527120b9ba3937a9b834b72fafa737ba27b832b760711b60448201526064015b60405180910390fd5b600654600090600160a01b900460ff1661070a57600061070e565b6008545b905080600760008282546107229190611f8f565b90915550506004543410156107795760405162461bcd60e51b815260206004820152601760248201527f417374726f5370696e5f5f4e6f74456e6f75676845746800000000000000000060448201526064016106e6565b6107838134611fa2565b336000908152600c6020526040812080549091906107a2908490611f8f565b9091555050336000908152600a602052604090205460ff16610819576005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b031916339081179091556000908152600a60205260409020805460ff191690911790555b336000818152600c60209081526040918290205491519182527f54c1120c1b252c0b6ef35a1b86ebb8365d71cac345475d39526567501e7dc0b9910160405180910390a250565b600254600354604051631711922960e31b81526001600160a01b039182166004820152600092919091169063b88c914890602401602060405180830381865afa1580156108b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d59190611fb5565b6001600160801b0316905090565b6108eb611713565b600455565b60004760075411156109025750600090565b6000600754476109129190611fa2565b92915050565b6060806060600060058054905067ffffffffffffffff81111561093d5761093d611fde565b604051908082528060200260200182016040528015610966578160200160208202803683370190505b5060055490915060009067ffffffffffffffff81111561098857610988611fde565b6040519080825280602002602001820160405280156109b1578160200160208202803683370190505b5060055490915060009067ffffffffffffffff8111156109d3576109d3611fde565b6040519080825280602002602001820160405280156109fc578160200160208202803683370190505b5090506000805b600554811015610a6757600c600060058381548110610a2457610a24611ff4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610a539083611f8f565b915080610a5f8161200a565b915050610a03565b5060005b600554811015610be15760058181548110610a8857610a88611ff4565b9060005260206000200160009054906101000a90046001600160a01b0316858281518110610ab857610ab8611ff4565b60200260200101906001600160a01b031690816001600160a01b031681525050600c600060058381548110610aef57610aef611ff4565b60009182526020808320909101546001600160a01b031683528201929092526040019020548351849083908110610b2857610b28611ff4565b60209081029190910101528115610bae5781600c600060058481548110610b5157610b51611ff4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610b81906064612023565b610b8b9190612058565b848281518110610b9d57610b9d611ff4565b602002602001018181525050610bcf565b6000848281518110610bc257610bc2611ff4565b6020026020010181815250505b80610bd98161200a565b915050610a6b565b5092969195509350915050565b6000610c026002546001600160a01b031690565b90506001600160a01b038116610c5a5760405162461bcd60e51b815260206004820152601760248201527f456e74726f70792061646472657373206e6f742073657400000000000000000060448201526064016106e6565b336001600160a01b03821614610cbe5760405162461bcd60e51b815260206004820152602360248201527f4f6e6c7920456e74726f70792063616e2063616c6c20746869732066756e637460448201526234b7b760e91b60648201526084016106e6565b610cc984848461176d565b50505050565b610cd7611713565b60008111610d385760405162461bcd60e51b815260206004820152602860248201527f466565206d756c7469706c696572206d7573742062652067726561746572207460448201526768616e207a65726f60c01b60648201526084016106e6565b600254600354604051631711922960e31b81526001600160a01b039182166004820152600092919091169063b88c914890602401602060405180830381865afa158015610d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dad9190611fb5565b6001600160801b03169050610dc28282612023565b6008555050565b610dd1611713565b610ddb6000611c36565b565b610de5611713565b6001600160a01b038116610e455760405162461bcd60e51b815260206004820152602160248201527f4e65772063616c6c65722063616e6e6f74206265207a65726f206164647265736044820152607360f81b60648201526084016106e6565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610e6f611713565b60068054911515600160a01b0260ff60a01b19909216919091179055565b600d546001600160a01b0316331480610eb057506000546001600160a01b031633145b610f145760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c79207468652063616c6c6572206f72206f776e65722063616e2063616c60448201526e36103a3434b990333ab731ba34b7b760891b60648201526084016106e6565b600d54600090600160a01b900460ff166001811115610f3557610f35611eee565b6005549015915047151590600211156000838015610f505750825b8015610f595750815b905080610fad57600554600d54479190600160a01b900460ff166001811115610f8457610f84611eee565b60405162bf9ea560e61b81526004810193909352602483019190915260448201526064016106e6565b600d8054600160a01b60ff60a01b19909116179055600254600354604051631711922960e31b81526001600160a01b039182166004820152600092919091169063b88c914890602401602060405180830381865afa158015611013573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110379190611fb5565b6002546003546040516319cb825f60e01b81526001600160a01b039182166004820152602481018a90526001600160801b039390931693506000929116906319cb825f90849060440160206040518083038185885af115801561109e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110c3919061206c565b60405190915067ffffffffffffffff8216907f5beb2af3b50debed400e3605ba22bb501038c089d951d7fa560cf94db564ddb890600090a260405167ffffffffffffffff821681527f7f45e714f78c137943988efd3188c92c586458180c00f18f5ac76b00bbd256d29060200160405180910390a150505050505050565b6005818154811061115157600080fd5b6000918252602090912001546001600160a01b0316905081565b6009818154811061115157600080fd5b60006005828154811061119057611190611ff4565b6000918252602090912001546001600160a01b031692915050565b6111b3611713565b6001600160a01b0381166111fb5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016106e6565b6000600754116112445760405162461bcd60e51b8152602060048201526014602482015273273790333ab73239903a37903a3930b739b332b960611b60448201526064016106e6565b600780546000918290556040519091906001600160a01b0384169083908381818185875af1925050503d8060008114611299576040519150601f19603f3d011682016040523d82523d6000602084013e61129e565b606091505b50509050806112e15760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016106e6565b505050565b6112ee611713565b6112f6611c86565b60055461133c5760405162461bcd60e51b8152602060048201526014602482015273139bc81c1b185e595c9cc81d1bc81c99599d5b9960621b60448201526064016106e6565b6005546000805b828110156114b05760006005828154811061136057611360611ff4565b60009182526020808320909101546001600160a01b0316808352600c909152604090912054909150801561149b576001600160a01b0382166000818152600c60209081526040808320839055600a909152808220805460ff191690555183929083908381818185875af1925050503d80600081146113fa576040519150601f19603f3d011682016040523d82523d6000602084013e6113ff565b606091505b50509050806114495760405162461bcd60e51b81526020600482015260166024820152751499599d5b99081d1c985b9cd9995c8819985a5b195960521b60448201526064016106e6565b6114538287611f8f565b9550836001600160a01b03167f3367befd2b2f39615cd79917c2153263c4af1d3945ec003e5d5bfc13a8d858338360405161149091815260200190565b60405180910390a250505b505080806114a89061200a565b915050611343565b50600d805460ff60a01b1916905560408051600081526020810191829052516114db91600591611cdf565b5060408051838152602081018390527f9f97ef2400be5b14e0697468c831e96e59bb11d1872740c533add66e3521537d910160405180910390a15050610ddb60018055565b6060600580548060200260200160405190810160405280929190818152602001828054801561157857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161155a575b5050505050905090565b60606009805480602002602001604051908101604052809291908181526020018280548015611578576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161155a575050505050905090565b6115ea611713565b6001600160a01b0381166116505760405162461bcd60e51b815260206004820152602760248201527f4e65772074726561737572792063616e6e6f7420626520746865207a65726f206044820152666164647265737360c81b60648201526084016106e6565b600680546001600160a01b0319166001600160a01b0383169081179091556040517fc714d22a2f08b695f81e7c707058db484aa5b4d6b4c9fd64beb10fe85832f60890600090a250565b6116a2611713565b6001600160a01b0381166117075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e6565b61171081611c36565b50565b6000546001600160a01b03163314610ddb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e6565b61177960096000611d44565b6000805b6005548110156117e157600c60006005838154811061179e5761179e611ff4565b60009182526020808320909101546001600160a01b031683528201929092526040019020546117cd9083611f8f565b9150806117d98161200a565b91505061177d565b506000811161183e5760405162461bcd60e51b8152602060048201526024808201527f546f74616c20636f6e747269627574696f6e73206d75737420626520706f73696044820152637469766560e01b60648201526084016106e6565b600061184a8284612089565b905060008060005b6005548110156118ed57600c60006005838154811061187357611873611ff4565b60009182526020808320909101546001600160a01b031683528201929092526040019020546118a29084611f8f565b9250828410156118db57600581815481106118bf576118bf611ff4565b6000918252602090912001546001600160a01b031691506118ed565b806118e58161200a565b915050611852565b506000600754476118fe9190611fa2565b9050600080806064611911856050612023565b61191b9190612058565b6001600160a01b0386166000908152600c602052604090205490915081101561194a5783925060009150611967565b915081606461195a856014612023565b6119649190612058565b91505b6000856001600160a01b03168460405160006040518083038185875af1925050503d80600081146119b4576040519150601f19603f3d011682016040523d82523d6000602084013e6119b9565b606091505b5050905080611a025760405162461bcd60e51b8152602060048201526015602482015274141c9a5e99481d1c985b9cd9995c8819985a5b1959605a1b60448201526064016106e6565b8215611aad576006546040516000916001600160a01b03169085908381818185875af1925050503d8060008114611a55576040519150601f19603f3d011682016040523d82523d6000602084013e611a5a565b606091505b5050905080611aab5760405162461bcd60e51b815260206004820152601860248201527f5472656173757279207472616e73666572206661696c6564000000000000000060448201526064016106e6565b505b60098054600181019091557f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319166001600160a01b0388169081179091556000818152600c6020908152604091829020548251888152918201527f7e57d825a2478cc8123a008d7d1e20c0f6e8cbca89a7bc100c9b05ecb3698deb910160405180910390a260405167ffffffffffffffff8d1681527ffdd45ca0b53cc67af770583f046be250f4ed6e8fa7412fa42ca5565ba08051f59060200160405180910390a160005b600554811015611be357600060058281548110611b9c57611b9c611ff4565b60009182526020808320909101546001600160a01b03168252600c81526040808320839055600a9091529020805460ff191690555080611bdb8161200a565b915050611b7d565b50600b8054906000611bf48361200a565b9091555050600d805460ff60a01b191690556040805160008152602081019182905251611c2391600591611cdf565b505042600e555050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403611cd85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106e6565b6002600155565b828054828255906000526020600020908101928215611d34579160200282015b82811115611d3457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cff565b50611d40929150611d5e565b5090565b508054600082559060005260206000209081019061171091905b5b80821115611d405760008155600101611d5f565b600060208284031215611d8557600080fd5b5035919050565b6001600160a01b038116811461171057600080fd5b600060208284031215611db357600080fd5b8135611dbe81611d8c565b9392505050565b600081518084526020808501945080840160005b83811015611df557815187529582019590820190600101611dd9565b509495945050505050565b606080825284519082018190526000906020906080840190828801845b82811015611e425781516001600160a01b031684529284019290840190600101611e1d565b50505083810382850152611e568187611dc5565b9150508281036040840152611e6b8185611dc5565b9695505050505050565b67ffffffffffffffff8116811461171057600080fd5b600080600060608486031215611ea057600080fd5b8335611eab81611e75565b92506020840135611ebb81611d8c565b929592945050506040919091013590565b600060208284031215611ede57600080fd5b81358015158114611dbe57600080fd5b634e487b7160e01b600052602160045260246000fd5b6020810160028310611f2657634e487b7160e01b600052602160045260246000fd5b91905290565b6020808252825182820181905260009190848201906040850190845b81811015611f6d5783516001600160a01b031683529284019291840191600101611f48565b50909695505050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561091257610912611f79565b8181038181111561091257610912611f79565b600060208284031215611fc757600080fd5b81516001600160801b0381168114611dbe57600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006001820161201c5761201c611f79565b5060010190565b600081600019048311821515161561203d5761203d611f79565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261206757612067612042565b500490565b60006020828403121561207e57600080fd5b8151611dbe81611e75565b60008261209857612098612042565b50069056fea264697066735822122053bcde1c9d6ffb8966a188966c6e388ca0c079ab81ffcf4f76251ad13669ca5a64736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000007c817d793715baaee120624e6ce499b29aa105ac00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e32000000000000000000000000052deaa1c84233f7bb8c8a45baede41091c6165060000000000000000000000005df4707980440d7beb2ad83dfa0321889fb27aed
-----Decoded View---------------
Arg [0] : minEntranceFee (uint256): 10000000000000000
Arg [1] : _treasuryWallet (address): 0x7c817d793715baAEe120624E6cE499B29aa105ac
Arg [2] : _entropy (address): 0x36825bf3Fbdf5a29E2d5148bfe7Dcf7B5639e320
Arg [3] : _entropyProvider (address): 0x52DeaA1c84233F7bb8C8A45baeDE41091c616506
Arg [4] : _caller (address): 0x5DF4707980440D7BEB2AD83dfA0321889FB27AeD
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [1] : 0000000000000000000000007c817d793715baaee120624e6ce499b29aa105ac
Arg [2] : 00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e320
Arg [3] : 00000000000000000000000052deaa1c84233f7bb8c8a45baede41091c616506
Arg [4] : 0000000000000000000000005df4707980440d7beb2ad83dfa0321889fb27aed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.