Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BurnRaffle
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-12-20 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // 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; } } // File: @chainlink/contracts/src/v0.8/automation/interfaces/AutomationCompatibleInterface.sol pragma solidity ^0.8.0; // solhint-disable-next-line interface-starts-with-i interface AutomationCompatibleInterface { /** * @notice method that is simulated by the keepers to see if any work actually * needs to be performed. This method does does not actually need to be * executable, and since it is only ever simulated it can consume lots of gas. * @dev To ensure that it is never called, you may want to add the * cannotExecute modifier from KeeperBase to your implementation of this * method. * @param checkData specified in the upkeep registration so it is always the * same for a registered upkeep. This can easily be broken down into specific * arguments using `abi.decode`, so multiple upkeeps can be registered on the * same contract and easily differentiated by the contract. * @return upkeepNeeded boolean to indicate whether the keeper should call * performUpkeep or not. * @return performData bytes that the keeper should call performUpkeep with, if * upkeep is needed. If you would like to encode data to decode later, try * `abi.encode`. */ function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); /** * @notice method that is actually executed by the keepers, via the registry. * The data returned by the checkUpkeep simulation will be passed into * this method to actually be executed. * @dev The input to this method should not be trusted, and the caller of the * method should not even be restricted to any single registry. Anyone should * be able call it, and the input should be validated, there is no guarantee * that the data passed in is the performData returned from checkUpkeep. This * could happen due to malicious keepers, racing keepers, or simply a state * change while the performUpkeep transaction is waiting for confirmation. * Always validate the data passed in. * @param performData is the data which was passed back from the checkData * simulation. If it is encoded, it can easily be decoded into other types by * calling `abi.decode`. This data should not be trusted, and should be * validated against the contract's current state. */ function performUpkeep(bytes calldata performData) external; } // File: @chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol pragma solidity ^0.8.4; // End consumer library. library VRFV2PlusClient { // extraArgs will evolve to support new features bytes4 public constant EXTRA_ARGS_V1_TAG = bytes4(keccak256("VRF ExtraArgsV1")); struct ExtraArgsV1 { bool nativePayment; } struct RandomWordsRequest { bytes32 keyHash; uint256 subId; uint16 requestConfirmations; uint32 callbackGasLimit; uint32 numWords; bytes extraArgs; } function _argsToBytes(ExtraArgsV1 memory extraArgs) internal pure returns (bytes memory bts) { return abi.encodeWithSelector(EXTRA_ARGS_V1_TAG, extraArgs); } } // File: @chainlink/contracts/src/v0.8/vrf/dev/interfaces/IVRFSubscriptionV2Plus.sol pragma solidity ^0.8.0; /// @notice The IVRFSubscriptionV2Plus interface defines the subscription /// @notice related methods implemented by the V2Plus coordinator. interface IVRFSubscriptionV2Plus { /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint256 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint256 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint256 subId, address to) external; /** * @notice Accept subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint256 subId) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint256 subId, address newOwner) external; /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription with LINK, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); * @dev Note to fund the subscription with Native, use fundSubscriptionWithNative. Be sure * @dev to send Native with the call, for example: * @dev COORDINATOR.fundSubscriptionWithNative{value: amount}(subId); */ function createSubscription() external returns (uint256 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return nativeBalance - native balance of the subscription in wei. * @return reqCount - Requests count of subscription. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription( uint256 subId ) external view returns (uint96 balance, uint96 nativeBalance, uint64 reqCount, address owner, address[] memory consumers); /* * @notice Check to see if there exists a request commitment consumers * for all consumers and keyhashes for a given sub. * @param subId - ID of the subscription * @return true if there exists at least one unfulfilled request for the subscription, false * otherwise. */ function pendingRequestExists(uint256 subId) external view returns (bool); /** * @notice Paginate through all active VRF subscriptions. * @param startIndex index of the subscription to start from * @param maxCount maximum number of subscriptions to return, 0 to return all * @dev the order of IDs in the list is **not guaranteed**, therefore, if making successive calls, one * @dev should consider keeping the blockheight constant to ensure a holistic picture of the contract state */ function getActiveSubscriptionIds(uint256 startIndex, uint256 maxCount) external view returns (uint256[] memory); /** * @notice Fund a subscription with native. * @param subId - ID of the subscription * @notice This method expects msg.value to be greater than or equal to 0. */ function fundSubscriptionWithNative(uint256 subId) external payable; } // File: @chainlink/contracts/src/v0.8/vrf/dev/interfaces/IVRFCoordinatorV2Plus.sol pragma solidity ^0.8.0; // Interface that enables consumers of VRFCoordinatorV2Plus to be future-proof for upgrades // This interface is supported by subsequent versions of VRFCoordinatorV2Plus interface IVRFCoordinatorV2Plus is IVRFSubscriptionV2Plus { /** * @notice Request a set of random words. * @param req - a struct containing following fields for randomness request: * keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * requestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * extraArgs - abi-encoded extra args * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords(VRFV2PlusClient.RandomWordsRequest calldata req) external returns (uint256 requestId); } // File: @chainlink/contracts/src/v0.8/vrf/dev/interfaces/IVRFMigratableConsumerV2Plus.sol pragma solidity ^0.8.0; /// @notice The IVRFMigratableConsumerV2Plus interface defines the /// @notice method required to be implemented by all V2Plus consumers. /// @dev This interface is designed to be used in VRFConsumerBaseV2Plus. interface IVRFMigratableConsumerV2Plus { event CoordinatorSet(address vrfCoordinator); /// @notice Sets the VRF Coordinator address /// @notice This method should only be callable by the coordinator or contract owner function setCoordinator(address vrfCoordinator) external; } // File: @chainlink/contracts/src/v0.8/shared/interfaces/IOwnable.sol pragma solidity ^0.8.0; interface IOwnable { function owner() external returns (address); function transferOwnership(address recipient) external; function acceptOwnership() external; } // File: @chainlink/contracts/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol pragma solidity ^0.8.0; /// @title The ConfirmedOwner contract /// @notice A contract with helpers for basic contract ownership. contract ConfirmedOwnerWithProposal is IOwnable { address private s_owner; address private s_pendingOwner; event OwnershipTransferRequested(address indexed from, address indexed to); event OwnershipTransferred(address indexed from, address indexed to); constructor(address newOwner, address pendingOwner) { // solhint-disable-next-line gas-custom-errors require(newOwner != address(0), "Cannot set owner to zero"); s_owner = newOwner; if (pendingOwner != address(0)) { _transferOwnership(pendingOwner); } } /// @notice Allows an owner to begin transferring ownership to a new address. function transferOwnership(address to) public override onlyOwner { _transferOwnership(to); } /// @notice Allows an ownership transfer to be completed by the recipient. function acceptOwnership() external override { // solhint-disable-next-line gas-custom-errors require(msg.sender == s_pendingOwner, "Must be proposed owner"); address oldOwner = s_owner; s_owner = msg.sender; s_pendingOwner = address(0); emit OwnershipTransferred(oldOwner, msg.sender); } /// @notice Get the current owner function owner() public view override returns (address) { return s_owner; } /// @notice validate, transfer ownership, and emit relevant events function _transferOwnership(address to) private { // solhint-disable-next-line gas-custom-errors require(to != msg.sender, "Cannot transfer to self"); s_pendingOwner = to; emit OwnershipTransferRequested(s_owner, to); } /// @notice validate access function _validateOwnership() internal view { // solhint-disable-next-line gas-custom-errors require(msg.sender == s_owner, "Only callable by owner"); } /// @notice Reverts if called by anyone other than the contract owner. modifier onlyOwner() { _validateOwnership(); _; } } // File: @chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol pragma solidity ^0.8.0; /// @title The ConfirmedOwner contract /// @notice A contract with helpers for basic contract ownership. contract ConfirmedOwner is ConfirmedOwnerWithProposal { constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {} } // File: @chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinatorV2Plus. * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBaseV2Plus, and can * @dev initialize VRFConsumerBaseV2Plus's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumerV2Plus is VRFConsumerBaseV2Plus { * @dev constructor(<other arguments>, address _vrfCoordinator, address _subOwner) * @dev VRFConsumerBaseV2Plus(_vrfCoordinator, _subOwner) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create a subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords, extraArgs), * @dev see (IVRFCoordinatorV2Plus for a description of the arguments). * * @dev Once the VRFCoordinatorV2Plus has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBaseV2Plus.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2Plus is IVRFMigratableConsumerV2Plus, ConfirmedOwner { error OnlyCoordinatorCanFulfill(address have, address want); error OnlyOwnerOrCoordinator(address have, address owner, address coordinator); error ZeroAddress(); // s_vrfCoordinator should be used by consumers to make requests to vrfCoordinator // so that coordinator reference is updated after migration IVRFCoordinatorV2Plus public s_vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) ConfirmedOwner(msg.sender) { if (_vrfCoordinator == address(0)) { revert ZeroAddress(); } s_vrfCoordinator = IVRFCoordinatorV2Plus(_vrfCoordinator); } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2Plus expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) external { if (msg.sender != address(s_vrfCoordinator)) { revert OnlyCoordinatorCanFulfill(msg.sender, address(s_vrfCoordinator)); } fulfillRandomWords(requestId, randomWords); } /** * @inheritdoc IVRFMigratableConsumerV2Plus */ function setCoordinator(address _vrfCoordinator) external override onlyOwnerOrCoordinator { if (_vrfCoordinator == address(0)) { revert ZeroAddress(); } s_vrfCoordinator = IVRFCoordinatorV2Plus(_vrfCoordinator); emit CoordinatorSet(_vrfCoordinator); } modifier onlyOwnerOrCoordinator() { if (msg.sender != owner() && msg.sender != address(s_vrfCoordinator)) { revert OnlyOwnerOrCoordinator(msg.sender, owner(), address(s_vrfCoordinator)); } _; } } // File: burn.sol pragma solidity ^0.8.19; contract BurnRaffle is VRFConsumerBaseV2Plus, AutomationCompatibleInterface, ReentrancyGuard { IERC20 public token; uint256 public burnDuration; uint256 public burnStart; uint256 public burnEnd; uint256 public minBurnAmount = 1111 * 10**18; uint256 public participantCount; mapping(uint256 => address) public participants; mapping(address => uint256) public burnAmounts; uint256 public ethPool; bool public raffleStarted; uint256 public minimumEthForStart; address public designatedWallet; // Chainlink VRF v2.5 Parameters bytes32 public keyHash; uint256 public s_subscriptionId; uint16 public requestConfirmations = 3; uint32 public callbackGasLimit = 500000; uint32 public numWords = 1; uint256 public randomResult; uint256 public requestId; bool public vrfRequestFulfilled = false; // VRF Retry Logic uint256 public constant maxVrfAttempts = 11; uint256 public constant vrfRetryInterval = 2 hours; uint256 public vrfAttempts = 0; uint256 public lastVrfAttemptTime; bool public fallbackUsed = false; uint256 public constant FALLBACK_BLOCK_OFFSET = 1; // Events event ParticipantBurned(address indexed participant, uint256 amount); event RaffleStarted(uint256 startTime, uint256 endTime); event WinnerSelected(address indexed winner, uint256 prize); event ETHDeposited(address indexed from, uint256 amount); event RaffleEnded(uint256 timestamp); event RandomnessRequested(uint256 requestId); constructor( address _token, address _vrfCoordinatorV2_5, bytes32 _keyHash, uint256 _subscriptionId, uint256 _burnDuration, uint256 _minimumEthForStart, address _designatedWallet ) VRFConsumerBaseV2Plus(_vrfCoordinatorV2_5) { require(_token != address(0), "Token address cannot be zero"); require(_vrfCoordinatorV2_5 != address(0), "VRF Coordinator address cannot be zero"); require(_keyHash != bytes32(0), "Key Hash cannot be zero"); require(_subscriptionId > 0, "Subscription ID must be greater than zero"); require(_burnDuration > 0, "Burn duration must be greater than zero"); require(_minimumEthForStart > 0, "Minimum ETH must be greater than zero"); require(_designatedWallet != address(0), "Designated wallet cannot be zero address"); token = IERC20(_token); burnDuration = _burnDuration; keyHash = _keyHash; s_subscriptionId = _subscriptionId; minimumEthForStart = _minimumEthForStart; designatedWallet = _designatedWallet; } function registerParticipant(address participant, uint256 amount) external nonReentrant { require(msg.sender == address(token), "Only the token contract can call this function"); require(raffleStarted, "Raffle has not started yet"); require(block.timestamp <= burnEnd, "Raffle period has ended"); require(amount >= minBurnAmount, "Must burn at least minBurnAmount of tokens"); burnAmounts[participant] += amount; participants[participantCount] = participant; participantCount++; emit ParticipantBurned(participant, amount); } function getParticipantDetails(uint256 index) public view returns (address participant, uint256 amountBurned) { require(index < participantCount, "Invalid participant index"); participant = participants[index]; amountBurned = burnAmounts[participant]; } function requestRandomWinnerInternal() internal { requestId = s_vrfCoordinator.requestRandomWords( VRFV2PlusClient.RandomWordsRequest({ keyHash: keyHash, subId: s_subscriptionId, callbackGasLimit: callbackGasLimit, numWords: numWords, requestConfirmations: requestConfirmations, extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})) }) ); emit RandomnessRequested(requestId); vrfAttempts++; lastVrfAttemptTime = block.timestamp; } // Removed the public requestRandomWinner function. // VRF requests are now only made by the performUpkeep function (triggered by Chainlink Keepers). function fulfillRandomWords(uint256 _requestId, uint256[] calldata randomWords) internal override { require(!fallbackUsed, "Fallback used"); require(_requestId == requestId, "Request ID mismatch"); require(randomWords.length > 0, "No random words"); vrfRequestFulfilled = true; randomResult = randomWords[0]; selectWinner(); emit RaffleEnded(block.timestamp); } function selectWinner() private nonReentrant { require(participantCount > 0, "No participants to select from."); uint256 winnerIndex = randomResult % participantCount; address payable winner = payable(participants[winnerIndex]); uint256 prize = ethPool; ethPool = 0; // Transfer ETH prize to winner (bool success, ) = winner.call{value: prize}(""); require(success, "Prize transfer failed"); emit WinnerSelected(winner, prize); // After selecting the winner, transfer all tokens held by the contract to the dead wallet uint256 contractTokenBalance = token.balanceOf(address(this)); if (contractTokenBalance > 0) { // Send tokens to dead address to burn address deadAddress = 0x000000000000000000000000000000000000dEaD; token.transfer(deadAddress, contractTokenBalance); } } receive() external payable { require(msg.sender == designatedWallet, "Not designated wallet"); ethPool += msg.value; emit ETHDeposited(msg.sender, msg.value); // Automatically start the raffle if conditions are met if (!raffleStarted && address(this).balance >= minimumEthForStart) { raffleStarted = true; burnStart = block.timestamp; burnEnd = block.timestamp + burnDuration; emit RaffleStarted(burnStart, burnEnd); } } function checkUpkeep(bytes calldata) external view override returns (bool upkeepNeeded, bytes memory) { if (!raffleStarted || participantCount == 0 || vrfRequestFulfilled) { upkeepNeeded = false; } else if (block.timestamp > burnEnd && !vrfRequestFulfilled) { if (vrfAttempts == 0) { upkeepNeeded = true; } else if (vrfAttempts < maxVrfAttempts && block.timestamp >= lastVrfAttemptTime + vrfRetryInterval) { upkeepNeeded = true; } else if (vrfAttempts >= maxVrfAttempts && !fallbackUsed) { upkeepNeeded = true; } else { upkeepNeeded = false; } } return (upkeepNeeded, "0x"); } function performUpkeep(bytes calldata) external override nonReentrant { require(!vrfRequestFulfilled, "VRF fulfilled or fallback done"); require(raffleStarted, "Raffle not started"); // If we still have attempts left and interval passed, try VRF again if (block.timestamp > burnEnd && vrfAttempts < maxVrfAttempts) { if (vrfAttempts == 0 || block.timestamp >= lastVrfAttemptTime + vrfRetryInterval) { requestRandomWinnerInternal(); return; } } // If max attempts reached and still no VRF fulfillment, fallback to blockhash if (block.timestamp > burnEnd && vrfAttempts >= maxVrfAttempts && !fallbackUsed) { fallbackUsed = true; // Using blockhash of previous block as fallback randomness randomResult = uint256(blockhash(block.number - FALLBACK_BLOCK_OFFSET)); selectWinner(); emit RaffleEnded(block.timestamp); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_vrfCoordinatorV2_5","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint256","name":"_subscriptionId","type":"uint256"},{"internalType":"uint256","name":"_burnDuration","type":"uint256"},{"internalType":"uint256","name":"_minimumEthForStart","type":"uint256"},{"internalType":"address","name":"_designatedWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"coordinator","type":"address"}],"name":"OnlyOwnerOrCoordinator","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vrfCoordinator","type":"address"}],"name":"CoordinatorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ParticipantBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RaffleEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"RaffleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"RandomnessRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"prize","type":"uint256"}],"name":"WinnerSelected","type":"event"},{"inputs":[],"name":"FALLBACK_BLOCK_OFFSET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callbackGasLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"designatedWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fallbackUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getParticipantDetails","outputs":[{"internalType":"address","name":"participant","type":"address"},{"internalType":"uint256","name":"amountBurned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastVrfAttemptTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxVrfAttempts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minBurnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumEthForStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numWords","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"participantCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"raffleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomResult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"participant","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"registerParticipant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestConfirmations","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_subscriptionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_vrfCoordinator","outputs":[{"internalType":"contract IVRFCoordinatorV2Plus","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vrfCoordinator","type":"address"}],"name":"setCoordinator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vrfAttempts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfRequestFulfilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfRetryInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052683c3a38e5ab72fc0000600855600360125f6101000a81548161ffff021916908361ffff1602179055506207a120601260026101000a81548163ffffffff021916908363ffffffff1602179055506001601260066101000a81548163ffffffff021916908363ffffffff1602179055505f60155f6101000a81548160ff0219169083151502179055505f6016555f60185f6101000a81548160ff0219169083151502179055503480156100b5575f5ffd5b50604051613b5e380380613b5e83398181016040528101906100d79190610767565b8533805f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101409061085e565b60405180910390fd5b815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146101cb576101ca8161057860201b60201c565b5b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610233576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060016003819055505f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036102ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e1906108c6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603610358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034f90610954565b60405180910390fd5b5f5f1b850361039c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610393906109bc565b60405180910390fd5b5f84116103de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d590610a4a565b60405180910390fd5b5f8311610420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041790610ad8565b60405180910390fd5b5f8211610462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045990610b66565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036104d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c790610bf4565b60405180910390fd5b8660045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600581905550846010819055508360118190555081600e8190555080600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050610c7a565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90610c5c565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106d0826106a7565b9050919050565b6106e0816106c6565b81146106ea575f5ffd5b50565b5f815190506106fb816106d7565b92915050565b5f819050919050565b61071381610701565b811461071d575f5ffd5b50565b5f8151905061072e8161070a565b92915050565b5f819050919050565b61074681610734565b8114610750575f5ffd5b50565b5f815190506107618161073d565b92915050565b5f5f5f5f5f5f5f60e0888a031215610782576107816106a3565b5b5f61078f8a828b016106ed565b97505060206107a08a828b016106ed565b96505060406107b18a828b01610720565b95505060606107c28a828b01610753565b94505060806107d38a828b01610753565b93505060a06107e48a828b01610753565b92505060c06107f58a828b016106ed565b91505092959891949750929550565b5f82825260208201905092915050565b7f43616e6e6f7420736574206f776e657220746f207a65726f00000000000000005f82015250565b5f610848601883610804565b915061085382610814565b602082019050919050565b5f6020820190508181035f8301526108758161083c565b9050919050565b7f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000005f82015250565b5f6108b0601c83610804565b91506108bb8261087c565b602082019050919050565b5f6020820190508181035f8301526108dd816108a4565b9050919050565b7f56524620436f6f7264696e61746f7220616464726573732063616e6e6f7420625f8201527f65207a65726f0000000000000000000000000000000000000000000000000000602082015250565b5f61093e602683610804565b9150610949826108e4565b604082019050919050565b5f6020820190508181035f83015261096b81610932565b9050919050565b7f4b657920486173682063616e6e6f74206265207a65726f0000000000000000005f82015250565b5f6109a6601783610804565b91506109b182610972565b602082019050919050565b5f6020820190508181035f8301526109d38161099a565b9050919050565b7f537562736372697074696f6e204944206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f610a34602983610804565b9150610a3f826109da565b604082019050919050565b5f6020820190508181035f830152610a6181610a28565b9050919050565b7f4275726e206475726174696f6e206d75737420626520677265617465722074685f8201527f616e207a65726f00000000000000000000000000000000000000000000000000602082015250565b5f610ac2602783610804565b9150610acd82610a68565b604082019050919050565b5f6020820190508181035f830152610aef81610ab6565b9050919050565b7f4d696e696d756d20455448206d7573742062652067726561746572207468616e5f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f610b50602583610804565b9150610b5b82610af6565b604082019050919050565b5f6020820190508181035f830152610b7d81610b44565b9050919050565b7f44657369676e617465642077616c6c65742063616e6e6f74206265207a65726f5f8201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b5f610bde602883610804565b9150610be982610b84565b604082019050919050565b5f6020820190508181035f830152610c0b81610bd2565b9050919050565b7f43616e6e6f74207472616e7366657220746f2073656c660000000000000000005f82015250565b5f610c46601783610804565b9150610c5182610c12565b602082019050919050565b5f6020820190508181035f830152610c7381610c3a565b9050919050565b612ed780610c875f395ff3fe608060405260043610610211575f3560e01c80637ccfd7fc11610117578063a60e23651161009f578063e5ffcf8e1161006e578063e5ffcf8e146108d9578063f16673a414610903578063f2fde38b1461092d578063fc0c546a14610955578063fff1931c1461097f576103a3565b8063a60e236514610831578063b0fb162f1461085b578063bb403c1c14610885578063c7066c78146108af576103a3565b80638da5cb5b116100e65780638da5cb5b146107615780638ea981171461078b57806395fc1bed146107b35780639e293bd8146107dd5780639eccacf614610807576103a3565b80637ccfd7fc146106b95780637d020528146106e3578063839975bb1461070d5780638ac0002114610737576103a3565b80634302e5641161019a57806361728f391161016957806361728f39146105e85780636e04ff0d146106125780636fd8d0bb1461064f57806377bd56091461067957806379ba5097146106a3576103a3565b80634302e564146105315780634585e33b146105595780635c707e55146105815780635e7c857d146105ab576103a3565b806328792ad3116101e157806328792ad31461044d57806331d3f9f21461047757806335c1d349146104a1578063362f04c0146104dd57806342619f6614610507576103a3565b80626d6cae146103a757806316f854fe146103d15780631fe543e3146103fb57806324f7469714610423576103a3565b366103a357600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029c90611e76565b60405180910390fd5b34600c5f8282546102b69190611eca565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f6c703791f399558807424f489ccd811c72b4ff0b74af547264fad7c646776df0346040516103039190611f0c565b60405180910390a2600d5f9054906101000a900460ff161580156103295750600e544710155b156103a1576001600d5f6101000a81548160ff021916908315150217905550426006819055506005544261035d9190611eca565b6007819055507fe1078fbf8122252d4552c2b9c945a0794c0dcfd34277a548cabe558ebb8fb660600654600754604051610398929190611f25565b60405180910390a15b005b5f5ffd5b3480156103b2575f5ffd5b506103bb6109bb565b6040516103c89190611f0c565b60405180910390f35b3480156103dc575f5ffd5b506103e56109c1565b6040516103f29190611f0c565b60405180910390f35b348015610406575f5ffd5b50610421600480360381019061041c9190611fdf565b6109c6565b005b34801561042e575f5ffd5b50610437610a8a565b604051610444919061205a565b60405180910390f35b348015610458575f5ffd5b50610461610aa0565b60405161046e919061208d565b60405180910390f35b348015610482575f5ffd5b5061048b610ab2565b6040516104989190611f0c565b60405180910390f35b3480156104ac575f5ffd5b506104c760048036038101906104c291906120a6565b610ab8565b6040516104d49190612110565b60405180910390f35b3480156104e8575f5ffd5b506104f1610ae8565b6040516104fe9190611f0c565b60405180910390f35b348015610512575f5ffd5b5061051b610aee565b6040516105289190611f0c565b60405180910390f35b34801561053c575f5ffd5b5061055760048036038101906105529190612153565b610af4565b005b348015610564575f5ffd5b5061057f600480360381019061057a91906121e6565b610d78565b005b34801561058c575f5ffd5b50610595610f15565b6040516105a2919061208d565b60405180910390f35b3480156105b6575f5ffd5b506105d160048036038101906105cc91906120a6565b610f27565b6040516105df929190612231565b60405180910390f35b3480156105f3575f5ffd5b506105fc610fe5565b6040516106099190612270565b60405180910390f35b34801561061d575f5ffd5b50610638600480360381019061063391906121e6565b610feb565b6040516106469291906122f9565b60405180910390f35b34801561065a575f5ffd5b50610663611107565b6040516106709190611f0c565b60405180910390f35b348015610684575f5ffd5b5061068d61110d565b60405161069a9190611f0c565b60405180910390f35b3480156106ae575f5ffd5b506106b7611112565b005b3480156106c4575f5ffd5b506106cd6112a1565b6040516106da919061205a565b60405180910390f35b3480156106ee575f5ffd5b506106f76112b7565b6040516107049190611f0c565b60405180910390f35b348015610718575f5ffd5b506107216112bd565b60405161072e9190611f0c565b60405180910390f35b348015610742575f5ffd5b5061074b6112c3565b6040516107589190611f0c565b60405180910390f35b34801561076c575f5ffd5b506107756112c9565b6040516107829190612110565b60405180910390f35b348015610796575f5ffd5b506107b160048036038101906107ac9190612327565b6112f0565b005b3480156107be575f5ffd5b506107c76114cd565b6040516107d49190611f0c565b60405180910390f35b3480156107e8575f5ffd5b506107f16114d3565b6040516107fe9190611f0c565b60405180910390f35b348015610812575f5ffd5b5061081b6114d9565b60405161082891906123ad565b60405180910390f35b34801561083c575f5ffd5b506108456114fe565b604051610852919061208d565b60405180910390f35b348015610866575f5ffd5b5061086f611510565b60405161087c91906123e2565b60405180910390f35b348015610890575f5ffd5b50610899611523565b6040516108a69190611f0c565b60405180910390f35b3480156108ba575f5ffd5b506108c3611529565b6040516108d09190611f0c565b60405180910390f35b3480156108e4575f5ffd5b506108ed61152f565b6040516108fa9190612110565b60405180910390f35b34801561090e575f5ffd5b50610917611554565b6040516109249190611f0c565b60405180910390f35b348015610938575f5ffd5b50610953600480360381019061094e9190612327565b61155a565b005b348015610960575f5ffd5b5061096961156e565b604051610976919061241b565b60405180910390f35b34801561098a575f5ffd5b506109a560048036038101906109a09190612327565b611593565b6040516109b29190611f0c565b60405180910390f35b60145481565b600181565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7a573360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610a71929190612434565b60405180910390fd5b610a858383836115a8565b505050565b601260029054906101000a900463ffffffff1681565b600d5f9054906101000a900460ff1681565b60175481565b600a602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60135481565b610afc6116fe565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b82906124cb565b60405180910390fd5b600d5f9054906101000a900460ff16610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612533565b60405180910390fd5b600754421115610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c159061259b565b60405180910390fd5b600854811015610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90612629565b60405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610caf9190611eca565b9250508190555081600a5f60095481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f815480929190610d1990612647565b91905055508173ffffffffffffffffffffffffffffffffffffffff167fdae43cab61151d4927e46871e6118e98d383615b2fc54f2ff1256f85b0f11ca582604051610d649190611f0c565b60405180910390a2610d7461174d565b5050565b610d806116fe565b60155f9054906101000a900460ff1615610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc6906126d8565b60405180910390fd5b600d5f9054906101000a900460ff16610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490612740565b60405180910390fd5b60075442118015610e305750600b601654105b15610e67575f6016541480610e545750611c20601754610e509190611eca565b4210155b15610e6657610e61611757565b610f09565b5b60075442118015610e7b5750600b60165410155b8015610e93575060185f9054906101000a900460ff16155b15610f0857600160185f6101000a81548160ff021916908315150217905550600143610ebf919061275e565b405f1c601381905550610ed06118db565b7fea9b3e286c888f91dfb0567aead086fe3c33239ddee154b7064f3043760cf05342604051610eff9190611f0c565b60405180910390a15b5b610f1161174d565b5050565b60185f9054906101000a900460ff1681565b5f5f6009548310610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906127db565b60405180910390fd5b600a5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050915091565b60105481565b5f6060600d5f9054906101000a900460ff16158061100a57505f600954145b80611020575060155f9054906101000a900460ff165b1561102d575f91506110c5565b6007544211801561104a575060155f9054906101000a900460ff16155b156110c4575f6016540361106157600191506110c3565b600b6016541080156110825750611c2060175461107e9190611eca565b4210155b1561109057600191506110c2565b600b601654101580156110af575060185f9054906101000a900460ff16155b156110bd57600191506110c1565b5f91505b5b5b5b5b816040518060400160405280600281526020017f3078000000000000000000000000000000000000000000000000000000000000815250915091509250929050565b60065481565b600b81565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890612843565b60405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b601260069054906101000a900463ffffffff1681565b60075481565b60085481565b60115481565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112f86112c9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611380575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156113ee573361138e6112c9565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f061db9c10000000000000000000000000000000000000000000000000000000081526004016113e593929190612861565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611453576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd1a6a14209a385a964d036e404cb5cfb71f4000cdb03c9366292430787261be6816040516114c29190612110565b60405180910390a150565b60055481565b600e5481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900460ff1681565b60125f9054906101000a900461ffff1681565b611c2081565b60165481565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b611562611bc9565b61156b81611c59565b50565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b602052805f5260405f205f915090505481565b60185f9054906101000a900460ff16156115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee906128e0565b60405180910390fd5b601454831461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290612948565b60405180910390fd5b5f8282905011611680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611677906129b0565b60405180910390fd5b600160155f6101000a81548160ff02191690831515021790555081815f8181106116ad576116ac6129ce565b5b905060200201356013819055506116c26118db565b7fea9b3e286c888f91dfb0567aead086fe3c33239ddee154b7064f3043760cf053426040516116f19190611f0c565b60405180910390a1505050565b600260035403611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90612a45565b60405180910390fd5b6002600381905550565b6001600381905550565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b1c385e6040518060c001604052806010548152602001601154815260200160125f9054906101000a900461ffff1661ffff168152602001601260029054906101000a900463ffffffff1663ffffffff168152602001601260069054906101000a900463ffffffff1663ffffffff16815260200161181d60405180602001604052805f1515815250611d84565b8152506040518263ffffffff1660e01b815260040161183c9190612b6d565b6020604051808303815f875af1158015611858573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187c9190612ba1565b6014819055507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d456014546040516118b39190611f0c565b60405180910390a160165f8154809291906118cd90612647565b919050555042601781905550565b6118e36116fe565b5f60095411611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90612c16565b60405180910390fd5b5f6009546013546119389190612c61565b90505f600a5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5490505f600c819055505f8273ffffffffffffffffffffffffffffffffffffffff16826040516119a090612cbe565b5f6040518083038185875af1925050503d805f81146119da576040519150601f19603f3d011682016040523d82523d5f602084013e6119df565b606091505b5050905080611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a90612d1c565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f75060f9e79552df167b73353fee6237a75bb5ba8ea022f77224e32f152138bcb83604051611a699190611f0c565b60405180910390a25f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611acc9190612110565b602060405180830381865afa158015611ae7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b9190612ba1565b90505f811115611bba575f61dead905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401611b77929190612231565b6020604051808303815f875af1158015611b93573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb79190612d64565b50505b5050505050611bc761174d565b565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90612dd9565b60405180910390fd5b565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90612e41565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa82604051602401611db89190612e88565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b5f82825260208201905092915050565b7f4e6f742064657369676e617465642077616c6c657400000000000000000000005f82015250565b5f611e60601583611e1c565b9150611e6b82611e2c565b602082019050919050565b5f6020820190508181035f830152611e8d81611e54565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ed482611e94565b9150611edf83611e94565b9250828201905080821115611ef757611ef6611e9d565b5b92915050565b611f0681611e94565b82525050565b5f602082019050611f1f5f830184611efd565b92915050565b5f604082019050611f385f830185611efd565b611f456020830184611efd565b9392505050565b5f5ffd5b5f5ffd5b611f5d81611e94565b8114611f67575f5ffd5b50565b5f81359050611f7881611f54565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112611f9f57611f9e611f7e565b5b8235905067ffffffffffffffff811115611fbc57611fbb611f82565b5b602083019150836020820283011115611fd857611fd7611f86565b5b9250929050565b5f5f5f60408486031215611ff657611ff5611f4c565b5b5f61200386828701611f6a565b935050602084013567ffffffffffffffff81111561202457612023611f50565b5b61203086828701611f8a565b92509250509250925092565b5f63ffffffff82169050919050565b6120548161203c565b82525050565b5f60208201905061206d5f83018461204b565b92915050565b5f8115159050919050565b61208781612073565b82525050565b5f6020820190506120a05f83018461207e565b92915050565b5f602082840312156120bb576120ba611f4c565b5b5f6120c884828501611f6a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6120fa826120d1565b9050919050565b61210a816120f0565b82525050565b5f6020820190506121235f830184612101565b92915050565b612132816120f0565b811461213c575f5ffd5b50565b5f8135905061214d81612129565b92915050565b5f5f6040838503121561216957612168611f4c565b5b5f6121768582860161213f565b925050602061218785828601611f6a565b9150509250929050565b5f5f83601f8401126121a6576121a5611f7e565b5b8235905067ffffffffffffffff8111156121c3576121c2611f82565b5b6020830191508360018202830111156121df576121de611f86565b5b9250929050565b5f5f602083850312156121fc576121fb611f4c565b5b5f83013567ffffffffffffffff81111561221957612218611f50565b5b61222585828601612191565b92509250509250929050565b5f6040820190506122445f830185612101565b6122516020830184611efd565b9392505050565b5f819050919050565b61226a81612258565b82525050565b5f6020820190506122835f830184612261565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6122cb82612289565b6122d58185612293565b93506122e58185602086016122a3565b6122ee816122b1565b840191505092915050565b5f60408201905061230c5f83018561207e565b818103602083015261231e81846122c1565b90509392505050565b5f6020828403121561233c5761233b611f4c565b5b5f6123498482850161213f565b91505092915050565b5f819050919050565b5f61237561237061236b846120d1565b612352565b6120d1565b9050919050565b5f6123868261235b565b9050919050565b5f6123978261237c565b9050919050565b6123a78161238d565b82525050565b5f6020820190506123c05f83018461239e565b92915050565b5f61ffff82169050919050565b6123dc816123c6565b82525050565b5f6020820190506123f55f8301846123d3565b92915050565b5f6124058261237c565b9050919050565b612415816123fb565b82525050565b5f60208201905061242e5f83018461240c565b92915050565b5f6040820190506124475f830185612101565b6124546020830184612101565b9392505050565b7f4f6e6c792074686520746f6b656e20636f6e74726163742063616e2063616c6c5f8201527f20746869732066756e6374696f6e000000000000000000000000000000000000602082015250565b5f6124b5602e83611e1c565b91506124c08261245b565b604082019050919050565b5f6020820190508181035f8301526124e2816124a9565b9050919050565b7f526166666c6520686173206e6f742073746172746564207965740000000000005f82015250565b5f61251d601a83611e1c565b9150612528826124e9565b602082019050919050565b5f6020820190508181035f83015261254a81612511565b9050919050565b7f526166666c6520706572696f642068617320656e6465640000000000000000005f82015250565b5f612585601783611e1c565b915061259082612551565b602082019050919050565b5f6020820190508181035f8301526125b281612579565b9050919050565b7f4d757374206275726e206174206c65617374206d696e4275726e416d6f756e745f8201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b5f612613602a83611e1c565b915061261e826125b9565b604082019050919050565b5f6020820190508181035f83015261264081612607565b9050919050565b5f61265182611e94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361268357612682611e9d565b5b600182019050919050565b7f5652462066756c66696c6c6564206f722066616c6c6261636b20646f6e6500005f82015250565b5f6126c2601e83611e1c565b91506126cd8261268e565b602082019050919050565b5f6020820190508181035f8301526126ef816126b6565b9050919050565b7f526166666c65206e6f74207374617274656400000000000000000000000000005f82015250565b5f61272a601283611e1c565b9150612735826126f6565b602082019050919050565b5f6020820190508181035f8301526127578161271e565b9050919050565b5f61276882611e94565b915061277383611e94565b925082820390508181111561278b5761278a611e9d565b5b92915050565b7f496e76616c6964207061727469636970616e7420696e646578000000000000005f82015250565b5f6127c5601983611e1c565b91506127d082612791565b602082019050919050565b5f6020820190508181035f8301526127f2816127b9565b9050919050565b7f4d7573742062652070726f706f736564206f776e6572000000000000000000005f82015250565b5f61282d601683611e1c565b9150612838826127f9565b602082019050919050565b5f6020820190508181035f83015261285a81612821565b9050919050565b5f6060820190506128745f830186612101565b6128816020830185612101565b61288e6040830184612101565b949350505050565b7f46616c6c6261636b2075736564000000000000000000000000000000000000005f82015250565b5f6128ca600d83611e1c565b91506128d582612896565b602082019050919050565b5f6020820190508181035f8301526128f7816128be565b9050919050565b7f52657175657374204944206d69736d61746368000000000000000000000000005f82015250565b5f612932601383611e1c565b915061293d826128fe565b602082019050919050565b5f6020820190508181035f83015261295f81612926565b9050919050565b7f4e6f2072616e646f6d20776f72647300000000000000000000000000000000005f82015250565b5f61299a600f83611e1c565b91506129a582612966565b602082019050919050565b5f6020820190508181035f8301526129c78161298e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612a2f601f83611e1c565b9150612a3a826129fb565b602082019050919050565b5f6020820190508181035f830152612a5c81612a23565b9050919050565b612a6c81612258565b82525050565b612a7b81611e94565b82525050565b612a8a816123c6565b82525050565b612a998161203c565b82525050565b5f82825260208201905092915050565b5f612ab982612289565b612ac38185612a9f565b9350612ad38185602086016122a3565b612adc816122b1565b840191505092915050565b5f60c083015f830151612afc5f860182612a63565b506020830151612b0f6020860182612a72565b506040830151612b226040860182612a81565b506060830151612b356060860182612a90565b506080830151612b486080860182612a90565b5060a083015184820360a0860152612b608282612aaf565b9150508091505092915050565b5f6020820190508181035f830152612b858184612ae7565b905092915050565b5f81519050612b9b81611f54565b92915050565b5f60208284031215612bb657612bb5611f4c565b5b5f612bc384828501612b8d565b91505092915050565b7f4e6f207061727469636970616e747320746f2073656c6563742066726f6d2e005f82015250565b5f612c00601f83611e1c565b9150612c0b82612bcc565b602082019050919050565b5f6020820190508181035f830152612c2d81612bf4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612c6b82611e94565b9150612c7683611e94565b925082612c8657612c85612c34565b5b828206905092915050565b5f81905092915050565b50565b5f612ca95f83612c91565b9150612cb482612c9b565b5f82019050919050565b5f612cc882612c9e565b9150819050919050565b7f5072697a65207472616e73666572206661696c656400000000000000000000005f82015250565b5f612d06601583611e1c565b9150612d1182612cd2565b602082019050919050565b5f6020820190508181035f830152612d3381612cfa565b9050919050565b612d4381612073565b8114612d4d575f5ffd5b50565b5f81519050612d5e81612d3a565b92915050565b5f60208284031215612d7957612d78611f4c565b5b5f612d8684828501612d50565b91505092915050565b7f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000005f82015250565b5f612dc3601683611e1c565b9150612dce82612d8f565b602082019050919050565b5f6020820190508181035f830152612df081612db7565b9050919050565b7f43616e6e6f74207472616e7366657220746f2073656c660000000000000000005f82015250565b5f612e2b601783611e1c565b9150612e3682612df7565b602082019050919050565b5f6020820190508181035f830152612e5881612e1f565b9050919050565b612e6881612073565b82525050565b602082015f820151612e825f850182612e5f565b50505050565b5f602082019050612e9b5f830184612e6e565b9291505056fea2646970667358221220ec833844115ee15bd63c6f86ad6d27f2ee99ea5eedab6307e84de7a8bb61153b64736f6c634300081c0033000000000000000000000000c76d496182b8b01570a6b96cc119bd9d32a336bf000000000000000000000000d7f86b4b8cae7d942340ff628f82735b7a20893a3fd2fec10d06ee8f65e7f2e95f5c56511359ece3f33960ad8a866ae24a8ff10b71294dc38497c5b605a2ebcd4737285aaa3cbc8eaa8e5da95f02be12728162ef000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000003e871b540c000000000000000000000000000b92bb99c271883146acdc494e4443c44285a2a33
Deployed Bytecode
0x608060405260043610610211575f3560e01c80637ccfd7fc11610117578063a60e23651161009f578063e5ffcf8e1161006e578063e5ffcf8e146108d9578063f16673a414610903578063f2fde38b1461092d578063fc0c546a14610955578063fff1931c1461097f576103a3565b8063a60e236514610831578063b0fb162f1461085b578063bb403c1c14610885578063c7066c78146108af576103a3565b80638da5cb5b116100e65780638da5cb5b146107615780638ea981171461078b57806395fc1bed146107b35780639e293bd8146107dd5780639eccacf614610807576103a3565b80637ccfd7fc146106b95780637d020528146106e3578063839975bb1461070d5780638ac0002114610737576103a3565b80634302e5641161019a57806361728f391161016957806361728f39146105e85780636e04ff0d146106125780636fd8d0bb1461064f57806377bd56091461067957806379ba5097146106a3576103a3565b80634302e564146105315780634585e33b146105595780635c707e55146105815780635e7c857d146105ab576103a3565b806328792ad3116101e157806328792ad31461044d57806331d3f9f21461047757806335c1d349146104a1578063362f04c0146104dd57806342619f6614610507576103a3565b80626d6cae146103a757806316f854fe146103d15780631fe543e3146103fb57806324f7469714610423576103a3565b366103a357600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029c90611e76565b60405180910390fd5b34600c5f8282546102b69190611eca565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f6c703791f399558807424f489ccd811c72b4ff0b74af547264fad7c646776df0346040516103039190611f0c565b60405180910390a2600d5f9054906101000a900460ff161580156103295750600e544710155b156103a1576001600d5f6101000a81548160ff021916908315150217905550426006819055506005544261035d9190611eca565b6007819055507fe1078fbf8122252d4552c2b9c945a0794c0dcfd34277a548cabe558ebb8fb660600654600754604051610398929190611f25565b60405180910390a15b005b5f5ffd5b3480156103b2575f5ffd5b506103bb6109bb565b6040516103c89190611f0c565b60405180910390f35b3480156103dc575f5ffd5b506103e56109c1565b6040516103f29190611f0c565b60405180910390f35b348015610406575f5ffd5b50610421600480360381019061041c9190611fdf565b6109c6565b005b34801561042e575f5ffd5b50610437610a8a565b604051610444919061205a565b60405180910390f35b348015610458575f5ffd5b50610461610aa0565b60405161046e919061208d565b60405180910390f35b348015610482575f5ffd5b5061048b610ab2565b6040516104989190611f0c565b60405180910390f35b3480156104ac575f5ffd5b506104c760048036038101906104c291906120a6565b610ab8565b6040516104d49190612110565b60405180910390f35b3480156104e8575f5ffd5b506104f1610ae8565b6040516104fe9190611f0c565b60405180910390f35b348015610512575f5ffd5b5061051b610aee565b6040516105289190611f0c565b60405180910390f35b34801561053c575f5ffd5b5061055760048036038101906105529190612153565b610af4565b005b348015610564575f5ffd5b5061057f600480360381019061057a91906121e6565b610d78565b005b34801561058c575f5ffd5b50610595610f15565b6040516105a2919061208d565b60405180910390f35b3480156105b6575f5ffd5b506105d160048036038101906105cc91906120a6565b610f27565b6040516105df929190612231565b60405180910390f35b3480156105f3575f5ffd5b506105fc610fe5565b6040516106099190612270565b60405180910390f35b34801561061d575f5ffd5b50610638600480360381019061063391906121e6565b610feb565b6040516106469291906122f9565b60405180910390f35b34801561065a575f5ffd5b50610663611107565b6040516106709190611f0c565b60405180910390f35b348015610684575f5ffd5b5061068d61110d565b60405161069a9190611f0c565b60405180910390f35b3480156106ae575f5ffd5b506106b7611112565b005b3480156106c4575f5ffd5b506106cd6112a1565b6040516106da919061205a565b60405180910390f35b3480156106ee575f5ffd5b506106f76112b7565b6040516107049190611f0c565b60405180910390f35b348015610718575f5ffd5b506107216112bd565b60405161072e9190611f0c565b60405180910390f35b348015610742575f5ffd5b5061074b6112c3565b6040516107589190611f0c565b60405180910390f35b34801561076c575f5ffd5b506107756112c9565b6040516107829190612110565b60405180910390f35b348015610796575f5ffd5b506107b160048036038101906107ac9190612327565b6112f0565b005b3480156107be575f5ffd5b506107c76114cd565b6040516107d49190611f0c565b60405180910390f35b3480156107e8575f5ffd5b506107f16114d3565b6040516107fe9190611f0c565b60405180910390f35b348015610812575f5ffd5b5061081b6114d9565b60405161082891906123ad565b60405180910390f35b34801561083c575f5ffd5b506108456114fe565b604051610852919061208d565b60405180910390f35b348015610866575f5ffd5b5061086f611510565b60405161087c91906123e2565b60405180910390f35b348015610890575f5ffd5b50610899611523565b6040516108a69190611f0c565b60405180910390f35b3480156108ba575f5ffd5b506108c3611529565b6040516108d09190611f0c565b60405180910390f35b3480156108e4575f5ffd5b506108ed61152f565b6040516108fa9190612110565b60405180910390f35b34801561090e575f5ffd5b50610917611554565b6040516109249190611f0c565b60405180910390f35b348015610938575f5ffd5b50610953600480360381019061094e9190612327565b61155a565b005b348015610960575f5ffd5b5061096961156e565b604051610976919061241b565b60405180910390f35b34801561098a575f5ffd5b506109a560048036038101906109a09190612327565b611593565b6040516109b29190611f0c565b60405180910390f35b60145481565b600181565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7a573360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610a71929190612434565b60405180910390fd5b610a858383836115a8565b505050565b601260029054906101000a900463ffffffff1681565b600d5f9054906101000a900460ff1681565b60175481565b600a602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60135481565b610afc6116fe565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b82906124cb565b60405180910390fd5b600d5f9054906101000a900460ff16610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612533565b60405180910390fd5b600754421115610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c159061259b565b60405180910390fd5b600854811015610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90612629565b60405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610caf9190611eca565b9250508190555081600a5f60095481526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f815480929190610d1990612647565b91905055508173ffffffffffffffffffffffffffffffffffffffff167fdae43cab61151d4927e46871e6118e98d383615b2fc54f2ff1256f85b0f11ca582604051610d649190611f0c565b60405180910390a2610d7461174d565b5050565b610d806116fe565b60155f9054906101000a900460ff1615610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc6906126d8565b60405180910390fd5b600d5f9054906101000a900460ff16610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490612740565b60405180910390fd5b60075442118015610e305750600b601654105b15610e67575f6016541480610e545750611c20601754610e509190611eca565b4210155b15610e6657610e61611757565b610f09565b5b60075442118015610e7b5750600b60165410155b8015610e93575060185f9054906101000a900460ff16155b15610f0857600160185f6101000a81548160ff021916908315150217905550600143610ebf919061275e565b405f1c601381905550610ed06118db565b7fea9b3e286c888f91dfb0567aead086fe3c33239ddee154b7064f3043760cf05342604051610eff9190611f0c565b60405180910390a15b5b610f1161174d565b5050565b60185f9054906101000a900460ff1681565b5f5f6009548310610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f64906127db565b60405180910390fd5b600a5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050915091565b60105481565b5f6060600d5f9054906101000a900460ff16158061100a57505f600954145b80611020575060155f9054906101000a900460ff165b1561102d575f91506110c5565b6007544211801561104a575060155f9054906101000a900460ff16155b156110c4575f6016540361106157600191506110c3565b600b6016541080156110825750611c2060175461107e9190611eca565b4210155b1561109057600191506110c2565b600b601654101580156110af575060185f9054906101000a900460ff16155b156110bd57600191506110c1565b5f91505b5b5b5b5b816040518060400160405280600281526020017f3078000000000000000000000000000000000000000000000000000000000000815250915091509250929050565b60065481565b600b81565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890612843565b60405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b601260069054906101000a900463ffffffff1681565b60075481565b60085481565b60115481565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112f86112c9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611380575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156113ee573361138e6112c9565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f061db9c10000000000000000000000000000000000000000000000000000000081526004016113e593929190612861565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611453576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd1a6a14209a385a964d036e404cb5cfb71f4000cdb03c9366292430787261be6816040516114c29190612110565b60405180910390a150565b60055481565b600e5481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900460ff1681565b60125f9054906101000a900461ffff1681565b611c2081565b60165481565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c5481565b611562611bc9565b61156b81611c59565b50565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b602052805f5260405f205f915090505481565b60185f9054906101000a900460ff16156115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee906128e0565b60405180910390fd5b601454831461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290612948565b60405180910390fd5b5f8282905011611680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611677906129b0565b60405180910390fd5b600160155f6101000a81548160ff02191690831515021790555081815f8181106116ad576116ac6129ce565b5b905060200201356013819055506116c26118db565b7fea9b3e286c888f91dfb0567aead086fe3c33239ddee154b7064f3043760cf053426040516116f19190611f0c565b60405180910390a1505050565b600260035403611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90612a45565b60405180910390fd5b6002600381905550565b6001600381905550565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b1c385e6040518060c001604052806010548152602001601154815260200160125f9054906101000a900461ffff1661ffff168152602001601260029054906101000a900463ffffffff1663ffffffff168152602001601260069054906101000a900463ffffffff1663ffffffff16815260200161181d60405180602001604052805f1515815250611d84565b8152506040518263ffffffff1660e01b815260040161183c9190612b6d565b6020604051808303815f875af1158015611858573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187c9190612ba1565b6014819055507f9ac10fb18c93d33ad7b0a941897aef048d0f8d30756684e82b4552ba12764d456014546040516118b39190611f0c565b60405180910390a160165f8154809291906118cd90612647565b919050555042601781905550565b6118e36116fe565b5f60095411611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90612c16565b60405180910390fd5b5f6009546013546119389190612c61565b90505f600a5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600c5490505f600c819055505f8273ffffffffffffffffffffffffffffffffffffffff16826040516119a090612cbe565b5f6040518083038185875af1925050503d805f81146119da576040519150601f19603f3d011682016040523d82523d5f602084013e6119df565b606091505b5050905080611a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1a90612d1c565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f75060f9e79552df167b73353fee6237a75bb5ba8ea022f77224e32f152138bcb83604051611a699190611f0c565b60405180910390a25f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611acc9190612110565b602060405180830381865afa158015611ae7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b9190612ba1565b90505f811115611bba575f61dead905060045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82846040518363ffffffff1660e01b8152600401611b77929190612231565b6020604051808303815f875af1158015611b93573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb79190612d64565b50505b5050505050611bc761174d565b565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90612dd9565b60405180910390fd5b565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90612e41565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127860405160405180910390a350565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa82604051602401611db89190612e88565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b5f82825260208201905092915050565b7f4e6f742064657369676e617465642077616c6c657400000000000000000000005f82015250565b5f611e60601583611e1c565b9150611e6b82611e2c565b602082019050919050565b5f6020820190508181035f830152611e8d81611e54565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611ed482611e94565b9150611edf83611e94565b9250828201905080821115611ef757611ef6611e9d565b5b92915050565b611f0681611e94565b82525050565b5f602082019050611f1f5f830184611efd565b92915050565b5f604082019050611f385f830185611efd565b611f456020830184611efd565b9392505050565b5f5ffd5b5f5ffd5b611f5d81611e94565b8114611f67575f5ffd5b50565b5f81359050611f7881611f54565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112611f9f57611f9e611f7e565b5b8235905067ffffffffffffffff811115611fbc57611fbb611f82565b5b602083019150836020820283011115611fd857611fd7611f86565b5b9250929050565b5f5f5f60408486031215611ff657611ff5611f4c565b5b5f61200386828701611f6a565b935050602084013567ffffffffffffffff81111561202457612023611f50565b5b61203086828701611f8a565b92509250509250925092565b5f63ffffffff82169050919050565b6120548161203c565b82525050565b5f60208201905061206d5f83018461204b565b92915050565b5f8115159050919050565b61208781612073565b82525050565b5f6020820190506120a05f83018461207e565b92915050565b5f602082840312156120bb576120ba611f4c565b5b5f6120c884828501611f6a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6120fa826120d1565b9050919050565b61210a816120f0565b82525050565b5f6020820190506121235f830184612101565b92915050565b612132816120f0565b811461213c575f5ffd5b50565b5f8135905061214d81612129565b92915050565b5f5f6040838503121561216957612168611f4c565b5b5f6121768582860161213f565b925050602061218785828601611f6a565b9150509250929050565b5f5f83601f8401126121a6576121a5611f7e565b5b8235905067ffffffffffffffff8111156121c3576121c2611f82565b5b6020830191508360018202830111156121df576121de611f86565b5b9250929050565b5f5f602083850312156121fc576121fb611f4c565b5b5f83013567ffffffffffffffff81111561221957612218611f50565b5b61222585828601612191565b92509250509250929050565b5f6040820190506122445f830185612101565b6122516020830184611efd565b9392505050565b5f819050919050565b61226a81612258565b82525050565b5f6020820190506122835f830184612261565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6122cb82612289565b6122d58185612293565b93506122e58185602086016122a3565b6122ee816122b1565b840191505092915050565b5f60408201905061230c5f83018561207e565b818103602083015261231e81846122c1565b90509392505050565b5f6020828403121561233c5761233b611f4c565b5b5f6123498482850161213f565b91505092915050565b5f819050919050565b5f61237561237061236b846120d1565b612352565b6120d1565b9050919050565b5f6123868261235b565b9050919050565b5f6123978261237c565b9050919050565b6123a78161238d565b82525050565b5f6020820190506123c05f83018461239e565b92915050565b5f61ffff82169050919050565b6123dc816123c6565b82525050565b5f6020820190506123f55f8301846123d3565b92915050565b5f6124058261237c565b9050919050565b612415816123fb565b82525050565b5f60208201905061242e5f83018461240c565b92915050565b5f6040820190506124475f830185612101565b6124546020830184612101565b9392505050565b7f4f6e6c792074686520746f6b656e20636f6e74726163742063616e2063616c6c5f8201527f20746869732066756e6374696f6e000000000000000000000000000000000000602082015250565b5f6124b5602e83611e1c565b91506124c08261245b565b604082019050919050565b5f6020820190508181035f8301526124e2816124a9565b9050919050565b7f526166666c6520686173206e6f742073746172746564207965740000000000005f82015250565b5f61251d601a83611e1c565b9150612528826124e9565b602082019050919050565b5f6020820190508181035f83015261254a81612511565b9050919050565b7f526166666c6520706572696f642068617320656e6465640000000000000000005f82015250565b5f612585601783611e1c565b915061259082612551565b602082019050919050565b5f6020820190508181035f8301526125b281612579565b9050919050565b7f4d757374206275726e206174206c65617374206d696e4275726e416d6f756e745f8201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b5f612613602a83611e1c565b915061261e826125b9565b604082019050919050565b5f6020820190508181035f83015261264081612607565b9050919050565b5f61265182611e94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361268357612682611e9d565b5b600182019050919050565b7f5652462066756c66696c6c6564206f722066616c6c6261636b20646f6e6500005f82015250565b5f6126c2601e83611e1c565b91506126cd8261268e565b602082019050919050565b5f6020820190508181035f8301526126ef816126b6565b9050919050565b7f526166666c65206e6f74207374617274656400000000000000000000000000005f82015250565b5f61272a601283611e1c565b9150612735826126f6565b602082019050919050565b5f6020820190508181035f8301526127578161271e565b9050919050565b5f61276882611e94565b915061277383611e94565b925082820390508181111561278b5761278a611e9d565b5b92915050565b7f496e76616c6964207061727469636970616e7420696e646578000000000000005f82015250565b5f6127c5601983611e1c565b91506127d082612791565b602082019050919050565b5f6020820190508181035f8301526127f2816127b9565b9050919050565b7f4d7573742062652070726f706f736564206f776e6572000000000000000000005f82015250565b5f61282d601683611e1c565b9150612838826127f9565b602082019050919050565b5f6020820190508181035f83015261285a81612821565b9050919050565b5f6060820190506128745f830186612101565b6128816020830185612101565b61288e6040830184612101565b949350505050565b7f46616c6c6261636b2075736564000000000000000000000000000000000000005f82015250565b5f6128ca600d83611e1c565b91506128d582612896565b602082019050919050565b5f6020820190508181035f8301526128f7816128be565b9050919050565b7f52657175657374204944206d69736d61746368000000000000000000000000005f82015250565b5f612932601383611e1c565b915061293d826128fe565b602082019050919050565b5f6020820190508181035f83015261295f81612926565b9050919050565b7f4e6f2072616e646f6d20776f72647300000000000000000000000000000000005f82015250565b5f61299a600f83611e1c565b91506129a582612966565b602082019050919050565b5f6020820190508181035f8301526129c78161298e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f612a2f601f83611e1c565b9150612a3a826129fb565b602082019050919050565b5f6020820190508181035f830152612a5c81612a23565b9050919050565b612a6c81612258565b82525050565b612a7b81611e94565b82525050565b612a8a816123c6565b82525050565b612a998161203c565b82525050565b5f82825260208201905092915050565b5f612ab982612289565b612ac38185612a9f565b9350612ad38185602086016122a3565b612adc816122b1565b840191505092915050565b5f60c083015f830151612afc5f860182612a63565b506020830151612b0f6020860182612a72565b506040830151612b226040860182612a81565b506060830151612b356060860182612a90565b506080830151612b486080860182612a90565b5060a083015184820360a0860152612b608282612aaf565b9150508091505092915050565b5f6020820190508181035f830152612b858184612ae7565b905092915050565b5f81519050612b9b81611f54565b92915050565b5f60208284031215612bb657612bb5611f4c565b5b5f612bc384828501612b8d565b91505092915050565b7f4e6f207061727469636970616e747320746f2073656c6563742066726f6d2e005f82015250565b5f612c00601f83611e1c565b9150612c0b82612bcc565b602082019050919050565b5f6020820190508181035f830152612c2d81612bf4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612c6b82611e94565b9150612c7683611e94565b925082612c8657612c85612c34565b5b828206905092915050565b5f81905092915050565b50565b5f612ca95f83612c91565b9150612cb482612c9b565b5f82019050919050565b5f612cc882612c9e565b9150819050919050565b7f5072697a65207472616e73666572206661696c656400000000000000000000005f82015250565b5f612d06601583611e1c565b9150612d1182612cd2565b602082019050919050565b5f6020820190508181035f830152612d3381612cfa565b9050919050565b612d4381612073565b8114612d4d575f5ffd5b50565b5f81519050612d5e81612d3a565b92915050565b5f60208284031215612d7957612d78611f4c565b5b5f612d8684828501612d50565b91505092915050565b7f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000005f82015250565b5f612dc3601683611e1c565b9150612dce82612d8f565b602082019050919050565b5f6020820190508181035f830152612df081612db7565b9050919050565b7f43616e6e6f74207472616e7366657220746f2073656c660000000000000000005f82015250565b5f612e2b601783611e1c565b9150612e3682612df7565b602082019050919050565b5f6020820190508181035f830152612e5881612e1f565b9050919050565b612e6881612073565b82525050565b602082015f820151612e825f850182612e5f565b50505050565b5f602082019050612e9b5f830184612e6e565b9291505056fea2646970667358221220ec833844115ee15bd63c6f86ad6d27f2ee99ea5eedab6307e84de7a8bb61153b64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c76d496182b8b01570a6b96cc119bd9d32a336bf000000000000000000000000d7f86b4b8cae7d942340ff628f82735b7a20893a3fd2fec10d06ee8f65e7f2e95f5c56511359ece3f33960ad8a866ae24a8ff10b71294dc38497c5b605a2ebcd4737285aaa3cbc8eaa8e5da95f02be12728162ef000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000003e871b540c000000000000000000000000000b92bb99c271883146acdc494e4443c44285a2a33
-----Decoded View---------------
Arg [0] : _token (address): 0xC76d496182b8b01570A6B96cc119bD9D32A336Bf
Arg [1] : _vrfCoordinatorV2_5 (address): 0xD7f86b4b8Cae7D942340FF628F82735b7a20893a
Arg [2] : _keyHash (bytes32): 0x3fd2fec10d06ee8f65e7f2e95f5c56511359ece3f33960ad8a866ae24a8ff10b
Arg [3] : _subscriptionId (uint256): 51184329325186976618138801153541098424697853980244711292537652753528166376175
Arg [4] : _burnDuration (uint256): 172800
Arg [5] : _minimumEthForStart (uint256): 1100000000000000
Arg [6] : _designatedWallet (address): 0xB92BB99C271883146acdc494e4443c44285A2A33
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000c76d496182b8b01570a6b96cc119bd9d32a336bf
Arg [1] : 000000000000000000000000d7f86b4b8cae7d942340ff628f82735b7a20893a
Arg [2] : 3fd2fec10d06ee8f65e7f2e95f5c56511359ece3f33960ad8a866ae24a8ff10b
Arg [3] : 71294dc38497c5b605a2ebcd4737285aaa3cbc8eaa8e5da95f02be12728162ef
Arg [4] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [5] : 0000000000000000000000000000000000000000000000000003e871b540c000
Arg [6] : 000000000000000000000000b92bb99c271883146acdc494e4443c44285a2a33
Deployed Bytecode Sourcemap
27307:8210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33199:16;;;;;;;;;;;33185:30;;:10;:30;;;33177:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33263:9;33252:7;;:20;;;;;;;:::i;:::-;;;;;;;;33301:10;33288:35;;;33313:9;33288:35;;;;;;:::i;:::-;;;;;;;;33406:13;;;;;;;;;;;33405:14;:61;;;;;33448:18;;33423:21;:43;;33405:61;33401:264;;;33499:4;33483:13;;:20;;;;;;;;;;;;;;;;;;33530:15;33518:9;:27;;;;33588:12;;33570:15;:30;;;;:::i;:::-;33560:7;:40;;;;33620:33;33634:9;;33645:7;;33620:33;;;;;;;:::i;:::-;;;;;;;;33401:264;27307:8210;;;;;28129:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28458:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26378:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28016:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27753:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28377:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27617:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27579:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28095:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30026:606;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34494:1020;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28417:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30640:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27904:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33680:806;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;27467:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28232:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17461:325;;;;;;;;;;;;;:::i;:::-;;28062:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27498:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27527:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27933:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17829:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26730:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27433:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27785:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24934:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28160:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27971:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28283:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28340:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27825:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27724:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17277:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27407:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27671:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28129:24;;;;:::o;28458:49::-;28506:1;28458:49;:::o;26378:285::-;26502:16;;;;;;;;;;;26480:39;;:10;:39;;;26476:133;;26563:10;26583:16;;;;;;;;;;;26537:64;;;;;;;;;;;;:::i;:::-;;;;;;;;26476:133;26615:42;26634:9;26645:11;;26615:18;:42::i;:::-;26378:285;;;:::o;28016:39::-;;;;;;;;;;;;;:::o;27753:25::-;;;;;;;;;;;;;:::o;28377:33::-;;;;:::o;27617:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;27579:31::-;;;;:::o;28095:27::-;;;;:::o;30026:606::-;5267:21;:19;:21::i;:::-;30155:5:::1;;;;;;;;;;;30133:28;;:10;:28;;;30125:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;30231:13;;;;;;;;;;;30223:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;30313:7;;30294:15;:26;;30286:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30377:13;;30367:6;:23;;30359:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;30478:6;30450:11;:24;30462:11;30450:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;30528:11;30495:12;:30;30508:16;;30495:30;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;30550:16;;:18;;;;;;;;;:::i;:::-;;;;;;30604:11;30586:38;;;30617:6;30586:38;;;;;;:::i;:::-;;;;;;;;5311:20:::0;:18;:20::i;:::-;30026:606;;:::o;34494:1020::-;5267:21;:19;:21::i;:::-;34584:19:::1;;;;;;;;;;;34583:20;34575:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34657:13;;;;;;;;;;;34649:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;34806:7;;34788:15;:25;:57;;;;;28273:2;34817:11;;:28;34788:57;34784:260;;;34881:1;34866:11;;:16;:76;;;;28326:7;34905:18;;:37;;;;:::i;:::-;34886:15;:56;;34866:76;34862:171;;;34963:29;:27;:29::i;:::-;35011:7;;34862:171;34784:260;35166:7;;35148:15;:25;:58;;;;;28273:2;35177:11;;:29;;35148:58;:75;;;;;35211:12;;;;;;;;;;;35210:13;35148:75;35144:363;;;35255:4;35240:12;;:19;;;;;;;;;;;;;;;;;;28506:1;35380:12;:36;;;;:::i;:::-;35370:47;35362:56;;35347:12;:71;;;;35433:14;:12;:14::i;:::-;35467:28;35479:15;35467:28;;;;;;:::i;:::-;;;;;;;;35144:363;5299:1;5311:20:::0;:18;:20::i;:::-;34494:1020;;:::o;28417:32::-;;;;;;;;;;;;;:::o;30640:285::-;30707:19;30728:20;30777:16;;30769:5;:24;30761:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30848:12;:19;30861:5;30848:19;;;;;;;;;;;;;;;;;;;;;30834:33;;30893:11;:24;30905:11;30893:24;;;;;;;;;;;;;;;;30878:39;;30640:285;;;:::o;27904:22::-;;;;:::o;33680:806::-;33785:17;33804:12;33839:13;;;;;;;;;;;33838:14;:39;;;;33876:1;33856:16;;:21;33838:39;:62;;;;33881:19;;;;;;;;;;;33838:62;33834:605;;;33932:5;33917:20;;33834:605;;;33977:7;;33959:15;:25;:49;;;;;33989:19;;;;;;;;;;;33988:20;33959:49;33955:484;;;34044:1;34029:11;;:16;34025:403;;34081:4;34066:19;;34025:403;;;28273:2;34111:11;;:28;:88;;;;;28326:7;34162:18;;:37;;;;:::i;:::-;34143:15;:56;;34111:88;34107:321;;;34235:4;34220:19;;34107:321;;;28273:2;34265:11;;:29;;:46;;;;;34299:12;;;;;;;;;;;34298:13;34265:46;34261:167;;;34347:4;34332:19;;34261:167;;;34407:5;34392:20;;34261:167;34107:321;34025:403;33955:484;33834:605;34459:12;34451:27;;;;;;;;;;;;;;;;;;;;;33680:806;;;;;:::o;27467:24::-;;;;:::o;28232:43::-;28273:2;28232:43;:::o;17461:325::-;17587:14;;;;;;;;;;;17573:28;;:10;:28;;;17565:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;17637:16;17656:7;;;;;;;;;;;17637:26;;17680:10;17670:7;;:20;;;;;;;;;;;;;;;;;;17722:1;17697:14;;:27;;;;;;;;;;;;;;;;;;17769:10;17738:42;;17759:8;17738:42;;;;;;;;;;;;17506:280;17461:325::o;28062:26::-;;;;;;;;;;;;;:::o;27498:22::-;;;;:::o;27527:44::-;;;;:::o;27933:31::-;;;;:::o;17829:83::-;17876:7;17899;;;;;;;;;;;17892:14;;17829:83;:::o;26730:283::-;27078:7;:5;:7::i;:::-;27064:21;;:10;:21;;;;:64;;;;;27111:16;;;;;;;;;;;27089:39;;:10;:39;;;;27064:64;27060:164;;;27169:10;27181:7;:5;:7::i;:::-;27198:16;;;;;;;;;;;27146:70;;;;;;;;;;;;;:::i;:::-;;;;;;;;27060:164;26858:1:::1;26831:29;;:15;:29;;::::0;26827:72:::1;;26878:13;;;;;;;;;;;;;;26827:72;26946:15;26905:16;;:57;;;;;;;;;;;;;;;;;;26976:31;26991:15;26976:31;;;;;;:::i;:::-;;;;;;;;26730:283:::0;:::o;27433:27::-;;;;:::o;27785:33::-;;;;:::o;24934:45::-;;;;;;;;;;;;;:::o;28160:39::-;;;;;;;;;;;;;:::o;27971:38::-;;;;;;;;;;;;;:::o;28283:50::-;28326:7;28283:50;:::o;28340:30::-;;;;:::o;27825:31::-;;;;;;;;;;;;;:::o;27724:22::-;;;;:::o;17277:100::-;18544:20;:18;:20::i;:::-;17349:22:::1;17368:2;17349:18;:22::i;:::-;17277:100:::0;:::o;27407:19::-;;;;;;;;;;;;;:::o;27671:46::-;;;;;;;;;;;;;;;;;:::o;31750:431::-;31868:12;;;;;;;;;;;31867:13;31859:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;31931:9;;31917:10;:23;31909:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32004:1;31983:11;;:18;;:22;31975:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;32060:4;32038:19;;:26;;;;;;;;;;;;;;;;;;32090:11;;32102:1;32090:14;;;;;;;:::i;:::-;;;;;;;;32075:12;:29;;;;32115:14;:12;:14::i;:::-;32145:28;32157:15;32145:28;;;;;;:::i;:::-;;;;;;;;31750:431;;;:::o;5347:293::-;4749:1;5481:7;;:19;5473:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4749:1;5614:7;:18;;;;5347:293::o;5648:213::-;4705:1;5831:7;:22;;;;5648:213::o;30933:647::-;31004:16;;;;;;;;;;;:35;;;31054:390;;;;;;;;31117:7;;31054:390;;;;31150:16;;31054:390;;;;31297:20;;;;;;;;;;;31054:390;;;;;;31203:16;;;;;;;;;;;31054:390;;;;;;31248:8;;;;;;;;;;;31054:390;;;;;;31347:81;31376:51;;;;;;;;31420:5;31376:51;;;;;31347:28;:81::i;:::-;31054:390;;;31004:451;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30992:9;:463;;;;31471:30;31491:9;;31471:30;;;;;;:::i;:::-;;;;;;;;31512:11;;:13;;;;;;;;;:::i;:::-;;;;;;31557:15;31536:18;:36;;;;30933:647::o;32189:942::-;5267:21;:19;:21::i;:::-;32272:1:::1;32253:16;;:20;32245:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;32322:19;32359:16;;32344:12;;:31;;;;:::i;:::-;32322:53;;32386:22;32419:12;:25;32432:11;32419:25;;;;;;;;;;;;;;;;;;;;;32386:59;;32456:13;32472:7;;32456:23;;32500:1;32490:7;:11;;;;32556:12;32574:6;:11;;32593:5;32574:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32555:48;;;32622:7;32614:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;32688:6;32673:29;;;32696:5;32673:29;;;;;;:::i;:::-;;;;;;;;32815:28;32846:5;;;;;;;;;;;:15;;;32870:4;32846:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32815:61;;32914:1;32891:20;:24;32887:237;;;32984:19;33006:42;32984:64;;33063:5;;;;;;;;;;;:14;;;33078:11;33091:20;33063:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32917:207;32887:237;32234:897;;;;;5311:20:::0;:18;:20::i;:::-;32189:942::o;18271:165::-;18396:7;;;;;;;;;;;18382:21;;:10;:21;;;18374:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;18271:165::o;17988:246::-;18109:10;18103:16;;:2;:16;;;18095:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;18173:2;18156:14;;:19;;;;;;;;;;;;;;;;;;18225:2;18189:39;;18216:7;;;;;;;;;;;18189:39;;;;;;;;;;;;17988:246;:::o;9142:165::-;9217:16;8864:28;9291:9;9249:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9242:59;;9142:165;;;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:171::-;322:23;318:1;310:6;306:14;299:47;182:171;:::o;359:366::-;501:3;522:67;586:2;581:3;522:67;:::i;:::-;515:74;;598:93;687:3;598:93;:::i;:::-;716:2;711:3;707:12;700:19;;359:366;;;:::o;731:419::-;897:4;935:2;924:9;920:18;912:26;;984:9;978:4;974:20;970:1;959:9;955:17;948:47;1012:131;1138:4;1012:131;:::i;:::-;1004:139;;731:419;;;:::o;1156:77::-;1193:7;1222:5;1211:16;;1156:77;;;:::o;1239:180::-;1287:77;1284:1;1277:88;1384:4;1381:1;1374:15;1408:4;1405:1;1398:15;1425:191;1465:3;1484:20;1502:1;1484:20;:::i;:::-;1479:25;;1518:20;1536:1;1518:20;:::i;:::-;1513:25;;1561:1;1558;1554:9;1547:16;;1582:3;1579:1;1576:10;1573:36;;;1589:18;;:::i;:::-;1573:36;1425:191;;;;:::o;1622:118::-;1709:24;1727:5;1709:24;:::i;:::-;1704:3;1697:37;1622:118;;:::o;1746:222::-;1839:4;1877:2;1866:9;1862:18;1854:26;;1890:71;1958:1;1947:9;1943:17;1934:6;1890:71;:::i;:::-;1746:222;;;;:::o;1974:332::-;2095:4;2133:2;2122:9;2118:18;2110:26;;2146:71;2214:1;2203:9;2199:17;2190:6;2146:71;:::i;:::-;2227:72;2295:2;2284:9;2280:18;2271:6;2227:72;:::i;:::-;1974:332;;;;;:::o;2393:117::-;2502:1;2499;2492:12;2516:117;2625:1;2622;2615:12;2639:122;2712:24;2730:5;2712:24;:::i;:::-;2705:5;2702:35;2692:63;;2751:1;2748;2741:12;2692:63;2639:122;:::o;2767:139::-;2813:5;2851:6;2838:20;2829:29;;2867:33;2894:5;2867:33;:::i;:::-;2767:139;;;;:::o;2912:117::-;3021:1;3018;3011:12;3035:117;3144:1;3141;3134:12;3158:117;3267:1;3264;3257:12;3298:568;3371:8;3381:6;3431:3;3424:4;3416:6;3412:17;3408:27;3398:122;;3439:79;;:::i;:::-;3398:122;3552:6;3539:20;3529:30;;3582:18;3574:6;3571:30;3568:117;;;3604:79;;:::i;:::-;3568:117;3718:4;3710:6;3706:17;3694:29;;3772:3;3764:4;3756:6;3752:17;3742:8;3738:32;3735:41;3732:128;;;3779:79;;:::i;:::-;3732:128;3298:568;;;;;:::o;3872:704::-;3967:6;3975;3983;4032:2;4020:9;4011:7;4007:23;4003:32;4000:119;;;4038:79;;:::i;:::-;4000:119;4158:1;4183:53;4228:7;4219:6;4208:9;4204:22;4183:53;:::i;:::-;4173:63;;4129:117;4313:2;4302:9;4298:18;4285:32;4344:18;4336:6;4333:30;4330:117;;;4366:79;;:::i;:::-;4330:117;4479:80;4551:7;4542:6;4531:9;4527:22;4479:80;:::i;:::-;4461:98;;;;4256:313;3872:704;;;;;:::o;4582:93::-;4618:7;4658:10;4651:5;4647:22;4636:33;;4582:93;;;:::o;4681:115::-;4766:23;4783:5;4766:23;:::i;:::-;4761:3;4754:36;4681:115;;:::o;4802:218::-;4893:4;4931:2;4920:9;4916:18;4908:26;;4944:69;5010:1;4999:9;4995:17;4986:6;4944:69;:::i;:::-;4802:218;;;;:::o;5026:90::-;5060:7;5103:5;5096:13;5089:21;5078:32;;5026:90;;;:::o;5122:109::-;5203:21;5218:5;5203:21;:::i;:::-;5198:3;5191:34;5122:109;;:::o;5237:210::-;5324:4;5362:2;5351:9;5347:18;5339:26;;5375:65;5437:1;5426:9;5422:17;5413:6;5375:65;:::i;:::-;5237:210;;;;:::o;5453:329::-;5512:6;5561:2;5549:9;5540:7;5536:23;5532:32;5529:119;;;5567:79;;:::i;:::-;5529:119;5687:1;5712:53;5757:7;5748:6;5737:9;5733:22;5712:53;:::i;:::-;5702:63;;5658:117;5453:329;;;;:::o;5788:126::-;5825:7;5865:42;5858:5;5854:54;5843:65;;5788:126;;;:::o;5920:96::-;5957:7;5986:24;6004:5;5986:24;:::i;:::-;5975:35;;5920:96;;;:::o;6022:118::-;6109:24;6127:5;6109:24;:::i;:::-;6104:3;6097:37;6022:118;;:::o;6146:222::-;6239:4;6277:2;6266:9;6262:18;6254:26;;6290:71;6358:1;6347:9;6343:17;6334:6;6290:71;:::i;:::-;6146:222;;;;:::o;6374:122::-;6447:24;6465:5;6447:24;:::i;:::-;6440:5;6437:35;6427:63;;6486:1;6483;6476:12;6427:63;6374:122;:::o;6502:139::-;6548:5;6586:6;6573:20;6564:29;;6602:33;6629:5;6602:33;:::i;:::-;6502:139;;;;:::o;6647:474::-;6715:6;6723;6772:2;6760:9;6751:7;6747:23;6743:32;6740:119;;;6778:79;;:::i;:::-;6740:119;6898:1;6923:53;6968:7;6959:6;6948:9;6944:22;6923:53;:::i;:::-;6913:63;;6869:117;7025:2;7051:53;7096:7;7087:6;7076:9;7072:22;7051:53;:::i;:::-;7041:63;;6996:118;6647:474;;;;;:::o;7140:552::-;7197:8;7207:6;7257:3;7250:4;7242:6;7238:17;7234:27;7224:122;;7265:79;;:::i;:::-;7224:122;7378:6;7365:20;7355:30;;7408:18;7400:6;7397:30;7394:117;;;7430:79;;:::i;:::-;7394:117;7544:4;7536:6;7532:17;7520:29;;7598:3;7590:4;7582:6;7578:17;7568:8;7564:32;7561:41;7558:128;;;7605:79;;:::i;:::-;7558:128;7140:552;;;;;:::o;7698:527::-;7768:6;7776;7825:2;7813:9;7804:7;7800:23;7796:32;7793:119;;;7831:79;;:::i;:::-;7793:119;7979:1;7968:9;7964:17;7951:31;8009:18;8001:6;7998:30;7995:117;;;8031:79;;:::i;:::-;7995:117;8144:64;8200:7;8191:6;8180:9;8176:22;8144:64;:::i;:::-;8126:82;;;;7922:296;7698:527;;;;;:::o;8231:332::-;8352:4;8390:2;8379:9;8375:18;8367:26;;8403:71;8471:1;8460:9;8456:17;8447:6;8403:71;:::i;:::-;8484:72;8552:2;8541:9;8537:18;8528:6;8484:72;:::i;:::-;8231:332;;;;;:::o;8569:77::-;8606:7;8635:5;8624:16;;8569:77;;;:::o;8652:118::-;8739:24;8757:5;8739:24;:::i;:::-;8734:3;8727:37;8652:118;;:::o;8776:222::-;8869:4;8907:2;8896:9;8892:18;8884:26;;8920:71;8988:1;8977:9;8973:17;8964:6;8920:71;:::i;:::-;8776:222;;;;:::o;9004:98::-;9055:6;9089:5;9083:12;9073:22;;9004:98;;;:::o;9108:168::-;9191:11;9225:6;9220:3;9213:19;9265:4;9260:3;9256:14;9241:29;;9108:168;;;;:::o;9282:139::-;9371:6;9366:3;9361;9355:23;9412:1;9403:6;9398:3;9394:16;9387:27;9282:139;;;:::o;9427:102::-;9468:6;9519:2;9515:7;9510:2;9503:5;9499:14;9495:28;9485:38;;9427:102;;;:::o;9535:373::-;9621:3;9649:38;9681:5;9649:38;:::i;:::-;9703:70;9766:6;9761:3;9703:70;:::i;:::-;9696:77;;9782:65;9840:6;9835:3;9828:4;9821:5;9817:16;9782:65;:::i;:::-;9872:29;9894:6;9872:29;:::i;:::-;9867:3;9863:39;9856:46;;9625:283;9535:373;;;;:::o;9914:407::-;10047:4;10085:2;10074:9;10070:18;10062:26;;10098:65;10160:1;10149:9;10145:17;10136:6;10098:65;:::i;:::-;10210:9;10204:4;10200:20;10195:2;10184:9;10180:18;10173:48;10238:76;10309:4;10300:6;10238:76;:::i;:::-;10230:84;;9914:407;;;;;:::o;10327:329::-;10386:6;10435:2;10423:9;10414:7;10410:23;10406:32;10403:119;;;10441:79;;:::i;:::-;10403:119;10561:1;10586:53;10631:7;10622:6;10611:9;10607:22;10586:53;:::i;:::-;10576:63;;10532:117;10327:329;;;;:::o;10662:60::-;10690:3;10711:5;10704:12;;10662:60;;;:::o;10728:142::-;10778:9;10811:53;10829:34;10838:24;10856:5;10838:24;:::i;:::-;10829:34;:::i;:::-;10811:53;:::i;:::-;10798:66;;10728:142;;;:::o;10876:126::-;10926:9;10959:37;10990:5;10959:37;:::i;:::-;10946:50;;10876:126;;;:::o;11008:155::-;11087:9;11120:37;11151:5;11120:37;:::i;:::-;11107:50;;11008:155;;;:::o;11169:189::-;11285:66;11345:5;11285:66;:::i;:::-;11280:3;11273:79;11169:189;;:::o;11364:280::-;11486:4;11524:2;11513:9;11509:18;11501:26;;11537:100;11634:1;11623:9;11619:17;11610:6;11537:100;:::i;:::-;11364:280;;;;:::o;11650:89::-;11686:7;11726:6;11719:5;11715:18;11704:29;;11650:89;;;:::o;11745:115::-;11830:23;11847:5;11830:23;:::i;:::-;11825:3;11818:36;11745:115;;:::o;11866:218::-;11957:4;11995:2;11984:9;11980:18;11972:26;;12008:69;12074:1;12063:9;12059:17;12050:6;12008:69;:::i;:::-;11866:218;;;;:::o;12090:139::-;12153:9;12186:37;12217:5;12186:37;:::i;:::-;12173:50;;12090:139;;;:::o;12235:157::-;12335:50;12379:5;12335:50;:::i;:::-;12330:3;12323:63;12235:157;;:::o;12398:248::-;12504:4;12542:2;12531:9;12527:18;12519:26;;12555:84;12636:1;12625:9;12621:17;12612:6;12555:84;:::i;:::-;12398:248;;;;:::o;12652:332::-;12773:4;12811:2;12800:9;12796:18;12788:26;;12824:71;12892:1;12881:9;12877:17;12868:6;12824:71;:::i;:::-;12905:72;12973:2;12962:9;12958:18;12949:6;12905:72;:::i;:::-;12652:332;;;;;:::o;12990:233::-;13130:34;13126:1;13118:6;13114:14;13107:58;13199:16;13194:2;13186:6;13182:15;13175:41;12990:233;:::o;13229:366::-;13371:3;13392:67;13456:2;13451:3;13392:67;:::i;:::-;13385:74;;13468:93;13557:3;13468:93;:::i;:::-;13586:2;13581:3;13577:12;13570:19;;13229:366;;;:::o;13601:419::-;13767:4;13805:2;13794:9;13790:18;13782:26;;13854:9;13848:4;13844:20;13840:1;13829:9;13825:17;13818:47;13882:131;14008:4;13882:131;:::i;:::-;13874:139;;13601:419;;;:::o;14026:176::-;14166:28;14162:1;14154:6;14150:14;14143:52;14026:176;:::o;14208:366::-;14350:3;14371:67;14435:2;14430:3;14371:67;:::i;:::-;14364:74;;14447:93;14536:3;14447:93;:::i;:::-;14565:2;14560:3;14556:12;14549:19;;14208:366;;;:::o;14580:419::-;14746:4;14784:2;14773:9;14769:18;14761:26;;14833:9;14827:4;14823:20;14819:1;14808:9;14804:17;14797:47;14861:131;14987:4;14861:131;:::i;:::-;14853:139;;14580:419;;;:::o;15005:173::-;15145:25;15141:1;15133:6;15129:14;15122:49;15005:173;:::o;15184:366::-;15326:3;15347:67;15411:2;15406:3;15347:67;:::i;:::-;15340:74;;15423:93;15512:3;15423:93;:::i;:::-;15541:2;15536:3;15532:12;15525:19;;15184:366;;;:::o;15556:419::-;15722:4;15760:2;15749:9;15745:18;15737:26;;15809:9;15803:4;15799:20;15795:1;15784:9;15780:17;15773:47;15837:131;15963:4;15837:131;:::i;:::-;15829:139;;15556:419;;;:::o;15981:229::-;16121:34;16117:1;16109:6;16105:14;16098:58;16190:12;16185:2;16177:6;16173:15;16166:37;15981:229;:::o;16216:366::-;16358:3;16379:67;16443:2;16438:3;16379:67;:::i;:::-;16372:74;;16455:93;16544:3;16455:93;:::i;:::-;16573:2;16568:3;16564:12;16557:19;;16216:366;;;:::o;16588:419::-;16754:4;16792:2;16781:9;16777:18;16769:26;;16841:9;16835:4;16831:20;16827:1;16816:9;16812:17;16805:47;16869:131;16995:4;16869:131;:::i;:::-;16861:139;;16588:419;;;:::o;17013:233::-;17052:3;17075:24;17093:5;17075:24;:::i;:::-;17066:33;;17121:66;17114:5;17111:77;17108:103;;17191:18;;:::i;:::-;17108:103;17238:1;17231:5;17227:13;17220:20;;17013:233;;;:::o;17252:180::-;17392:32;17388:1;17380:6;17376:14;17369:56;17252:180;:::o;17438:366::-;17580:3;17601:67;17665:2;17660:3;17601:67;:::i;:::-;17594:74;;17677:93;17766:3;17677:93;:::i;:::-;17795:2;17790:3;17786:12;17779:19;;17438:366;;;:::o;17810:419::-;17976:4;18014:2;18003:9;17999:18;17991:26;;18063:9;18057:4;18053:20;18049:1;18038:9;18034:17;18027:47;18091:131;18217:4;18091:131;:::i;:::-;18083:139;;17810:419;;;:::o;18235:168::-;18375:20;18371:1;18363:6;18359:14;18352:44;18235:168;:::o;18409:366::-;18551:3;18572:67;18636:2;18631:3;18572:67;:::i;:::-;18565:74;;18648:93;18737:3;18648:93;:::i;:::-;18766:2;18761:3;18757:12;18750:19;;18409:366;;;:::o;18781:419::-;18947:4;18985:2;18974:9;18970:18;18962:26;;19034:9;19028:4;19024:20;19020:1;19009:9;19005:17;18998:47;19062:131;19188:4;19062:131;:::i;:::-;19054:139;;18781:419;;;:::o;19206:194::-;19246:4;19266:20;19284:1;19266:20;:::i;:::-;19261:25;;19300:20;19318:1;19300:20;:::i;:::-;19295:25;;19344:1;19341;19337:9;19329:17;;19368:1;19362:4;19359:11;19356:37;;;19373:18;;:::i;:::-;19356:37;19206:194;;;;:::o;19406:175::-;19546:27;19542:1;19534:6;19530:14;19523:51;19406:175;:::o;19587:366::-;19729:3;19750:67;19814:2;19809:3;19750:67;:::i;:::-;19743:74;;19826:93;19915:3;19826:93;:::i;:::-;19944:2;19939:3;19935:12;19928:19;;19587:366;;;:::o;19959:419::-;20125:4;20163:2;20152:9;20148:18;20140:26;;20212:9;20206:4;20202:20;20198:1;20187:9;20183:17;20176:47;20240:131;20366:4;20240:131;:::i;:::-;20232:139;;19959:419;;;:::o;20384:172::-;20524:24;20520:1;20512:6;20508:14;20501:48;20384:172;:::o;20562:366::-;20704:3;20725:67;20789:2;20784:3;20725:67;:::i;:::-;20718:74;;20801:93;20890:3;20801:93;:::i;:::-;20919:2;20914:3;20910:12;20903:19;;20562:366;;;:::o;20934:419::-;21100:4;21138:2;21127:9;21123:18;21115:26;;21187:9;21181:4;21177:20;21173:1;21162:9;21158:17;21151:47;21215:131;21341:4;21215:131;:::i;:::-;21207:139;;20934:419;;;:::o;21359:442::-;21508:4;21546:2;21535:9;21531:18;21523:26;;21559:71;21627:1;21616:9;21612:17;21603:6;21559:71;:::i;:::-;21640:72;21708:2;21697:9;21693:18;21684:6;21640:72;:::i;:::-;21722;21790:2;21779:9;21775:18;21766:6;21722:72;:::i;:::-;21359:442;;;;;;:::o;21807:163::-;21947:15;21943:1;21935:6;21931:14;21924:39;21807:163;:::o;21976:366::-;22118:3;22139:67;22203:2;22198:3;22139:67;:::i;:::-;22132:74;;22215:93;22304:3;22215:93;:::i;:::-;22333:2;22328:3;22324:12;22317:19;;21976:366;;;:::o;22348:419::-;22514:4;22552:2;22541:9;22537:18;22529:26;;22601:9;22595:4;22591:20;22587:1;22576:9;22572:17;22565:47;22629:131;22755:4;22629:131;:::i;:::-;22621:139;;22348:419;;;:::o;22773:169::-;22913:21;22909:1;22901:6;22897:14;22890:45;22773:169;:::o;22948:366::-;23090:3;23111:67;23175:2;23170:3;23111:67;:::i;:::-;23104:74;;23187:93;23276:3;23187:93;:::i;:::-;23305:2;23300:3;23296:12;23289:19;;22948:366;;;:::o;23320:419::-;23486:4;23524:2;23513:9;23509:18;23501:26;;23573:9;23567:4;23563:20;23559:1;23548:9;23544:17;23537:47;23601:131;23727:4;23601:131;:::i;:::-;23593:139;;23320:419;;;:::o;23745:165::-;23885:17;23881:1;23873:6;23869:14;23862:41;23745:165;:::o;23916:366::-;24058:3;24079:67;24143:2;24138:3;24079:67;:::i;:::-;24072:74;;24155:93;24244:3;24155:93;:::i;:::-;24273:2;24268:3;24264:12;24257:19;;23916:366;;;:::o;24288:419::-;24454:4;24492:2;24481:9;24477:18;24469:26;;24541:9;24535:4;24531:20;24527:1;24516:9;24512:17;24505:47;24569:131;24695:4;24569:131;:::i;:::-;24561:139;;24288:419;;;:::o;24713:180::-;24761:77;24758:1;24751:88;24858:4;24855:1;24848:15;24882:4;24879:1;24872:15;24899:181;25039:33;25035:1;25027:6;25023:14;25016:57;24899:181;:::o;25086:366::-;25228:3;25249:67;25313:2;25308:3;25249:67;:::i;:::-;25242:74;;25325:93;25414:3;25325:93;:::i;:::-;25443:2;25438:3;25434:12;25427:19;;25086:366;;;:::o;25458:419::-;25624:4;25662:2;25651:9;25647:18;25639:26;;25711:9;25705:4;25701:20;25697:1;25686:9;25682:17;25675:47;25739:131;25865:4;25739:131;:::i;:::-;25731:139;;25458:419;;;:::o;25883:108::-;25960:24;25978:5;25960:24;:::i;:::-;25955:3;25948:37;25883:108;;:::o;25997:::-;26074:24;26092:5;26074:24;:::i;:::-;26069:3;26062:37;25997:108;;:::o;26111:105::-;26186:23;26203:5;26186:23;:::i;:::-;26181:3;26174:36;26111:105;;:::o;26222:::-;26297:23;26314:5;26297:23;:::i;:::-;26292:3;26285:36;26222:105;;:::o;26333:158::-;26406:11;26440:6;26435:3;26428:19;26480:4;26475:3;26471:14;26456:29;;26333:158;;;;:::o;26497:353::-;26573:3;26601:38;26633:5;26601:38;:::i;:::-;26655:60;26708:6;26703:3;26655:60;:::i;:::-;26648:67;;26724:65;26782:6;26777:3;26770:4;26763:5;26759:16;26724:65;:::i;:::-;26814:29;26836:6;26814:29;:::i;:::-;26809:3;26805:39;26798:46;;26577:273;26497:353;;;;:::o;26950:1355::-;27089:3;27125:4;27120:3;27116:14;27215:4;27208:5;27204:16;27198:23;27234:63;27291:4;27286:3;27282:14;27268:12;27234:63;:::i;:::-;27140:167;27390:4;27383:5;27379:16;27373:23;27409:63;27466:4;27461:3;27457:14;27443:12;27409:63;:::i;:::-;27317:165;27580:4;27573:5;27569:16;27563:23;27599:61;27654:4;27649:3;27645:14;27631:12;27599:61;:::i;:::-;27492:178;27764:4;27757:5;27753:16;27747:23;27783:61;27838:4;27833:3;27829:14;27815:12;27783:61;:::i;:::-;27680:174;27940:4;27933:5;27929:16;27923:23;27959:61;28014:4;28009:3;28005:14;27991:12;27959:61;:::i;:::-;27864:166;28117:4;28110:5;28106:16;28100:23;28170:3;28164:4;28160:14;28153:4;28148:3;28144:14;28137:38;28196:71;28262:4;28248:12;28196:71;:::i;:::-;28188:79;;28040:238;28295:4;28288:11;;27094:1211;26950:1355;;;;:::o;28311:413::-;28474:4;28512:2;28501:9;28497:18;28489:26;;28561:9;28555:4;28551:20;28547:1;28536:9;28532:17;28525:47;28589:128;28712:4;28703:6;28589:128;:::i;:::-;28581:136;;28311:413;;;;:::o;28730:143::-;28787:5;28818:6;28812:13;28803:22;;28834:33;28861:5;28834:33;:::i;:::-;28730:143;;;;:::o;28879:351::-;28949:6;28998:2;28986:9;28977:7;28973:23;28969:32;28966:119;;;29004:79;;:::i;:::-;28966:119;29124:1;29149:64;29205:7;29196:6;29185:9;29181:22;29149:64;:::i;:::-;29139:74;;29095:128;28879:351;;;;:::o;29236:181::-;29376:33;29372:1;29364:6;29360:14;29353:57;29236:181;:::o;29423:366::-;29565:3;29586:67;29650:2;29645:3;29586:67;:::i;:::-;29579:74;;29662:93;29751:3;29662:93;:::i;:::-;29780:2;29775:3;29771:12;29764:19;;29423:366;;;:::o;29795:419::-;29961:4;29999:2;29988:9;29984:18;29976:26;;30048:9;30042:4;30038:20;30034:1;30023:9;30019:17;30012:47;30076:131;30202:4;30076:131;:::i;:::-;30068:139;;29795:419;;;:::o;30220:180::-;30268:77;30265:1;30258:88;30365:4;30362:1;30355:15;30389:4;30386:1;30379:15;30406:176;30438:1;30455:20;30473:1;30455:20;:::i;:::-;30450:25;;30489:20;30507:1;30489:20;:::i;:::-;30484:25;;30528:1;30518:35;;30533:18;;:::i;:::-;30518:35;30574:1;30571;30567:9;30562:14;;30406:176;;;;:::o;30588:147::-;30689:11;30726:3;30711:18;;30588:147;;;;:::o;30741:114::-;;:::o;30861:398::-;31020:3;31041:83;31122:1;31117:3;31041:83;:::i;:::-;31034:90;;31133:93;31222:3;31133:93;:::i;:::-;31251:1;31246:3;31242:11;31235:18;;30861:398;;;:::o;31265:379::-;31449:3;31471:147;31614:3;31471:147;:::i;:::-;31464:154;;31635:3;31628:10;;31265:379;;;:::o;31650:171::-;31790:23;31786:1;31778:6;31774:14;31767:47;31650:171;:::o;31827:366::-;31969:3;31990:67;32054:2;32049:3;31990:67;:::i;:::-;31983:74;;32066:93;32155:3;32066:93;:::i;:::-;32184:2;32179:3;32175:12;32168:19;;31827:366;;;:::o;32199:419::-;32365:4;32403:2;32392:9;32388:18;32380:26;;32452:9;32446:4;32442:20;32438:1;32427:9;32423:17;32416:47;32480:131;32606:4;32480:131;:::i;:::-;32472:139;;32199:419;;;:::o;32624:116::-;32694:21;32709:5;32694:21;:::i;:::-;32687:5;32684:32;32674:60;;32730:1;32727;32720:12;32674:60;32624:116;:::o;32746:137::-;32800:5;32831:6;32825:13;32816:22;;32847:30;32871:5;32847:30;:::i;:::-;32746:137;;;;:::o;32889:345::-;32956:6;33005:2;32993:9;32984:7;32980:23;32976:32;32973:119;;;33011:79;;:::i;:::-;32973:119;33131:1;33156:61;33209:7;33200:6;33189:9;33185:22;33156:61;:::i;:::-;33146:71;;33102:125;32889:345;;;;:::o;33240:172::-;33380:24;33376:1;33368:6;33364:14;33357:48;33240:172;:::o;33418:366::-;33560:3;33581:67;33645:2;33640:3;33581:67;:::i;:::-;33574:74;;33657:93;33746:3;33657:93;:::i;:::-;33775:2;33770:3;33766:12;33759:19;;33418:366;;;:::o;33790:419::-;33956:4;33994:2;33983:9;33979:18;33971:26;;34043:9;34037:4;34033:20;34029:1;34018:9;34014:17;34007:47;34071:131;34197:4;34071:131;:::i;:::-;34063:139;;33790:419;;;:::o;34215:173::-;34355:25;34351:1;34343:6;34339:14;34332:49;34215:173;:::o;34394:366::-;34536:3;34557:67;34621:2;34616:3;34557:67;:::i;:::-;34550:74;;34633:93;34722:3;34633:93;:::i;:::-;34751:2;34746:3;34742:12;34735:19;;34394:366;;;:::o;34766:419::-;34932:4;34970:2;34959:9;34955:18;34947:26;;35019:9;35013:4;35009:20;35005:1;34994:9;34990:17;34983:47;35047:131;35173:4;35047:131;:::i;:::-;35039:139;;34766:419;;;:::o;35191:99::-;35262:21;35277:5;35262:21;:::i;:::-;35257:3;35250:34;35191:99;;:::o;35376:342::-;35529:4;35524:3;35520:14;35625:4;35618:5;35614:16;35608:23;35644:57;35695:4;35690:3;35686:14;35672:12;35644:57;:::i;:::-;35544:167;35498:220;35376:342;;:::o;35724:334::-;35873:4;35911:2;35900:9;35896:18;35888:26;;35924:127;36048:1;36037:9;36033:17;36024:6;35924:127;:::i;:::-;35724:334;;;;:::o
Swarm Source
ipfs://ec833844115ee15bd63c6f86ad6d27f2ee99ea5eedab6307e84de7a8bb61153b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.