Contract Overview
Balance:
0 ETH
Token:
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
CoinFlip_Link
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2023-05-24 */ // Sources flattened with hardhat v2.12.4 https://hardhat.org // File contracts/Games/CoinFlip/interfaces/TreasuryInterface.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface TreasuryInterface { function deposit( address _dapp, address _token, uint256 _amount ) external; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount ) external returns (bool); } // File @chainlink/contracts/src/v0.8/[email protected] 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 VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) 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 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), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator 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 VRFConsumerBase.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 VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _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 VRFConsumerBaseV2 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 */ function fulfillRandomWords(uint256 requestId, uint256[] memory 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[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @chainlink/contracts/src/v0.8/interfaces/[email protected] pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param 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. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - 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]. * @param 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] * @param 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. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @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, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request 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(uint64 subId) external; /** * @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(uint64 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(uint64 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(uint64 subId, address to) external; /* * @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(uint64 subId) external view returns (bool); } // File contracts/Games/CoinFlip/CoinFlip_Link.sol pragma solidity ^0.8.4; contract CoinFlip_Link is VRFConsumerBaseV2, Ownable { using SafeERC20 for IERC20; IERC20 public token; // CoinFlip token address public operatorAddress; address public treasuryAddress; uint256 public treasuryFee; // treasury rate (e.g. 200 = 2%, 150 = 1.50%) uint256 public houseBalance; uint256 public currentFlipId; //incrementing counter for the current flipId uint256 public minFlipAmount; //min flip amounts uint256 public maxFlipAmount; //max flip amounts bool public openForFlips = true; //global switch to disallow flips uint256 public constant MAX_TREASURY_FEE = 1000; // 10% uint256 public constant PERCENTAGE = 10000; // 100% VRFCoordinatorV2Interface public vrfCoordinator; uint32 public callbackGasLimit; bytes32 public keyHash; //link gas uint64 public subscriptionId; //self subscription id uint16 public requestConfirmations = 3; uint32 public constant numWords = 1; enum CoinSide { HEADS, // 0 TAILS // 1 } struct FlipInfo { address player; uint256 flipAmount; CoinSide headsOrTails; // 0 heads 1 tails uint256 requestId; uint256 randomNum; bool randomNumOngoing; //waiting for random number callback } mapping (uint256 => FlipInfo) public flipById; // flip id => flip info mapping (uint256 => uint256) public flipIdByRequestId; // flip request id => flip id mapping (address => uint256[]) public userFlipIds; // player => flip id event Flipped(address indexed player, uint256 indexed currentFlipId, uint256 indexed requestId, uint256 flipAmount, uint256 fees, CoinSide choice); event FlippCallback(uint256 indexed flipId, CoinSide flipResult); event ForceRequestWinner(address indexed sender, uint256 requestId, uint256 oldRequestId, uint256 flipId); event DepositedHouse(address indexed sender, uint256 depositAmount, uint256 newHouseBalance); event WithdrewHouse(address indexed sender, uint256 withdrewAmount, uint256 newHouseBalance); event RescuedContractBalance(address withdrawer, address token, uint256 amount); event NewOpenForFlips(bool openForFlips); event NewMinAndMaxFlipAmount(uint256 minFlipAmount, uint256 maxFlipAmount); event NewTreasuryFee(uint256 treasuryFee); event NewTreasuryAddress(address treasury); event NewOperatorAddress(address operator); modifier onlyOwnerOrOperator() { require(msg.sender == owner() || msg.sender == operatorAddress, "Not owner/operator"); _; } modifier notContract() { require(!_isContract(msg.sender), "Contract not allowed"); require(msg.sender == tx.origin, "Proxy contract not allowed"); _; } constructor( address _token, address _operatorAddress, address _treasuryAddress, uint256 _treasuryFee, uint256 _minFlipAmount, uint256 _maxFlipAmount, address _vrfCoordinatorV2, bytes32 _keyHash, uint64 _subscriptionId, uint32 _callbackGasLimit ) VRFConsumerBaseV2(_vrfCoordinatorV2) { token = IERC20(_token); operatorAddress = _operatorAddress; treasuryAddress = _treasuryAddress; treasuryFee = _treasuryFee; minFlipAmount = _minFlipAmount; //.1 ether; maxFlipAmount = _maxFlipAmount; //500 ether; vrfCoordinator = VRFCoordinatorV2Interface(_vrfCoordinatorV2); keyHash = _keyHash; subscriptionId = _subscriptionId; callbackGasLimit = _callbackGasLimit; } // The coin flip containing the random request function flip(uint256 _flipAmountAndFees, CoinSide _headsOrTails) external notContract returns (uint256, uint256) { require(openForFlips, "Flips are closed"); uint256 fees = (_flipAmountAndFees * treasuryFee) / PERCENTAGE; uint256 flipAmount = _flipAmountAndFees - fees; require(_flipAmountAndFees >= minFlipAmount, "amount must >= minFlipAmount"); require(_flipAmountAndFees <= maxFlipAmount, "amount must <= maxFlipAmount"); require(flipAmount <= houseBalance / 2, "amount must <= houseBalance/2"); //check house balance currentFlipId++; token.safeTransferFrom(msg.sender, address(this), _flipAmountAndFees); IERC20(address(token)).approve(treasuryAddress, fees); TreasuryInterface(treasuryAddress).deposit(address(this), address(token), fees); // Get the latest randomizer contract from the proxy // Request a random number from the randomizer contract (50k callback limit) uint256 requestId = vrfCoordinator.requestRandomWords( keyHash, subscriptionId, requestConfirmations, callbackGasLimit, numWords ); flipIdByRequestId[requestId] = currentFlipId; userFlipIds[msg.sender].push(currentFlipId); // You can also do randomizer.request(callbackGasLimit, 20) to get a callback after 20 confirmations for increased finality security (you can do 1-40 confirmations). // Store the flip ID and the player address flipById[currentFlipId].player = msg.sender; flipById[currentFlipId].flipAmount = flipAmount; flipById[currentFlipId].headsOrTails = _headsOrTails; flipById[currentFlipId].requestId = requestId; flipById[currentFlipId].randomNumOngoing = true; emit Flipped(msg.sender, currentFlipId, requestId, flipAmount, fees, _headsOrTails); // Return the flip ID return (currentFlipId, requestId); } // Callback function called by the randomizer contract when the random value is generated function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal override { uint256 flipId = flipIdByRequestId[_requestId]; require(flipById[flipId].randomNumOngoing, "already has flip result"); // Get the player address from the flip ID flipById[flipId].randomNumOngoing = false; flipById[flipId].randomNum = _randomWords[0]; CoinSide flipResult = uint256(_randomWords[0]) % 2 == 0 ? CoinSide.HEADS : CoinSide.TAILS; if (flipResult == flipById[flipId].headsOrTails) { houseBalance -= flipById[flipId].flipAmount; token.safeTransfer(flipById[flipId].player, flipById[flipId].flipAmount * 2); } else { houseBalance += flipById[flipId].flipAmount; } emit FlippCallback(flipId, flipResult); } //triggers VRF process for a given flip in case of emergency function forceRequestWinner(uint256 _flipId) external onlyOwner { uint256 oldRequestId = flipById[_flipId].requestId; require(flipById[_flipId].randomNumOngoing, "already has flip result"); uint256 requestId = vrfCoordinator.requestRandomWords( keyHash, subscriptionId, requestConfirmations, callbackGasLimit, numWords ); flipIdByRequestId[requestId] = _flipId; flipById[_flipId].requestId = requestId; emit ForceRequestWinner(msg.sender, requestId, oldRequestId, _flipId); } function depositHouse(uint256 _amount) external onlyOwnerOrOperator { token.safeTransferFrom(msg.sender, address(this), _amount); houseBalance += _amount; emit DepositedHouse(msg.sender, _amount, houseBalance); } function withdrawHouse(uint256 _amount) external onlyOwnerOrOperator { require(_amount <= houseBalance, "Insufficient Balance"); token.transfer(msg.sender, _amount); houseBalance -= _amount; emit WithdrewHouse(msg.sender, _amount, houseBalance); } //withdraws balance to contract owner in case of emergency function rescueContractBalance(address _tokenContract, uint256 _amount) external onlyOwner { if (_tokenContract != address(0)) { IERC20 tokenContract = IERC20(_tokenContract); tokenContract.transfer(msg.sender, _amount); } else { _safeTransferNativeToken(address(msg.sender), _amount); } emit RescuedContractBalance(msg.sender, _tokenContract, _amount); } function setRequestConfirmations(uint16 _requestConfirmations) public onlyOwner { requestConfirmations = _requestConfirmations; } function setCallbackGasLimit(uint32 _callbackGasLimit) public onlyOwner { callbackGasLimit = _callbackGasLimit; } function setKeyHash(bytes32 _keyHash) public onlyOwner { keyHash = _keyHash; } function setSubscriptionId(uint64 _subscriptionId) public onlyOwner { subscriptionId = _subscriptionId; } function setOpenForFlips(bool _openForFlips) public onlyOwner { openForFlips = _openForFlips; emit NewOpenForFlips(_openForFlips); } function setMinAndMaxFlipAmount(uint256 _minFlipAmount, uint256 _maxFlipAmount) external onlyOwner { require(_minFlipAmount > 0, "_minFlipAmount must > 0"); require(_maxFlipAmount > 0, "_maxFlipAmount must > 0"); require(_minFlipAmount < _maxFlipAmount, "_min must < _max"); minFlipAmount = _minFlipAmount; maxFlipAmount = _maxFlipAmount; emit NewMinAndMaxFlipAmount(_minFlipAmount, _maxFlipAmount); } /** * @notice Set treasury fee * @dev Callable by admin */ function setTreasuryFee(uint256 _treasuryFee) external onlyOwner { require(_treasuryFee <= MAX_TREASURY_FEE, "Treasury fee too high"); treasuryFee = _treasuryFee; emit NewTreasuryFee(treasuryFee); } /** * @notice Set treasury address * @dev Callable by owner */ function setTreasuryAddress(address _treasuryAddress) external onlyOwner { require(_treasuryAddress != address(0), "Cannot be zero address"); treasuryAddress = _treasuryAddress; emit NewTreasuryAddress(_treasuryAddress); } /** * @notice Set operator address * @dev Callable by admin */ function setOperator(address _operatorAddress) external onlyOwner { require(_operatorAddress != address(0), "Cannot be zero address"); operatorAddress = _operatorAddress; emit NewOperatorAddress(_operatorAddress); } function getUserFlipInfosLength(address _player) external view returns (uint256) { return userFlipIds[_player].length; } function getMultiUserFlipInfos( address player, uint256 cursor, uint256 size ) external view returns ( uint256[] memory, FlipInfo[] memory, uint256 ) { uint256 length = size; if (length > userFlipIds[player].length - cursor) { length = userFlipIds[player].length - cursor; } uint256[] memory tempUserFlipIds = new uint256[](length); FlipInfo[] memory tempFlipInfos = new FlipInfo[](length); for (uint256 i = 0; i < length; i++) { tempUserFlipIds[i] = userFlipIds[player][cursor + i]; tempFlipInfos[i] = flipById[tempUserFlipIds[i]]; } return (tempUserFlipIds, tempFlipInfos, cursor + length); } function getFlipInfosByFlipId(uint256 _flipId) external view returns ( uint256, FlipInfo memory ) { require(flipById[_flipId].player != address(0), "error flip id"); return (_flipId, flipById[_flipId]); } /** * @notice Returns true if `account` is a contract. * @param account: account address */ function _isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @notice Transfer Native Token in a safe way * @param to: address to transfer Native Token to * @param value: Native Token amount to transfer (in wei) */ function _safeTransferNativeToken(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(""); require(success, "NATIVE_TOKEN_TRANSFER_FAILED"); } }
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_minFlipAmount","type":"uint256"},{"internalType":"uint256","name":"_maxFlipAmount","type":"uint256"},{"internalType":"address","name":"_vrfCoordinatorV2","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"uint64","name":"_subscriptionId","type":"uint64"},{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newHouseBalance","type":"uint256"}],"name":"DepositedHouse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"flipId","type":"uint256"},{"indexed":false,"internalType":"enum CoinFlip_Link.CoinSide","name":"flipResult","type":"uint8"}],"name":"FlippCallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"currentFlipId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"flipAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"},{"indexed":false,"internalType":"enum CoinFlip_Link.CoinSide","name":"choice","type":"uint8"}],"name":"Flipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldRequestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"flipId","type":"uint256"}],"name":"ForceRequestWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minFlipAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxFlipAmount","type":"uint256"}],"name":"NewMinAndMaxFlipAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"openForFlips","type":"bool"}],"name":"NewOpenForFlips","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"NewOperatorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"NewTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"treasuryFee","type":"uint256"}],"name":"NewTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RescuedContractBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrewAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newHouseBalance","type":"uint256"}],"name":"WithdrewHouse","type":"event"},{"inputs":[],"name":"MAX_TREASURY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callbackGasLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentFlipId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositHouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flipAmountAndFees","type":"uint256"},{"internalType":"enum CoinFlip_Link.CoinSide","name":"_headsOrTails","type":"uint8"}],"name":"flip","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"flipById","outputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"flipAmount","type":"uint256"},{"internalType":"enum CoinFlip_Link.CoinSide","name":"headsOrTails","type":"uint8"},{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNum","type":"uint256"},{"internalType":"bool","name":"randomNumOngoing","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"flipIdByRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flipId","type":"uint256"}],"name":"forceRequestWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flipId","type":"uint256"}],"name":"getFlipInfosByFlipId","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"flipAmount","type":"uint256"},{"internalType":"enum CoinFlip_Link.CoinSide","name":"headsOrTails","type":"uint8"},{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNum","type":"uint256"},{"internalType":"bool","name":"randomNumOngoing","type":"bool"}],"internalType":"struct CoinFlip_Link.FlipInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"cursor","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"}],"name":"getMultiUserFlipInfos","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"flipAmount","type":"uint256"},{"internalType":"enum CoinFlip_Link.CoinSide","name":"headsOrTails","type":"uint8"},{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNum","type":"uint256"},{"internalType":"bool","name":"randomNumOngoing","type":"bool"}],"internalType":"struct CoinFlip_Link.FlipInfo[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_player","type":"address"}],"name":"getUserFlipInfosLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"houseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFlipAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minFlipAmount","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":"openForFlips","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestConfirmations","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueContractBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"}],"name":"setCallbackGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"name":"setKeyHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minFlipAmount","type":"uint256"},{"internalType":"uint256","name":"_maxFlipAmount","type":"uint256"}],"name":"setMinAndMaxFlipAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_openForFlips","type":"bool"}],"name":"setOpenForFlips","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_requestConfirmations","type":"uint16"}],"name":"setRequestConfirmations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_subscriptionId","type":"uint64"}],"name":"setSubscriptionId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userFlipIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfCoordinator","outputs":[{"internalType":"contract VRFCoordinatorV2Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawHouse","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526009805460ff19166001179055600b80546803000000000000000061ffff60401b199091161790553480156200003957600080fd5b5060405162002843380380620028438339810160408190526200005c916200019f565b606084901b6001600160601b031916608052620000793362000132565b600180546001600160a01b03199081166001600160a01b039c8d16179091556002805482169a8c169a909a1790995560038054909916978a169790971790975560049490945560079290925560085560098054600a93909355600b80546001600160401b0319166001600160401b0390961695909517909455610100600160c81b0319909116610100919094160263ffffffff60a81b191692909217600160a81b63ffffffff9093169290920291909117905562000262565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200019a57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620001bf578586fd5b620001ca8b62000182565b9950620001da60208c0162000182565b9850620001ea60408c0162000182565b975060608b0151965060808b0151955060a08b015194506200020f60c08c0162000182565b60e08c01516101008d015191955093506001600160401b038116811462000234578283fd5b6101208c015190925063ffffffff811681146200024f578182fd5b809150509295989b9194979a5092959850565b60805160601c6125bb620002886000396000818161076701526107a901526125bb6000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80637aebfdef11610146578063b0fb162f116100c3578063cc32d17611610087578063cc32d176146105b9578063ea7b4f77146105c2578063f0b5354e146105d5578063f2b3c809146105f6578063f2fde38b146105ff578063fc0c546a1461061257600080fd5b8063b0fb162f14610539578063b3ab15fb14610561578063b6f1142114610574578063c026c3461461059d578063c5f956af146105a657600080fd5b806390c458591161010a57806390c45859146104d557806398544710146104e8578063a3e56fa8146104fb578063a4eb718c14610513578063b0472d221461052657600080fd5b80637aebfdef1461048d5780637ccfd7fc146104a05780638535e104146104a85780638824f5a7146104b15780638da5cb5b146104c457600080fd5b80633fd42eb4116101d457806361cb92781161019857806361cb92781461044d5780636605bfda1461045657806367084eb314610469578063715018a61461047257806377e741c71461047a57600080fd5b80633fd42eb4146103d95780634082aaaf14610401578063410eecdf146104145780634f4aefee1461043157806361728f391461044457600080fd5b806320dd879d1161021b57806320dd879d14610341578063232184111461036f57806323ee5b111461038257806324f74697146103a4578063293315f2146103d057600080fd5b80630821f46d1461025857806309c1ba2e1461026d578063127effb21461029f5780631ca7a6df146102ca5780631fe543e31461032e575b600080fd5b61026b610266366004612238565b610625565b005b600b546102819067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6002546102b2906001600160a01b031681565b6040516001600160a01b039091168152602001610296565b61031c6102d83660046120e8565b600c602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0390941694929360ff9283169391921686565b60405161029696959493929190612332565b61026b61033c36600461213a565b61075c565b61036161034f3660046120e8565b600d6020526000908152604090205481565b604051908152602001610296565b61026b61037d3660046120e8565b6107e4565b61039561039036600461207e565b610974565b60405161029693929190612375565b6009546103bb90600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610296565b61036161271081565b6103ec6103e7366004612206565b610c67565b60408051928352602083019190915201610296565b61026b61040f3660046120e8565b61117c565b6009546104219060ff1681565b6040519015158152602001610296565b61036161043f366004612055565b61124b565b610361600a5481565b61036160065481565b61026b61046436600461203b565b61127c565b61036160055481565b61026b611328565b61026b6104883660046120e8565b61133c565b61026b61049b366004612055565b6113c3565b6103bb600181565b61036160075481565b61026b6104bf366004612100565b6114b3565b6000546001600160a01b03166102b2565b61026b6104e33660046120e8565b6114e2565b61026b6104f63660046120e8565b61167d565b6009546102b29061010090046001600160a01b031681565b61026b610521366004612259565b61168a565b61026b6105343660046120b0565b6116b8565b600b5461054e90600160401b900461ffff1681565b60405161ffff9091168152602001610296565b61026b61056f36600461203b565b611701565b61036161058236600461203b565b6001600160a01b03166000908152600e602052604090205490565b61036160085481565b6003546102b2906001600160a01b031681565b61036160045481565b61026b6105d036600461227d565b6117a6565b6105e86105e33660046120e8565b6117d2565b604051610296929190612449565b6103616103e881565b61026b61060d36600461203b565b61190f565b6001546102b2906001600160a01b031681565b61062d611988565b600082116106825760405162461bcd60e51b815260206004820152601760248201527f5f6d696e466c6970416d6f756e74206d757374203e203000000000000000000060448201526064015b60405180910390fd5b600081116106d25760405162461bcd60e51b815260206004820152601760248201527f5f6d6178466c6970416d6f756e74206d757374203e20300000000000000000006044820152606401610679565b8082106107145760405162461bcd60e51b815260206004820152601060248201526f0bedad2dc40daeae6e8407840bedac2f60831b6044820152606401610679565b6007829055600881905560408051838152602081018390527faf5c2a58ae19258ff124bf6198e8d4126a230a31ec31ff71e6ab8440883dfb3691015b60405180910390a15050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d65760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610679565b6107e082826119e2565b5050565b6000546001600160a01b031633148061080757506002546001600160a01b031633145b6108485760405162461bcd60e51b81526020600482015260126024820152712737ba1037bbb732b917b7b832b930ba37b960711b6044820152606401610679565b6005548111156108915760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b6044820152606401610679565b60015460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156108dd57600080fd5b505af11580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091591906120cc565b50806005600082825461092891906124c3565b909155505060055460405133917fa147c6731fa190b4e2d717169ef5227812181c4833b0995883c6c732f7ab828a9161096991858252602082015260400190565b60405180910390a250565b6001600160a01b0383166000908152600e60205260408120546060918291849061099f9087906124c3565b8111156109cd576001600160a01b0387166000908152600e60205260409020546109ca9087906124c3565b90505b60008167ffffffffffffffff8111156109f657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a1f578160200160208202803683370190505b50905060008267ffffffffffffffff811115610a4b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610aab57816020015b6040805160c08101825260008082526020808301829052928201819052606082018190526080820181905260a08201528252600019909201910181610a695790505b50905060005b83811015610c48576001600160a01b038a166000908152600e60205260409020610adb828b612478565b81548110610af957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154838281518110610b2457634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600c6000848381518110610b5457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252818101929092526040908101600020815160c08101835281546001600160a01b031681526001808301549482019490945260028201549093919284019160ff90911690811115610bc257634e487b7160e01b600052602160045260246000fd5b6001811115610be157634e487b7160e01b600052602160045260246000fd5b8152600382015460208201526004820154604082015260059091015460ff1615156060909101528251839083908110610c2a57634e487b7160e01b600052603260045260246000fd5b60200260200101819052508080610c4090612506565b915050610ab1565b508181610c55858b612478565b95509550955050505093509350939050565b600080333b15610cb05760405162461bcd60e51b815260206004820152601460248201527310dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b6044820152606401610679565b333214610cff5760405162461bcd60e51b815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610679565b60095460ff16610d445760405162461bcd60e51b815260206004820152601060248201526f119b1a5c1cc8185c994818db1bdcd95960821b6044820152606401610679565b600061271060045486610d5791906124a4565b610d619190612490565b90506000610d6f82876124c3565b9050600754861015610dc35760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e74206d757374203e3d206d696e466c6970416d6f756e74000000006044820152606401610679565b600854861115610e155760405162461bcd60e51b815260206004820152601c60248201527f616d6f756e74206d757374203c3d206d6178466c6970416d6f756e74000000006044820152606401610679565b6002600554610e249190612490565b811115610e735760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d757374203c3d20686f75736542616c616e63652f320000006044820152606401610679565b60068054906000610e8383612506565b9091555050600154610ea0906001600160a01b0316333089611c23565b60015460035460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291169063095ea7b390604401602060405180830381600087803b158015610ef057600080fd5b505af1158015610f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2891906120cc565b50600354600154604051638340f54960e01b81523060048201526001600160a01b03918216602482015260448101859052911690638340f54990606401600060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b5050600954600a54600b546040516305d3b1d360e41b8152600481019290925267ffffffffffffffff81166024830152600160401b900461ffff166044820152600160a81b820463ffffffff16606482015260016084820152600093506101009091046001600160a01b03169150635d3b1d309060a401602060405180830381600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c9190612122565b600680546000838152600d6020908152604080832084905533808452600e8352818420805460018181018355918652848620019590955585548452600c90925280832080546001600160a01b031916909217909155835482528082208301879055925481529190912060020180549293508892909160ff199091169083818111156110f757634e487b7160e01b600052602160045260246000fd5b0217905550600680546000908152600c60205260408082206003018490558254825290819020600501805460ff191660011790559054905182919033907f58ef5a466e72230fc345d26190aa5f1d647dac2819bff7c2485ed3e1ac9c6abc9061116590879089908d9061245d565b60405180910390a460065497909650945050505050565b6000546001600160a01b031633148061119f57506002546001600160a01b031633145b6111e05760405162461bcd60e51b81526020600482015260126024820152712737ba1037bbb732b917b7b832b930ba37b960711b6044820152606401610679565b6001546111f8906001600160a01b0316333084611c23565b806005600082825461120a9190612478565b909155505060055460405133917f58939169e543574e68963d758566ca57a1da647a451cf5f434e650165086935c9161096991858252602082015260400190565b600e602052816000526040600020818154811061126757600080fd5b90600052602060002001600091509150505481565b611284611988565b6001600160a01b0381166112d35760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b6044820152606401610679565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f8b4531436af204a864adc47c345e10cb5c4df79165aa0cb85fc45ac5b551517b906020015b60405180910390a150565b611330611988565b61133a6000611c94565b565b611344611988565b6103e881111561138e5760405162461bcd60e51b81526020600482015260156024820152740a8e4cac2e6eae4f240cccaca40e8dede40d0d2ced605b1b6044820152606401610679565b60048190556040518181527f938d9272b26145999fe14f6124b73f122e1e023fc5de069c74ade1254408a9769060200161131d565b6113cb611988565b6001600160a01b038216156114635760405163a9059cbb60e01b81523360048201526024810182905282906001600160a01b0382169063a9059cbb90604401602060405180830381600087803b15801561142457600080fd5b505af1158015611438573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145c91906120cc565b505061146d565b61146d3382611ce4565b604080513381526001600160a01b03841660208201529081018290527f32569b08b2eb4dc63296aac3e3a6003fc44313e79621f392b4a647862307940b90606001610750565b6114bb611988565b600b805461ffff909216600160401b0269ffff000000000000000019909216919091179055565b6114ea611988565b6000818152600c60205260409020600381015460059091015460ff1661154c5760405162461bcd60e51b8152602060048201526017602482015276185b1c9958591e481a185cc8199b1a5c081c995cdd5b1d604a1b6044820152606401610679565b600954600a54600b546040516305d3b1d360e41b8152600481019290925267ffffffffffffffff81166024830152600160401b900461ffff166044820152600160a81b820463ffffffff1660648201526001608482015260009161010090046001600160a01b031690635d3b1d309060a401602060405180830381600087803b1580156115d857600080fd5b505af11580156115ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116109190612122565b6000818152600d60209081526040808320879055868352600c825291829020600301839055815183815290810185905290810185905290915033907f13d0e551e16cc547ff22b538dbd92fb881ed9b85695e9d4d9c70c0eed17937909060600160405180910390a2505050565b611685611988565b600a55565b611692611988565b6009805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b6116c0611988565b6009805460ff19168215159081179091556040519081527febed784b6b78379a43d3197a6f8a439566f7ec4e32c434f32671865c41b1ba4a9060200161131d565b611709611988565b6001600160a01b0381166117585760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74206265207a65726f206164647265737360501b6044820152606401610679565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527fc47d127c07bdd56c5ccba00463ce3bd3c1bca71b4670eea6e5d0c02e4aa156e29060200161131d565b6117ae611988565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081018290526000838152600c60205260409020546001600160a01b03166118575760405162461bcd60e51b815260206004820152600d60248201526c195c9c9bdc88199b1a5c081a59609a1b6044820152606401610679565b6000838152600c6020908152604091829020825160c08101845281546001600160a01b0316815260018083015493820193909352600282015487949293919284929084019160ff16908111156118bd57634e487b7160e01b600052602160045260246000fd5b60018111156118dc57634e487b7160e01b600052602160045260246000fd5b8152600382015460208201526004820154604082015260059091015460ff16151560609091015291959194509092505050565b611917611988565b6001600160a01b03811661197c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610679565b61198581611c94565b50565b6000546001600160a01b0316331461133a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610679565b6000828152600d6020908152604080832054808452600c9092529091206005015460ff16611a4c5760405162461bcd60e51b8152602060048201526017602482015276185b1c9958591e481a185cc8199b1a5c081c995cdd5b1d604a1b6044820152606401610679565b6000818152600c60205260408120600501805460ff191690558251839190611a8457634e487b7160e01b600052603260045260246000fd5b6020026020010151600c6000838152602001908152602001600020600401819055506000600283600081518110611acb57634e487b7160e01b600052603260045260246000fd5b6020026020010151611add9190612521565b15611ae9576001611aec565b60005b6000838152600c602052604090206002015490915060ff166001811115611b2357634e487b7160e01b600052602160045260246000fd5b816001811115611b4357634e487b7160e01b600052602160045260246000fd5b1415611bba576000828152600c60205260408120600101546005805491929091611b6e9084906124c3565b90915550506000828152600c602052604090208054600190910154611bb5916001600160a01b031690611ba29060026124a4565b6001546001600160a01b03169190611d8c565b611be5565b6000828152600c60205260408120600101546005805491929091611bdf908490612478565b90915550505b817fdb8bb138031a1696330aef8691a7a5cd9c058557a5c4dc04f25f586c08f5629082604051611c159190612402565b60405180910390a250505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611c8e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611dbc565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d31576040519150601f19603f3d011682016040523d82523d6000602084013e611d36565b606091505b5050905080611d875760405162461bcd60e51b815260206004820152601c60248201527f4e41544956455f544f4b454e5f5452414e534645525f4641494c4544000000006044820152606401610679565b505050565b6040516001600160a01b038316602482015260448101829052611d8790849063a9059cbb60e01b90606401611c57565b6000611e11826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e8e9092919063ffffffff16565b805190915015611d875780806020019051810190611e2f91906120cc565b611d875760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610679565b6060611e9d8484600085611ea7565b90505b9392505050565b606082471015611f085760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610679565b600080866001600160a01b03168587604051611f249190612316565b60006040518083038185875af1925050503d8060008114611f61576040519150601f19603f3d011682016040523d82523d6000602084013e611f66565b606091505b5091509150611f7787838387611f84565b925050505b949350505050565b60608315611ff0578251611fe9576001600160a01b0385163b611fe95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610679565b5081611f7c565b611f7c83838151156120055781518083602001fd5b8060405162461bcd60e51b81526004016106799190612416565b80356001600160a01b038116811461203657600080fd5b919050565b60006020828403121561204c578081fd5b611ea08261201f565b60008060408385031215612067578081fd5b6120708361201f565b946020939093013593505050565b600080600060608486031215612092578081fd5b61209b8461201f565b95602085013595506040909401359392505050565b6000602082840312156120c1578081fd5b8135611ea081612577565b6000602082840312156120dd578081fd5b8151611ea081612577565b6000602082840312156120f9578081fd5b5035919050565b600060208284031215612111578081fd5b813561ffff81168114611ea0578182fd5b600060208284031215612133578081fd5b5051919050565b6000806040838503121561214c578182fd5b8235915060208084013567ffffffffffffffff8082111561216b578384fd5b818601915086601f83011261217e578384fd5b81358181111561219057612190612561565b8060051b604051601f19603f830116810181811085821117156121b5576121b5612561565b604052828152858101935084860182860187018b10156121d3578788fd5b8795505b838610156121f55780358552600195909501949386019386016121d7565b508096505050505050509250929050565b60008060408385031215612218578182fd5b8235915060208301356002811061222d578182fd5b809150509250929050565b6000806040838503121561224a578182fd5b50508035926020909101359150565b60006020828403121561226a578081fd5b813563ffffffff81168114611ea0578182fd5b60006020828403121561228e578081fd5b813567ffffffffffffffff81168114611ea0578182fd5b600281106122c357634e487b7160e01b600052602160045260246000fd5b9052565b80516001600160a01b0316825260208082015190830152604080820151906122f1908401826122a5565b50606081015160608301526080810151608083015260a0810151151560a08301525050565b600082516123288184602087016124da565b9190910192915050565b6001600160a01b03871681526020810186905260c0810161235660408301876122a5565b84606083015283608083015282151560a0830152979650505050505050565b606080825284519082018190526000906020906080840190828801845b828110156123ae57815184529284019290840190600101612392565b50505083810382850152855180825286830191830190845b818110156123ec576123d98385516122c7565b9284019260c092909201916001016123c6565b5050809350505050826040830152949350505050565b6020810161241082846122a5565b92915050565b60208152600082518060208401526124358160408501602087016124da565b601f01601f19169190910160400192915050565b82815260e08101611ea060208301846122c7565b8381526020810183905260608101611f7c60408301846122a5565b6000821982111561248b5761248b612535565b500190565b60008261249f5761249f61254b565b500490565b60008160001904831182151516156124be576124be612535565b500290565b6000828210156124d5576124d5612535565b500390565b60005b838110156124f55781810151838201526020016124dd565b83811115611c8e5750506000910152565b600060001982141561251a5761251a612535565b5060010190565b6000826125305761253061254b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461198557600080fdfea2646970667358221220bd1a00f1d0e272c31ff501c67e14dc4234f81b72b2ce4a3b408918df7e3678c564736f6c63430008040033000000000000000000000000cff0cd779d7ccdeb14fefb4e508730f90b997ba600000000000000000000000077fb5748244810acb7b2296b7c0ff6380af50bb2000000000000000000000000b0e5ea5e37ef6eb724a3d71e509abc52408a5efd00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000006d80646beadd07ce68cab36c27c626790bbcf17f83d1b6e3388bed3d76426974512bb0d270e9542a765cd667242ea26c0cc0b730000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000186a0
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cff0cd779d7ccdeb14fefb4e508730f90b997ba600000000000000000000000077fb5748244810acb7b2296b7c0ff6380af50bb2000000000000000000000000b0e5ea5e37ef6eb724a3d71e509abc52408a5efd00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000006d80646beadd07ce68cab36c27c626790bbcf17f83d1b6e3388bed3d76426974512bb0d270e9542a765cd667242ea26c0cc0b730000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000186a0
-----Decoded View---------------
Arg [0] : _token (address): 0xcff0cd779d7ccdeb14fefb4e508730f90b997ba6
Arg [1] : _operatorAddress (address): 0x77fb5748244810acb7b2296b7c0ff6380af50bb2
Arg [2] : _treasuryAddress (address): 0xb0e5ea5e37ef6eb724a3d71e509abc52408a5efd
Arg [3] : _treasuryFee (uint256): 1000
Arg [4] : _minFlipAmount (uint256): 100000000000000000
Arg [5] : _maxFlipAmount (uint256): 5000000000000000000000
Arg [6] : _vrfCoordinatorV2 (address): 0x6d80646beadd07ce68cab36c27c626790bbcf17f
Arg [7] : _keyHash (bytes32): 0x83d1b6e3388bed3d76426974512bb0d270e9542a765cd667242ea26c0cc0b730
Arg [8] : _subscriptionId (uint64): 13
Arg [9] : _callbackGasLimit (uint32): 100000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000cff0cd779d7ccdeb14fefb4e508730f90b997ba6
Arg [1] : 00000000000000000000000077fb5748244810acb7b2296b7c0ff6380af50bb2
Arg [2] : 000000000000000000000000b0e5ea5e37ef6eb724a3d71e509abc52408a5efd
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [4] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [5] : 00000000000000000000000000000000000000000000010f0cf064dd59200000
Arg [6] : 0000000000000000000000006d80646beadd07ce68cab36c27c626790bbcf17f
Arg [7] : 83d1b6e3388bed3d76426974512bb0d270e9542a765cd667242ea26c0cc0b730
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [9] : 00000000000000000000000000000000000000000000000000000000000186a0
Deployed ByteCode Sourcemap
35289:12631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44437:464;;;;;;:::i;:::-;;:::i;:::-;;36137:28;;;;;;;;;;;;20725:18:1;20713:31;;;20695:50;;20683:2;20668:18;36137:28:0;;;;;;;;35430:30;;;;;-1:-1:-1;;;;;35430:30:0;;;;;;-1:-1:-1;;;;;6253:32:1;;;6235:51;;6223:2;6208:18;35430:30:0;6190:102:1;36618:45:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36618:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13615:261::-;;;;;;:::i;:::-;;:::i;36694:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9517:25:1;;;9505:2;9490:18;36694:53:0;9472:76:1;42948:294:0;;;;;;:::i;:::-;;:::i;46068:830::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;36060:30::-;;;;;-1:-1:-1;;;36060:30:0;;;;;;;;;20528:10:1;20516:23;;;20498:42;;20486:2;20471:18;36060:30:0;20453:93:1;35947:42:0;;35984:5;35947:42;;39013:2022;;;;;;:::i;:::-;;:::i;:::-;;;;19598:25:1;;;19654:2;19639:18;;19632:34;;;;19571:18;39013:2022:0;19553:119:1;42692:248:0;;;;;;:::i;:::-;;:::i;35812:31::-;;;;;;;;;;;;9344:14:1;;9337:22;9319:41;;9307:2;9292:18;35812:31:0;9274:92:1;36784:49:0;;;;;;:::i;:::-;;:::i;36097:22::-;;;;;;35619:28;;;;;;45317:258;;;;;;:::i;:::-;;:::i;35585:27::-;;;;;;3130:103;;;:::i;44991:232::-;;;;;;:::i;:::-;;:::i;43314:437::-;;;;;;:::i;:::-;;:::i;36240:35::-;;36274:1;36240:35;;35702:28;;;;;;43759:143;;;;;;:::i;:::-;;:::i;2482:87::-;2528:7;2555:6;-1:-1:-1;;;;;2555:6:0;2482:87;;42068:616;;;;;;:::i;:::-;;:::i;44045:92::-;;;;;;:::i;:::-;;:::i;36006:47::-;;;;;;;;-1:-1:-1;;;;;36006:47:0;;;43910:127;;;;;;:::i;:::-;;:::i;44272:157::-;;;;;;:::i;:::-;;:::i;36195:38::-;;;;;-1:-1:-1;;;36195:38:0;;;;;;;;;18897:6:1;18885:19;;;18867:38;;18855:2;18840:18;36195:38:0;18822:89:1;45669:249:0;;;;;;:::i;:::-;;:::i;45926:134::-;;;;;;:::i;:::-;-1:-1:-1;;;;;46025:20:0;45998:7;46025:20;;;:11;:20;;;;;:27;;45926:134;35756:28;;;;;;35467:30;;;;;-1:-1:-1;;;;;35467:30:0;;;35506:26;;;;;;44145:119;;;;;;:::i;:::-;;:::i;46906:303::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;35886:47::-;;35929:4;35886:47;;3388:201;;;;;;:::i;:::-;;:::i;35384:19::-;;;;;-1:-1:-1;;;;;35384:19:0;;;44437:464;2368:13;:11;:13::i;:::-;44572:1:::1;44555:14;:18;44547:54;;;::::0;-1:-1:-1;;;44547:54:0;;17463:2:1;44547:54:0::1;::::0;::::1;17445:21:1::0;17502:2;17482:18;;;17475:30;17541:25;17521:18;;;17514:53;17584:18;;44547:54:0::1;;;;;;;;;44637:1;44620:14;:18;44612:54;;;::::0;-1:-1:-1;;;44612:54:0;;14638:2:1;44612:54:0::1;::::0;::::1;14620:21:1::0;14677:2;14657:18;;;14650:30;14716:25;14696:18;;;14689:53;14759:18;;44612:54:0::1;14610:173:1::0;44612:54:0::1;44702:14;44685;:31;44677:60;;;::::0;-1:-1:-1;;;44677:60:0;;12469:2:1;44677:60:0::1;::::0;::::1;12451:21:1::0;12508:2;12488:18;;;12481:30;-1:-1:-1;;;12527:18:1;;;12520:46;12583:18;;44677:60:0::1;12441:166:1::0;44677:60:0::1;44750:13;:30:::0;;;44791:13:::1;:30:::0;;;44839:54:::1;::::0;;19598:25:1;;;19654:2;19639:18;;19632:34;;;44839:54:0::1;::::0;19571:18:1;44839:54:0::1;;;;;;;;44437:464:::0;;:::o;13615:261::-;13715:10;-1:-1:-1;;;;;13729:14:0;13715:28;;13711:111;;13761:53;;-1:-1:-1;;;13761:53:0;;13787:10;13761:53;;;6509:34:1;-1:-1:-1;;;;;13799:14:0;6579:15:1;6559:18;;;6552:43;6444:18;;13761:53:0;6426:175:1;13711:111:0;13828:42;13847:9;13858:11;13828:18;:42::i;:::-;13615:261;;:::o;42948:294::-;2528:7;2555:6;-1:-1:-1;;;;;2555:6:0;37809:10;:21;;:54;;-1:-1:-1;37848:15:0;;-1:-1:-1;;;;;37848:15:0;37834:10;:29;37809:54;37801:85;;;;-1:-1:-1;;;37801:85:0;;17116:2:1;37801:85:0;;;17098:21:1;17155:2;17135:18;;;17128:30;-1:-1:-1;;;17174:18:1;;;17167:48;17232:18;;37801:85:0;17088:168:1;37801:85:0;43047:12:::1;;43036:7;:23;;43028:56;;;::::0;-1:-1:-1;;;43028:56:0;;16409:2:1;43028:56:0::1;::::0;::::1;16391:21:1::0;16448:2;16428:18;;;16421:30;-1:-1:-1;;;16467:18:1;;;16460:50;16527:18;;43028:56:0::1;16381:170:1::0;43028:56:0::1;43097:5;::::0;:35:::1;::::0;-1:-1:-1;;;43097:35:0;;43112:10:::1;43097:35;::::0;::::1;7160:51:1::0;7227:18;;;7220:34;;;-1:-1:-1;;;;;43097:5:0;;::::1;::::0;:14:::1;::::0;7133:18:1;;43097:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43161:7;43145:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43221:12:0::1;::::0;43186:48:::1;::::0;43200:10:::1;::::0;43186:48:::1;::::0;::::1;::::0;43212:7;19598:25:1;;19654:2;19639:18;;19632:34;19586:2;19571:18;;19553:119;43186:48:0::1;;;;;;;;42948:294:::0;:::o;46068:830::-;-1:-1:-1;;;;;46388:19:0;;46306:7;46388:19;;;:11;:19;;;;;:26;46243:16;;;;46358:4;;46388:35;;46417:6;;46388:35;:::i;:::-;46379:6;:44;46375:121;;;-1:-1:-1;;;;;46449:19:0;;;;;;:11;:19;;;;;:26;:35;;46478:6;;46449:35;:::i;:::-;46440:44;;46375:121;46508:32;46557:6;46543:21;;;;;;-1:-1:-1;;;46543:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46543:21:0;;46508:56;;46575:31;46624:6;46609:22;;;;;;-1:-1:-1;;;46609:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46609:22:0;;-1:-1:-1;;46609:22:0;;;;;;;;;;;;46575:56;;46649:9;46644:178;46668:6;46664:1;:10;46644:178;;;-1:-1:-1;;;;;46717:19:0;;;;;;:11;:19;;;;;46737:10;46746:1;46737:6;:10;:::i;:::-;46717:31;;;;;;-1:-1:-1;;;46717:31:0;;;;;;;;;;;;;;;;;46696:15;46712:1;46696:18;;;;;;-1:-1:-1;;;46696:18:0;;;;;;;;;;;;;;:52;;;;;46782:8;:28;46791:15;46807:1;46791:18;;;;;;-1:-1:-1;;;46791:18:0;;;;;;;;;;;;;;;;;;;;46782:28;;;;;;;;;;;;;-1:-1:-1;46782:28:0;46763:47;;;;;;;;;-1:-1:-1;;;;;46763:47:0;;;;;;;;;;;;;;;;;;;;;46782:28;;46763:47;;;;;;;;;;;;;-1:-1:-1;;;46763:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;46763:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;;:13;;46777:1;;46763:16;;;;-1:-1:-1;;;46763:16:0;;;;;;;;;;;;;;:47;;;;46676:3;;;;;:::i;:::-;;;;46644:178;;;-1:-1:-1;46842:15:0;46859:13;46874:15;46883:6;46874;:15;:::i;:::-;46834:56;;;;;;;;;46068:830;;;;;;;:::o;39013:2022::-;39109:7;;37969:10;47465:20;47513:8;37948:57;;;;-1:-1:-1;;;37948:57:0;;12120:2:1;37948:57:0;;;12102:21:1;12159:2;12139:18;;;12132:30;-1:-1:-1;;;12178:18:1;;;12171:50;12238:18;;37948:57:0;12092:170:1;37948:57:0;38024:10;38038:9;38024:23;38016:62;;;;-1:-1:-1;;;38016:62:0;;14990:2:1;38016:62:0;;;14972:21:1;15029:2;15009:18;;;15002:30;15068:28;15048:18;;;15041:56;15114:18;;38016:62:0;14962:176:1;38016:62:0;39146:12:::1;::::0;::::1;;39138:41;;;::::0;-1:-1:-1;;;39138:41:0;;16064:2:1;39138:41:0::1;::::0;::::1;16046:21:1::0;16103:2;16083:18;;;16076:30;-1:-1:-1;;;16122:18:1;;;16115:46;16178:18;;39138:41:0::1;16036:166:1::0;39138:41:0::1;39192:12;35984:5;39229:11;;39208:18;:32;;;;:::i;:::-;39207:47;;;;:::i;:::-;39192:62:::0;-1:-1:-1;39265:18:0::1;39286:25;39192:62:::0;39286:18;:25:::1;:::i;:::-;39265:46;;39354:13;;39332:18;:35;;39324:76;;;::::0;-1:-1:-1;;;39324:76:0;;18226:2:1;39324:76:0::1;::::0;::::1;18208:21:1::0;18265:2;18245:18;;;18238:30;18304;18284:18;;;18277:58;18352:18;;39324:76:0::1;18198:178:1::0;39324:76:0::1;39441:13;;39419:18;:35;;39411:76;;;::::0;-1:-1:-1;;;39411:76:0;;13578:2:1;39411:76:0::1;::::0;::::1;13560:21:1::0;13617:2;13597:18;;;13590:30;13656;13636:18;;;13629:58;13704:18;;39411:76:0::1;13550:178:1::0;39411:76:0::1;39535:1;39520:12;;:16;;;;:::i;:::-;39506:10;:30;;39498:72;;;::::0;-1:-1:-1;;;39498:72:0;;15706:2:1;39498:72:0::1;::::0;::::1;15688:21:1::0;15745:2;15725:18;;;15718:30;15784:31;15764:18;;;15757:59;15833:18;;39498:72:0::1;15678:179:1::0;39498:72:0::1;39605:13;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;39633:5:0::1;::::0;:69:::1;::::0;-1:-1:-1;;;;;39633:5:0::1;39656:10;39676:4;39683:18:::0;39633:22:::1;:69::i;:::-;39730:5;::::0;39746:15:::1;::::0;39715:53:::1;::::0;-1:-1:-1;;;39715:53:0;;-1:-1:-1;;;;;39746:15:0;;::::1;39715:53;::::0;::::1;7160:51:1::0;7227:18;;;7220:34;;;39730:5:0;::::1;::::0;39715:30:::1;::::0;7133:18:1;;39715:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39797:15:0::1;::::0;;39845:5;39779:79:::1;::::0;-1:-1:-1;;;39779:79:0;;39830:4:::1;39779:79;::::0;::::1;6846:34:1::0;-1:-1:-1;;;;;39845:5:0;;::::1;6896:18:1::0;;;6889:43;6948:18;;;6941:34;;;39797:15:0;::::1;::::0;39779:42:::1;::::0;6781:18:1;;39779:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40039:14:0::1;::::0;40087:7:::1;::::0;40109:14:::1;::::0;40039:184:::1;::::0;-1:-1:-1;;;40039:184:0;;::::1;::::0;::::1;9804:25:1::0;;;;40109:14:0::1;::::0;::::1;9845:18:1::0;;;9838:59;-1:-1:-1;;;40138:20:0;::::1;;;9913:18:1::0;;;9906:47;-1:-1:-1;;;40173:16:0;::::1;;;9998:18:1::0;;;9991:43;40039:14:0::1;10050:19:1::0;;;10043:44;40019:17:0::1;::::0;-1:-1:-1;40039:14:0::1;::::0;;::::1;-1:-1:-1::0;;;;;40039:14:0::1;::::0;-1:-1:-1;40039:33:0::1;::::0;9776:19:1;;40039:184:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40268:13;::::0;;40237:28:::1;::::0;;;:17:::1;:28;::::0;;;;;;;:44;;;40304:10:::1;40292:23:::0;;;:11:::1;:23:::0;;;;;:43;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;40585:13;;40576:23;;:8:::1;:23:::0;;;;;;:43;;-1:-1:-1;;;;;;40576:43:0::1;::::0;;::::1;::::0;;;40639:13;;40630:23;;;;;:34;::::1;:47:::0;;;40697:13;;40688:23;;;;;;:36:::1;;:52:::0;;40019:204;;-1:-1:-1;40727:13:0;;40688:36;;-1:-1:-1;;40688:52:0;;::::1;::::0;40727:13;40688:52;;::::1;;;;-1:-1:-1::0;;;40688:52:0::1;;;;;;;;;;;::::0;;-1:-1:-1;40760:13:0::1;::::0;;40751:23:::1;::::0;;;:8:::1;:23;::::0;;;;;:33:::1;;:45:::0;;;40816:13;;40807:23;;;;;;:40:::1;;:47:::0;;-1:-1:-1;;40807:47:0::1;40850:4;40807:47;::::0;;40892:13;;40872:78;;40787:9;;40892:13;40880:10:::1;::::0;40872:78:::1;::::0;::::1;::::0;40918:10;;40930:4;;40936:13;;40872:78:::1;:::i;:::-;;;;;;;;41002:13;::::0;;41017:9;;-1:-1:-1;39013:2022:0;-1:-1:-1;;;;;39013:2022:0:o;42692:248::-;2528:7;2555:6;-1:-1:-1;;;;;2555:6:0;37809:10;:21;;:54;;-1:-1:-1;37848:15:0;;-1:-1:-1;;;;;37848:15:0;37834:10;:29;37809:54;37801:85;;;;-1:-1:-1;;;37801:85:0;;17116:2:1;37801:85:0;;;17098:21:1;17155:2;17135:18;;;17128:30;-1:-1:-1;;;17174:18:1;;;17167:48;17232:18;;37801:85:0;17088:168:1;37801:85:0;42771:5:::1;::::0;:58:::1;::::0;-1:-1:-1;;;;;42771:5:0::1;42794:10;42814:4;42821:7:::0;42771:22:::1;:58::i;:::-;42858:7;42842:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42919:12:0::1;::::0;42883:49:::1;::::0;42898:10:::1;::::0;42883:49:::1;::::0;::::1;::::0;42910:7;19598:25:1;;19654:2;19639:18;;19632:34;19586:2;19571:18;;19553:119;36784:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45317:258::-;2368:13;:11;:13::i;:::-;-1:-1:-1;;;;;45409:30:0;::::1;45401:65;;;::::0;-1:-1:-1;;;45401:65:0;;14287:2:1;45401:65:0::1;::::0;::::1;14269:21:1::0;14326:2;14306:18;;;14299:30;-1:-1:-1;;;14345:18:1;;;14338:52;14407:18;;45401:65:0::1;14259:172:1::0;45401:65:0::1;45479:15;:34:::0;;-1:-1:-1;;;;;;45479:34:0::1;-1:-1:-1::0;;;;;45479:34:0;::::1;::::0;;::::1;::::0;;;45531:36:::1;::::0;6235:51:1;;;45531:36:0::1;::::0;6223:2:1;6208:18;45531:36:0::1;;;;;;;;45317:258:::0;:::o;3130:103::-;2368:13;:11;:13::i;:::-;3195:30:::1;3222:1;3195:18;:30::i;:::-;3130:103::o:0;44991:232::-;2368:13;:11;:13::i;:::-;35929:4:::1;45075:12;:32;;45067:66;;;::::0;-1:-1:-1;;;45067:66:0;;11363:2:1;45067:66:0::1;::::0;::::1;11345:21:1::0;11402:2;11382:18;;;11375:30;-1:-1:-1;;;11421:18:1;;;11414:51;11482:18;;45067:66:0::1;11335:171:1::0;45067:66:0::1;45144:11;:26:::0;;;45188:27:::1;::::0;9517:25:1;;;45188:27:0::1;::::0;9505:2:1;9490:18;45188:27:0::1;9472:76:1::0;43314:437:0;2368:13;:11;:13::i;:::-;-1:-1:-1;;;;;43420:28:0;::::1;::::0;43416:251:::1;;43525:43;::::0;-1:-1:-1;;;43525:43:0;;43548:10:::1;43525:43;::::0;::::1;7160:51:1::0;7227:18;;;7220:34;;;43495:14:0;;-1:-1:-1;;;;;43525:22:0;::::1;::::0;::::1;::::0;7133:18:1;;43525:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43416:251;;;;43601:54;43634:10;43647:7;43601:24;:54::i;:::-;43684:59;::::0;;43707:10:::1;6846:34:1::0;;-1:-1:-1;;;;;6916:15:1;;6911:2;6896:18;;6889:43;6948:18;;;6941:34;;;43684:59:0::1;::::0;6796:2:1;6781:18;43684:59:0::1;6763:218:1::0;43759:143:0;2368:13;:11;:13::i;:::-;43850:20:::1;:44:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;43850:44:0::1;-1:-1:-1::0;;43850:44:0;;::::1;::::0;;;::::1;::::0;;43759:143::o;42068:616::-;2368:13;:11;:13::i;:::-;42143:20:::1;42166:17:::0;;;:8:::1;:17;::::0;;;;:27:::1;::::0;::::1;::::0;42214:34:::1;::::0;;::::1;::::0;::::1;;42206:70;;;::::0;-1:-1:-1;;;42206:70:0;;13935:2:1;42206:70:0::1;::::0;::::1;13917:21:1::0;13974:2;13954:18;;;13947:30;-1:-1:-1;;;13993:18:1;;;13986:53;14056:18;;42206:70:0::1;13907:173:1::0;42206:70:0::1;42309:14;::::0;42357:7:::1;::::0;42379:14:::1;::::0;42309:184:::1;::::0;-1:-1:-1;;;42309:184:0;;::::1;::::0;::::1;9804:25:1::0;;;;42379:14:0::1;::::0;::::1;9845:18:1::0;;;9838:59;-1:-1:-1;;;42408:20:0;::::1;;;9913:18:1::0;;;9906:47;-1:-1:-1;;;42443:16:0;::::1;;;9998:18:1::0;;;9991:43;42309:14:0::1;10050:19:1::0;;;10043:44;42289:17:0::1;::::0;42309:14:::1;::::0;::::1;-1:-1:-1::0;;;;;42309:14:0::1;::::0;:33:::1;::::0;9776:19:1;;42309:184:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42506:28;::::0;;;:17:::1;:28;::::0;;;;;;;:38;;;42555:17;;;:8:::1;:17:::0;;;;;;:27:::1;;:39:::0;;;42612:64;;20232:25:1;;;20273:18;;;20266:34;;;20316:18;;;20309:34;;;42506:28:0;;-1:-1:-1;42631:10:0::1;::::0;42612:64:::1;::::0;20220:2:1;20205:18;42612:64:0::1;;;;;;;2392:1;;42068:616:::0;:::o;44045:92::-;2368:13;:11;:13::i;:::-;44111:7:::1;:18:::0;44045:92::o;43910:127::-;2368:13;:11;:13::i;:::-;43993:16:::1;:36:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;43993:36:0::1;-1:-1:-1::0;;;;43993:36:0;;::::1;::::0;;;::::1;::::0;;43910:127::o;44272:157::-;2368:13;:11;:13::i;:::-;44345:12:::1;:28:::0;;-1:-1:-1;;44345:28:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44391:30:::1;::::0;9319:41:1;;;44391:30:0::1;::::0;9307:2:1;9292:18;44391:30:0::1;9274:92:1::0;45669:249:0;2368:13;:11;:13::i;:::-;-1:-1:-1;;;;;45754:30:0;::::1;45746:65;;;::::0;-1:-1:-1;;;45746:65:0;;14287:2:1;45746:65:0::1;::::0;::::1;14269:21:1::0;14326:2;14306:18;;;14299:30;-1:-1:-1;;;14345:18:1;;;14338:52;14407:18;;45746:65:0::1;14259:172:1::0;45746:65:0::1;45822:15;:34:::0;;-1:-1:-1;;;;;;45822:34:0::1;-1:-1:-1::0;;;;;45822:34:0;::::1;::::0;;::::1;::::0;;;45874:36:::1;::::0;6235:51:1;;;45874:36:0::1;::::0;6223:2:1;6208:18;45874:36:0::1;6190:102:1::0;44145:119:0;2368:13;:11;:13::i;:::-;44224:14:::1;:32:::0;;-1:-1:-1;;44224:32:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44145:119::o;46906:303::-;-1:-1:-1;;;;;;;;47026:7:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47135:1:0;47099:17;;;:8;:17;;;;;:24;-1:-1:-1;;;;;47099:24:0;47091:64;;;;-1:-1:-1;;;47091:64:0;;18583:2:1;47091:64:0;;;18565:21:1;18622:2;18602:18;;;18595:30;-1:-1:-1;;;18641:18:1;;;18634:43;18694:18;;47091:64:0;18555:163:1;47091:64:0;47183:17;;;;:8;:17;;;;;;;;;47166:35;;;;;;;;;-1:-1:-1;;;;;47166:35:0;;;;;;;;;;;;;;;;;;;47174:7;;47183:17;;47166:35;;47183:17;;47166:35;;;;;;;;;;;;-1:-1:-1;;;47166:35:0;;;;;;;;;;;;;;;-1:-1:-1;;;47166:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46906:303:0;;-1:-1:-1;;;46906:303:0:o;3388:201::-;2368:13;:11;:13::i;:::-;-1:-1:-1;;;;;3477:22:0;::::1;3469:73;;;::::0;-1:-1:-1;;;3469:73:0;;11713:2:1;3469:73:0::1;::::0;::::1;11695:21:1::0;11752:2;11732:18;;;11725:30;11791:34;11771:18;;;11764:62;-1:-1:-1;;;11842:18:1;;;11835:36;11888:19;;3469:73:0::1;11685:228:1::0;3469:73:0::1;3553:28;3572:8;3553:18;:28::i;:::-;3388:201:::0;:::o;2647:132::-;2528:7;2555:6;-1:-1:-1;;;;;2555:6:0;1109:10;2711:23;2703:68;;;;-1:-1:-1;;;2703:68:0;;15345:2:1;2703:68:0;;;15327:21:1;;;15364:18;;;15357:30;15423:34;15403:18;;;15396:62;15475:18;;2703:68:0;15317:182:1;41138:856:0;41246:14;41263:29;;;:17;:29;;;;;;;;;41313:16;;;:8;:16;;;;;;:33;;;;;41305:69;;;;-1:-1:-1;;;41305:69:0;;13935:2:1;41305:69:0;;;13917:21:1;13974:2;13954:18;;;13947:30;-1:-1:-1;;;13993:18:1;;;13986:53;14056:18;;41305:69:0;13907:173:1;41305:69:0;41475:5;41439:16;;;:8;:16;;;;;:33;;:41;;-1:-1:-1;;41439:41:0;;;41520:15;;:12;;41475:5;41520:15;;-1:-1:-1;;;41520:15:0;;;;;;;;;;;;;;;41491:8;:16;41500:6;41491:16;;;;;;;;;;;:26;;:44;;;;41548:19;41597:1;41578:12;41591:1;41578:15;;;;;;-1:-1:-1;;;41578:15:0;;;;;;;;;;;;;;;41570:28;;;;:::i;:::-;:33;:67;;41623:14;41570:67;;;41606:14;41570:67;41668:16;;;;:8;:16;;;;;:29;;;41548:89;;-1:-1:-1;41668:29:0;;;41654:43;;;;;-1:-1:-1;;;41654:43:0;;;;;;;;;:10;:43;;;;;;-1:-1:-1;;;41654:43:0;;;;;;;;;;41650:286;;;41730:16;;;;:8;:16;;;;;:27;;;41714:12;:43;;41730:27;;41714:12;;:43;;41730:27;;41714:43;:::i;:::-;;;;-1:-1:-1;;41791:16:0;;;;:8;:16;;;;;:23;;;41816:27;;;;41772:76;;-1:-1:-1;;;;;41791:23:0;;41816:31;;41846:1;41816:31;:::i;:::-;41772:5;;-1:-1:-1;;;;;41772:5:0;;:76;:18;:76::i;:::-;41650:286;;;41897:16;;;;:8;:16;;;;;:27;;;41881:12;:43;;41897:27;;41881:12;;:43;;41897:27;;41881:43;:::i;:::-;;;;-1:-1:-1;;41650:286:0;41967:6;41953:33;41975:10;41953:33;;;;;;:::i;:::-;;;;;;;;41138:856;;;;:::o;26625:248::-;26796:68;;-1:-1:-1;;;;;6864:15:1;;;26796:68:0;;;6846:34:1;6916:15;;6896:18;;;6889:43;6948:18;;;6941:34;;;26769:96:0;;26789:5;;-1:-1:-1;;;26819:27:0;6781:18:1;;26796:68:0;;;;-1:-1:-1;;26796:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26796:68:0;-1:-1:-1;;;;;;26796:68:0;;;;;;;;;;26769:19;:96::i;:::-;26625:248;;;;:::o;3749:191::-;3823:16;3842:6;;-1:-1:-1;;;;;3859:17:0;;;-1:-1:-1;;;;;;3859:17:0;;;;;;3892:40;;3842:6;;;;;;;3892:40;;3823:16;3892:40;3749:191;;:::o;47725:192::-;47807:12;47825:2;-1:-1:-1;;;;;47825:7:0;47840:5;47825:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47806:44;;;47869:7;47861:48;;;;-1:-1:-1;;;47861:48:0;;12814:2:1;47861:48:0;;;12796:21:1;12853:2;12833:18;;;12826:30;12892;12872:18;;;12865:58;12940:18;;47861:48:0;12786:178:1;47861:48:0;47725:192;;;:::o;26406:211::-;26550:58;;-1:-1:-1;;;;;7178:32:1;;26550:58:0;;;7160:51:1;7227:18;;;7220:34;;;26523:86:0;;26543:5;;-1:-1:-1;;;26573:23:0;7133:18:1;;26550:58:0;7115:145:1;29473:716:0;29897:23;29923:69;29951:4;29923:69;;;;;;;;;;;;;;;;;29931:5;-1:-1:-1;;;;;29923:27:0;;;:69;;;;;:::i;:::-;30007:17;;29897:95;;-1:-1:-1;30007:21:0;30003:179;;30104:10;30093:30;;;;;;;;;;;;:::i;:::-;30085:85;;;;-1:-1:-1;;;30085:85:0;;17815:2:1;30085:85:0;;;17797:21:1;17854:2;17834:18;;;17827:30;17893:34;17873:18;;;17866:62;-1:-1:-1;;;17944:18:1;;;17937:40;17994:19;;30085:85:0;17787:232:1;17879:229:0;18016:12;18048:52;18070:6;18078:4;18084:1;18087:12;18048:21;:52::i;:::-;18041:59;;17879:229;;;;;;:::o;18999:455::-;19169:12;19227:5;19202:21;:30;;19194:81;;;;-1:-1:-1;;;19194:81:0;;13171:2:1;19194:81:0;;;13153:21:1;13210:2;13190:18;;;13183:30;13249:34;13229:18;;;13222:62;-1:-1:-1;;;13300:18:1;;;13293:36;13346:19;;19194:81:0;13143:228:1;19194:81:0;19287:12;19301:23;19328:6;-1:-1:-1;;;;;19328:11:0;19347:5;19354:4;19328:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19286:73;;;;19377:69;19404:6;19412:7;19421:10;19433:12;19377:26;:69::i;:::-;19370:76;;;;18999:455;;;;;;;:::o;21572:644::-;21757:12;21786:7;21782:427;;;21814:17;;21810:290;;-1:-1:-1;;;;;15417:19:0;;;22024:60;;;;-1:-1:-1;;;22024:60:0;;16758:2:1;22024:60:0;;;16740:21:1;16797:2;16777:18;;;16770:30;16836:31;16816:18;;;16809:59;16885:18;;22024:60:0;16730:179:1;22024:60:0;-1:-1:-1;22121:10:0;22114:17;;21782:427;22164:33;22172:10;22184:12;22919:17;;:21;22915:388;;23151:10;23145:17;23208:15;23195:10;23191:2;23187:19;23180:44;23103:136;23278:12;23271:20;;-1:-1:-1;;;23271:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:264::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;647:2;632:18;;;;619:32;;-1:-1:-1;;;480:177:1:o;662:332::-;739:6;747;755;808:2;796:9;787:7;783:23;779:32;776:2;;;829:6;821;814:22;776:2;857:29;876:9;857:29;:::i;:::-;847:39;933:2;918:18;;905:32;;-1:-1:-1;984:2:1;969:18;;;956:32;;766:228;-1:-1:-1;;;766:228:1:o;999:251::-;1055:6;1108:2;1096:9;1087:7;1083:23;1079:32;1076:2;;;1129:6;1121;1114:22;1076:2;1173:9;1160:23;1192:28;1214:5;1192:28;:::i;1255:255::-;1322:6;1375:2;1363:9;1354:7;1350:23;1346:32;1343:2;;;1396:6;1388;1381:22;1343:2;1433:9;1427:16;1452:28;1474:5;1452:28;:::i;1515:190::-;1574:6;1627:2;1615:9;1606:7;1602:23;1598:32;1595:2;;;1648:6;1640;1633:22;1595:2;-1:-1:-1;1676:23:1;;1585:120;-1:-1:-1;1585:120:1:o;1710:292::-;1768:6;1821:2;1809:9;1800:7;1796:23;1792:32;1789:2;;;1842:6;1834;1827:22;1789:2;1886:9;1873:23;1936:6;1929:5;1925:18;1918:5;1915:29;1905:2;;1963:6;1955;1948:22;2202:194;2272:6;2325:2;2313:9;2304:7;2300:23;2296:32;2293:2;;;2346:6;2338;2331:22;2293:2;-1:-1:-1;2374:16:1;;2283:113;-1:-1:-1;2283:113:1:o;2401:1239::-;2494:6;2502;2555:2;2543:9;2534:7;2530:23;2526:32;2523:2;;;2576:6;2568;2561:22;2523:2;2617:9;2604:23;2594:33;;2646:2;2699;2688:9;2684:18;2671:32;2722:18;2763:2;2755:6;2752:14;2749:2;;;2784:6;2776;2769:22;2749:2;2827:6;2816:9;2812:22;2802:32;;2872:7;2865:4;2861:2;2857:13;2853:27;2843:2;;2899:6;2891;2884:22;2843:2;2940;2927:16;2962:2;2958;2955:10;2952:2;;;2968:18;;:::i;:::-;3014:2;3011:1;3007:10;3046:2;3040:9;3109:2;3105:7;3100:2;3096;3092:11;3088:25;3080:6;3076:38;3164:6;3152:10;3149:22;3144:2;3132:10;3129:18;3126:46;3123:2;;;3175:18;;:::i;:::-;3211:2;3204:22;3261:18;;;3295:15;;;;-1:-1:-1;3330:11:1;;;3360;;;3356:20;;3353:33;-1:-1:-1;3350:2:1;;;3404:6;3396;3389:22;3350:2;3431:6;3422:15;;3446:163;3460:2;3457:1;3454:9;3446:163;;;3517:17;;3505:30;;3478:1;3471:9;;;;;3555:12;;;;3587;;3446:163;;;3450:3;3628:6;3618:16;;;;;;;;2513:1127;;;;;:::o;3645:357::-;3726:6;3734;3787:2;3775:9;3766:7;3762:23;3758:32;3755:2;;;3808:6;3800;3793:22;3755:2;3849:9;3836:23;3826:33;;3909:2;3898:9;3894:18;3881:32;3942:1;3935:5;3932:12;3922:2;;3963:6;3955;3948:22;3922:2;3991:5;3981:15;;;3745:257;;;;;:::o;4007:258::-;4075:6;4083;4136:2;4124:9;4115:7;4111:23;4107:32;4104:2;;;4157:6;4149;4142:22;4104:2;-1:-1:-1;;4185:23:1;;;4255:2;4240:18;;;4227:32;;-1:-1:-1;4094:171:1:o;4270:296::-;4328:6;4381:2;4369:9;4360:7;4356:23;4352:32;4349:2;;;4402:6;4394;4387:22;4349:2;4446:9;4433:23;4496:10;4489:5;4485:22;4478:5;4475:33;4465:2;;4527:6;4519;4512:22;4571:304;4629:6;4682:2;4670:9;4661:7;4657:23;4653:32;4650:2;;;4703:6;4695;4688:22;4650:2;4747:9;4734:23;4797:18;4790:5;4786:30;4779:5;4776:41;4766:2;;4836:6;4828;4821:22;4880:236;4960:1;4953:5;4950:12;4940:2;;5005:10;5000:3;4996:20;4993:1;4986:31;5040:4;5037:1;5030:15;5068:4;5065:1;5058:15;4940:2;5092:18;;4930:186::o;5121:474::-;5199:12;;-1:-1:-1;;;;;5195:38:1;5183:51;;5283:4;5272:16;;;5266:23;5250:14;;;5243:47;5336:4;5325:16;;;5319:23;;5351:54;;5390:14;;5319:23;5351:54;:::i;:::-;;5454:4;5447:5;5443:16;5437:23;5430:4;5425:3;5421:14;5414:47;5510:4;5503:5;5499:16;5493:23;5486:4;5481:3;5477:14;5470:47;5580:4;5573:5;5569:16;5563:23;5556:31;5549:39;5542:4;5537:3;5533:14;5526:63;5173:422;;:::o;5600:274::-;5729:3;5767:6;5761:13;5783:53;5829:6;5824:3;5817:4;5809:6;5805:17;5783:53;:::i;:::-;5852:16;;;;;5737:137;-1:-1:-1;;5737:137:1:o;7265:600::-;-1:-1:-1;;;;;7575:32:1;;7557:51;;7639:2;7624:18;;7617:34;;;7544:3;7529:19;;7660:52;7708:2;7693:18;;7685:6;7660:52;:::i;:::-;7748:6;7743:2;7732:9;7728:18;7721:34;7792:6;7786:3;7775:9;7771:19;7764:35;7850:6;7843:14;7836:22;7830:3;7819:9;7815:19;7808:51;7511:354;;;;;;;;;:::o;7870:1304::-;8218:2;8230:21;;;8300:13;;8203:18;;;8322:22;;;8170:4;;8398;;8375:3;8360:19;;;8425:15;;;8170:4;8471:169;8485:6;8482:1;8479:13;8471:169;;;8546:13;;8534:26;;8580:12;;;;8615:15;;;;8507:1;8500:9;8471:169;;;-1:-1:-1;;;8676:19:1;;;8656:18;;;8649:47;8746:13;;8768:21;;;8844:15;;;;8807:12;;;8879:4;8892:211;8908:8;8903:3;8900:17;8892:211;;;8963:50;9007:5;8996:8;8990:15;8963:50;:::i;:::-;9076:17;;;;9046:4;9035:16;;;;;8936:1;8927:11;8892:211;;;8896:3;;9120:5;9112:13;;;;;9161:6;9156:2;9145:9;9141:18;9134:34;8179:995;;;;;;:::o;10562:206::-;10707:2;10692:18;;10719:43;10696:9;10744:6;10719:43;:::i;:::-;10674:94;;;;:::o;10773:383::-;10922:2;10911:9;10904:21;10885:4;10954:6;10948:13;10997:6;10992:2;10981:9;10977:18;10970:34;11013:66;11072:6;11067:2;11056:9;11052:18;11047:2;11039:6;11035:15;11013:66;:::i;:::-;11140:2;11119:15;-1:-1:-1;;11115:29:1;11100:45;;;;11147:2;11096:54;;10894:262;-1:-1:-1;;10894:262:1:o;19098:321::-;19325:25;;;19312:3;19297:19;;19359:54;19409:2;19394:18;;19386:6;19359:54;:::i;19677:348::-;19890:25;;;19946:2;19931:18;;19924:34;;;19878:2;19863:18;;19967:52;20015:2;20000:18;;19992:6;19967:52;:::i;20756:128::-;20796:3;20827:1;20823:6;20820:1;20817:13;20814:2;;;20833:18;;:::i;:::-;-1:-1:-1;20869:9:1;;20804:80::o;20889:120::-;20929:1;20955;20945:2;;20960:18;;:::i;:::-;-1:-1:-1;20994:9:1;;20935:74::o;21014:168::-;21054:7;21120:1;21116;21112:6;21108:14;21105:1;21102:21;21097:1;21090:9;21083:17;21079:45;21076:2;;;21127:18;;:::i;:::-;-1:-1:-1;21167:9:1;;21066:116::o;21187:125::-;21227:4;21255:1;21252;21249:8;21246:2;;;21260:18;;:::i;:::-;-1:-1:-1;21297:9:1;;21236:76::o;21317:258::-;21389:1;21399:113;21413:6;21410:1;21407:13;21399:113;;;21489:11;;;21483:18;21470:11;;;21463:39;21435:2;21428:10;21399:113;;;21530:6;21527:1;21524:13;21521:2;;;-1:-1:-1;;21565:1:1;21547:16;;21540:27;21370:205::o;21580:135::-;21619:3;-1:-1:-1;;21640:17:1;;21637:2;;;21660:18;;:::i;:::-;-1:-1:-1;21707:1:1;21696:13;;21627:88::o;21720:112::-;21752:1;21778;21768:2;;21783:18;;:::i;:::-;-1:-1:-1;21817:9:1;;21758:74::o;21837:127::-;21898:10;21893:3;21889:20;21886:1;21879:31;21929:4;21926:1;21919:15;21953:4;21950:1;21943:15;21969:127;22030:10;22025:3;22021:20;22018:1;22011:31;22061:4;22058:1;22051:15;22085:4;22082:1;22075:15;22101:127;22162:10;22157:3;22153:20;22150:1;22143:31;22193:4;22190:1;22183:15;22217:4;22214:1;22207:15;22233:118;22319:5;22312:13;22305:21;22298:5;22295:32;22285:2;;22341:1;22338;22331:12
Metadata Hash
bd1a00f1d0e272c31ff501c67e14dc4234f81b72b2ce4a3b408918df7e3678c5
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|