Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Latest 25 from a total of 724 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Level | 15214961 | 986 days ago | IN | 0 ETH | 0.00324648 | ||||
Claim Level | 15214014 | 986 days ago | IN | 0 ETH | 0.00187496 | ||||
Claim Level | 15214005 | 986 days ago | IN | 0 ETH | 0.00153165 | ||||
Claim Level | 15209918 | 987 days ago | IN | 0 ETH | 0.00279304 | ||||
Claim Level | 15209600 | 987 days ago | IN | 0 ETH | 0.00097918 | ||||
Claim Level | 15208690 | 987 days ago | IN | 0 ETH | 0.00074795 | ||||
Claim Level | 15208685 | 987 days ago | IN | 0 ETH | 0.00100521 | ||||
Claim Level | 15208603 | 987 days ago | IN | 0 ETH | 0.00304765 | ||||
Claim Level | 15207787 | 987 days ago | IN | 0 ETH | 0.00039636 | ||||
Claim Level | 15207524 | 987 days ago | IN | 0 ETH | 0.00049508 | ||||
Claim Level | 15203384 | 988 days ago | IN | 0 ETH | 0.00030783 | ||||
Claim Level | 15203380 | 988 days ago | IN | 0 ETH | 0.00032271 | ||||
Claim Level | 15200732 | 988 days ago | IN | 0 ETH | 0.00057917 | ||||
Claim Level | 15197664 | 989 days ago | IN | 0 ETH | 0.00120434 | ||||
Claim Level | 15197459 | 989 days ago | IN | 0 ETH | 0.0011481 | ||||
Claim Level | 15196769 | 989 days ago | IN | 0 ETH | 0.00048595 | ||||
Claim Level | 15190817 | 990 days ago | IN | 0 ETH | 0.00100362 | ||||
Claim Level | 15190115 | 990 days ago | IN | 0 ETH | 0.0010115 | ||||
Claim Level | 15184722 | 991 days ago | IN | 0 ETH | 0.00058942 | ||||
Claim Level | 15178500 | 992 days ago | IN | 0 ETH | 0.00110559 | ||||
Claim Level | 15177744 | 992 days ago | IN | 0 ETH | 0.00342053 | ||||
Claim Level | 15174951 | 992 days ago | IN | 0 ETH | 0.00278152 | ||||
Claim Level | 15174570 | 992 days ago | IN | 0 ETH | 0.00243931 | ||||
Claim Level | 15172171 | 993 days ago | IN | 0 ETH | 0.00068353 | ||||
Claim Level | 15172169 | 993 days ago | IN | 0 ETH | 0.00086449 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GameStats
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 /* ______ __ __ __ __ |_ _ \ [ | | ] [ | | ] | |_) | | | .--. .--. .--.| | .--. | |--. .---. .--.| | | __'. | | / .'`\ \ / .'`\ \ / /'`\' | ( (`\] | .-. | / /__\\ / /'`\' | _| |__) | | | | \__. | | \__. | | \__/ | `'.'. | | | | | \__., | \__/ | |_______/ [___] '.__.' '.__.' '.__.;__] [\__) ) [___]|__] '.__.' '.__.;__] ________ ___ __ )_____ ______ _________________ __ __ |_ _ \_ __ `/__ ___/__ ___/ _ /_/ / / __// /_/ / _ / _(__ ) /_____/ \___/ \__,_/ /_/ /____/ */ 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; } } 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns (bool success); function transferFrom( address from, address to, uint256 value ) external returns (bool success); } pragma solidity ^0.8.0; contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } } pragma solidity ^0.8.0; /** **************************************************************************** * @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. * ***************************************************************************** * @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, _link) 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), and have told you the minimum LINK * @dev price for VRF service. Make sure your contract has sufficient LINK, and * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you * @dev want to generate randomness from. * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomness method. * * @dev The randomness argument to fulfillRandomness is the actual random value * @dev generated from your seed. * * @dev The requestId argument is generated from the keyHash and the seed by * @dev makeRequestId(keyHash, seed). If your contract could have concurrent * @dev requests open, you can use the requestId to track which seed is * @dev associated with which randomness. See VRFRequestIDBase.sol for more * @dev details. (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. (Which is critical to making unpredictable randomness! See the * @dev next section.) * * ***************************************************************************** * @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 ultimate input to the VRF is mixed with the block hash of the * @dev block in which the request is made, user-provided seeds have no impact * @dev on its economic security properties. They are only included for API * @dev compatability with previous versions of this contract. * * @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. */ abstract contract VRFConsumerBase is VRFRequestIDBase { /** * @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 VRFConsumerBase 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 randomness the VRF output */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 private constant USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface internal immutable LINK; address private immutable vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 => uint256) /* keyHash */ /* nonce */ private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor(address _vrfCoordinator, address _link) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } interface IToken { function add(address wallet, uint256 amount) external; function spend(address wallet, uint256 amount) external; function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function mintTokens(address to, uint256 amount) external; function getWalletBalance(address wallet) external returns (uint256); } interface IStakingContract { function ownerOf(address collection, uint256 token) external returns (address); } pragma solidity ^0.8.0; contract GameStats is Ownable, VRFConsumerBase, Pausable { using EnumerableSet for EnumerableSet.Bytes32Set; struct TokenSelection { address collectionAddress; uint256[] tokens; } struct ImpactType { uint256 boost; uint256 riskReduction; } struct TokenData { bool isElite; bool faction; uint256 level; uint256 levelEnrolDate; uint256 stakeType; address owner; } mapping(bytes32 => TokenData) tokenDataEncoded; EnumerableSet.Bytes32Set redElites; EnumerableSet.Bytes32Set blueElites; uint256 houseUpgradeCost = 1000000000 ether; uint256 public treeHouseRisk = 25; uint256 public tokenGeneratorRisk = 25; uint256 public HOUSE_CAP = 5; uint256 public LEVEL_CAP = 1000; uint256 public BASE_RISK = 50; uint256 public HOME_STAKE = 1; uint256 public TREE_HOUSE_STAKE = 2; mapping(string => address) public contractsAddressesMap; uint256[] public levelMilestones; mapping(uint256 => ImpactType) public levelImpacts; mapping(uint256 => ImpactType) public stakeTypeImpacts; uint256 private vrfFee; bytes32 private vrfKeyHash; uint256 private seed; mapping(address => bool) public authorisedAddresses; modifier authorised() { require(authorisedAddresses[msg.sender], "The token contract is not authorised"); _; } event SeedFulfilled(); event BLDStolen(address to, uint256 amount); constructor( address vrfCoordinatorAddr_, address linkTokenAddr_, bytes32 vrfKeyHash_, uint256 fee_ ) VRFConsumerBase(vrfCoordinatorAddr_, linkTokenAddr_) { vrfKeyHash = vrfKeyHash_; vrfFee = fee_; } // ADMIN function setCollectionsKeys( string[] calldata keys_, address[] calldata collections_ ) external onlyOwner { for (uint i = 0; i < keys_.length; ++i) { contractsAddressesMap[keys_[i]] = collections_[i]; } } function setLevelImpacts(uint256[] memory milestones_, ImpactType[] calldata impacts_) external onlyOwner { require(milestones_.length == impacts_.length, "INVALID LENGTH"); levelMilestones = milestones_; for (uint256 i = 0; i < milestones_.length; i++) { ImpactType storage levelImpact = levelImpacts[milestones_[i]]; levelImpact.boost = impacts_[i].boost; levelImpact.riskReduction = impacts_[i].riskReduction; } } function setStakeTypeImpacts(uint256[] calldata stakeTypes_, ImpactType[] calldata impacts_) external onlyOwner { require(stakeTypes_.length == impacts_.length, "INVALID LENGTH"); for (uint256 i = 0; i < stakeTypes_.length; i++) { ImpactType storage levelImpact = stakeTypeImpacts[stakeTypes_[i]]; levelImpact.boost = impacts_[i].boost; levelImpact.riskReduction = impacts_[i].riskReduction; } } function setAuthorised(address[] calldata addresses_, bool[] calldata authorisations_) external onlyOwner { for (uint256 i = 0; i < addresses_.length; ++i) { authorisedAddresses[addresses_[i]] = authorisations_[i]; } } function setHouseUpgradeCost(uint256 houseUpgradeCost_) external onlyOwner { houseUpgradeCost = houseUpgradeCost_; } function setTokensData( address collection_, uint256[] calldata tokenIds_, uint256[] calldata levels_, bool[] calldata factions_, bool[] calldata elites_ ) external authorised { for (uint256 i = 0; i < tokenIds_.length; i++) { bytes32 tokenKey = getTokenKey(collection_, tokenIds_[i]); TokenData storage tokenData = tokenDataEncoded[tokenKey]; if (tokenData.level == 0) { tokenData.faction = factions_[i]; tokenData.isElite = elites_[i]; tokenData.level = levels_[i]; } } } function setStakedTokenData( address collection_, address owner_, uint256 stakeType_, uint256[] calldata tokenIds_ ) external authorised { for (uint256 i = 0; i < tokenIds_.length; i++) { bytes32 tokenKey = getTokenKey(collection_, tokenIds_[i]); TokenData storage tokenData = tokenDataEncoded[tokenKey]; tokenData.owner = owner_; if (tokenData.isElite) { if (tokenData.faction) { blueElites.add(tokenKey); } else { redElites.add(tokenKey); } } tokenData.stakeType = stakeType_; tokenData.levelEnrolDate = block.timestamp; } } function unsetStakedTokenData( address collection_, uint256[] calldata tokenIds_ ) external authorised { for (uint256 i = 0; i < tokenIds_.length; i++) { bytes32 tokenKey = getTokenKey(collection_, tokenIds_[i]); TokenData storage tokenData = tokenDataEncoded[tokenKey]; if (tokenData.isElite) { if (tokenData.faction) { blueElites.remove(tokenKey); } else { redElites.remove(tokenKey); } } _claimLevelForToken(collection_, tokenIds_[i]); tokenData.stakeType = 0; } } function getTokenKey(address collection_, uint256 tokenId_) public pure returns (bytes32) { return keccak256(abi.encode(collection_, tokenId_)); } function getLevel(address collection_, uint256 tokenId_) public view returns (uint256) { return tokenDataEncoded[getTokenKey(collection_, tokenId_)].level; } function getLevels( address collection_, uint256[] calldata tokenIds_ ) external view returns (uint256[] memory) { uint256[] memory levels = new uint256[](tokenIds_.length); for (uint256 i = 0; i < tokenIds_.length; ++i) { levels[i] = getLevel(collection_, tokenIds_[i]); } return levels; } function getLevelBoosts( address collection_, uint256[] calldata tokenIds_ ) external view returns (uint256[] memory) { uint256[] memory levelBoosts = new uint256[](tokenIds_.length); for (uint256 i = 0; i < tokenIds_.length; ++i) { bytes32 tokenKey = getTokenKey(collection_, tokenIds_[i]); for (uint256 j = levelMilestones.length - 1; j >= 0; --j) { if (tokenDataEncoded[tokenKey].level >= levelMilestones[j]) { levelBoosts[i] = levelImpacts[levelMilestones[j]].boost; break; } } } return levelBoosts; } function getLevelBoost(address collection, uint256 tokenId) external view returns (uint256) { uint256 levelBoost; bytes32 tokenKey = getTokenKey(collection, tokenId); for (uint256 j = levelMilestones.length - 1; j >= 0; --j) { if (tokenDataEncoded[tokenKey].level >= levelMilestones[j]) { levelBoost = levelImpacts[levelMilestones[j]].boost; break; } } return levelBoost; } function claimLevel(TokenSelection[] calldata tokensSelection_) public { for (uint256 i = 0; i < tokensSelection_.length; ++i) { for (uint256 j = 0; j < tokensSelection_[i].tokens.length; ++j) { bytes32 tokenKey = getTokenKey( tokensSelection_[i].collectionAddress, tokensSelection_[i].tokens[j] ); require(tokenDataEncoded[tokenKey].owner == msg.sender); _claimLevelForToken(tokensSelection_[i].collectionAddress, tokensSelection_[i].tokens[j]); } } } function _claimLevelForToken(address collection_, uint256 tokenId_) internal { bytes32 tokenKey = getTokenKey(collection_, tokenId_); if ( tokenDataEncoded[tokenKey].stakeType == TREE_HOUSE_STAKE || tokenDataEncoded[tokenKey].stakeType == HOME_STAKE || tokenDataEncoded[tokenKey].stakeType == 0 ) { return; } if ( collection_ != contractsAddressesMap["gen0"] && collection_ != contractsAddressesMap["gen1"] ) { return; } if (tokenDataEncoded[tokenKey].level != LEVEL_CAP) { uint256 levelYield = (block.timestamp - tokenDataEncoded[tokenKey].levelEnrolDate) / (stakeTypeImpacts[tokenDataEncoded[tokenKey].stakeType].boost * 1 days); if (tokenDataEncoded[tokenKey].level + levelYield > LEVEL_CAP) { tokenDataEncoded[tokenKey].level = LEVEL_CAP; } else { tokenDataEncoded[tokenKey].level += levelYield; } delete levelYield; tokenDataEncoded[tokenKey].levelEnrolDate = block.timestamp; } delete tokenKey; } function isClaimSuccessful( address collection_, uint256 tokenId, uint256 amount_, uint256 stakeType_ ) external returns (bool) { uint256 risk; bool isBearCollection = collection_ == contractsAddressesMap["gen0"] || collection_ == contractsAddressesMap["gen1"]; if (isBearCollection) { risk = BASE_RISK * 100; for (uint256 j = levelMilestones.length - 1; j >= 0; --j) { if (tokenDataEncoded[getTokenKey(collection_, tokenId)].level >= levelMilestones[j]) { risk -= levelImpacts[levelMilestones[j]].riskReduction; break; } } risk = risk / stakeTypeImpacts[stakeType_].riskReduction / 100; risk = risk < 10 ? 10 : risk; } else { if (collection_ == contractsAddressesMap["tokenGenerator"]) { risk = tokenGeneratorRisk; } else if (collection_ == contractsAddressesMap["treeHouse"]) { risk = treeHouseRisk; } } bool didLose = _didLoseClaimAmount(risk, tokenId, amount_); if (didLose) { bool winningFaction; if (isBearCollection) { winningFaction = !tokenDataEncoded[getTokenKey(collection_, tokenId)].faction; } else { winningFaction = _getFaction(tokenId); } address winner = pickWinnerFromElites( winningFaction, tokenId ); if (winner != address(0)) { emit BLDStolen(winner, amount_); IToken(contractsAddressesMap["token"]).add(winner, amount_); } else { didLose = false; } } delete isBearCollection; return !didLose; } function _didLoseClaimAmount(uint256 risk_, uint256 tokenId_, uint256 amount_) internal view returns (bool) { return uint256( keccak256( abi.encodePacked( seed, tokenId_, amount_, tx.origin, blockhash(block.number - 1), block.timestamp) ) ) % 100 < risk_; } function pickWinnerFromElites(bool faction_, uint256 tokenId) public view returns (address) { if (faction_) { return _pickWinnerFromElitesBySide(blueElites, tokenId); } else { return _pickWinnerFromElitesBySide(redElites, tokenId); } } function _pickWinnerFromElitesBySide( EnumerableSet.Bytes32Set storage elites_, uint256 tokenId ) internal view returns (address) { if(elites_.length() == 0) { return address(0); } uint256 index = _getRandom(elites_.length(), tokenId); return tokenDataEncoded[elites_.at(index)].owner; } function _getRandom(uint256 len, uint256 tokenId) internal view returns (uint256) { return uint256( keccak256( abi.encodePacked( seed, tokenId, tx.origin, blockhash(block.number - 1), block.timestamp ) ) ) % len; } function _getFaction(uint256 tokenId) internal view returns (bool) { return uint256( keccak256( abi.encodePacked( seed, tokenId, tx.origin, blockhash(block.number - 1), block.timestamp ) ) ) & 1 == 1; } function initSeedGeneration() public onlyOwner returns (bytes32 requestId) { require(LINK.balanceOf(address(this)) >= vrfFee, "Not enough LINK"); return requestRandomness(vrfKeyHash, vrfFee); } function fulfillRandomness(bytes32, uint256 randomness) internal override { seed = randomness; emit SeedFulfilled(); } function upgradeHouseSize(uint256 tokenId_, uint256 upgrade_) external { require(tokenDataEncoded[getTokenKey(contractsAddressesMap["treeHouse"], tokenId_)].level + upgrade_ <= HOUSE_CAP); require(tokenDataEncoded[getTokenKey(contractsAddressesMap["treeHouse"], tokenId_)].owner == msg.sender); require(IToken(contractsAddressesMap["token"]).getWalletBalance(msg.sender) >= houseUpgradeCost * upgrade_); IToken(contractsAddressesMap["token"]).spend(msg.sender, houseUpgradeCost * upgrade_); tokenDataEncoded[getTokenKey(contractsAddressesMap["treeHouse"], tokenId_)].level += upgrade_; } function addLevel(address collection_, uint256 tokenId_, uint256 levelIncrease_) external authorised { tokenDataEncoded[getTokenKey(collection_, tokenId_)].level += levelIncrease_; } function setLevel(address collection_, uint256 tokenId_, uint256 levelIncrease_) external authorised { tokenDataEncoded[getTokenKey(collection_, tokenId_)].level = levelIncrease_; } function setEliteStatus(address collection_, uint256 tokenId_) external authorised { bytes32 tokenKey = getTokenKey(collection_, tokenId_); require(!tokenDataEncoded[tokenKey].isElite); require(tokenDataEncoded[tokenKey].stakeType == 0); tokenDataEncoded[tokenKey].isElite = true; delete tokenKey; } function setHousesLevels(uint256[] calldata tokenIds_, uint256[] calldata levels_) external authorised { for (uint256 i = 0; i < tokenIds_.length; ++i) { tokenDataEncoded[getTokenKey(contractsAddressesMap["treeHouse"], tokenIds_[i])].level = levels_[i]; } } function calculateLevels( address collection, uint256[] calldata tokenIds_ ) external view returns (uint256[] memory) { uint256[] memory expectedLevels = new uint256[](tokenIds_.length); for (uint256 i = 0; i < tokenIds_.length; ++i) { expectedLevels[i] = calculateLevel(collection, tokenIds_[i]); } return expectedLevels; } function calculateLevel(address collection_, uint256 tokenId_) public view returns (uint256) { bytes32 tokenKey = getTokenKey(collection_, tokenId_); if ( tokenDataEncoded[tokenKey].stakeType == TREE_HOUSE_STAKE || tokenDataEncoded[tokenKey].stakeType == HOME_STAKE || tokenDataEncoded[tokenKey].stakeType == 0 ) { return tokenDataEncoded[tokenKey].level; } if ( collection_ != contractsAddressesMap["gen0"] && collection_ != contractsAddressesMap["gen1"] ) { return tokenDataEncoded[tokenKey].level; } if (tokenDataEncoded[tokenKey].level == LEVEL_CAP) { return LEVEL_CAP; } uint256 levelYield = (block.timestamp - tokenDataEncoded[tokenKey].levelEnrolDate) / (stakeTypeImpacts[tokenDataEncoded[tokenKey].stakeType].boost * 1 days); if (tokenDataEncoded[tokenKey].level + levelYield > LEVEL_CAP) { return LEVEL_CAP; } return tokenDataEncoded[tokenKey].level + levelYield; } function setTokenGeneratorRisk(uint256 risk_) external onlyOwner { tokenGeneratorRisk = risk_; } function setTreeHouseRisk(uint256 risk_) external onlyOwner { treeHouseRisk = risk_; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"vrfCoordinatorAddr_","type":"address"},{"internalType":"address","name":"linkTokenAddr_","type":"address"},{"internalType":"bytes32","name":"vrfKeyHash_","type":"bytes32"},{"internalType":"uint256","name":"fee_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BLDStolen","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"SeedFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASE_RISK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOME_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOUSE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEVEL_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREE_HOUSE_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"levelIncrease_","type":"uint256"}],"name":"addLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorisedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"calculateLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"calculateLevels","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"internalType":"struct GameStats.TokenSelection[]","name":"tokensSelection_","type":"tuple[]"}],"name":"claimLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"contractsAddressesMap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLevelBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"getLevelBoosts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"getLevels","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getTokenKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"initSeedGeneration","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"stakeType_","type":"uint256"}],"name":"isClaimSuccessful","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levelImpacts","outputs":[{"internalType":"uint256","name":"boost","type":"uint256"},{"internalType":"uint256","name":"riskReduction","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levelMilestones","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"faction_","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"pickWinnerFromElites","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"},{"internalType":"bool[]","name":"authorisations_","type":"bool[]"}],"name":"setAuthorised","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"keys_","type":"string[]"},{"internalType":"address[]","name":"collections_","type":"address[]"}],"name":"setCollectionsKeys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"setEliteStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"houseUpgradeCost_","type":"uint256"}],"name":"setHouseUpgradeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"uint256[]","name":"levels_","type":"uint256[]"}],"name":"setHousesLevels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"levelIncrease_","type":"uint256"}],"name":"setLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"milestones_","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"boost","type":"uint256"},{"internalType":"uint256","name":"riskReduction","type":"uint256"}],"internalType":"struct GameStats.ImpactType[]","name":"impacts_","type":"tuple[]"}],"name":"setLevelImpacts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"stakeTypes_","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"boost","type":"uint256"},{"internalType":"uint256","name":"riskReduction","type":"uint256"}],"internalType":"struct GameStats.ImpactType[]","name":"impacts_","type":"tuple[]"}],"name":"setStakeTypeImpacts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"stakeType_","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"setStakedTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"risk_","type":"uint256"}],"name":"setTokenGeneratorRisk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"uint256[]","name":"levels_","type":"uint256[]"},{"internalType":"bool[]","name":"factions_","type":"bool[]"},{"internalType":"bool[]","name":"elites_","type":"bool[]"}],"name":"setTokensData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"risk_","type":"uint256"}],"name":"setTreeHouseRisk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeTypeImpacts","outputs":[{"internalType":"uint256","name":"boost","type":"uint256"},{"internalType":"uint256","name":"riskReduction","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenGeneratorRisk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treeHouseRisk","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unsetStakedTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"upgrade_","type":"uint256"}],"name":"upgradeHouseSize","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526b033b2e3c9fd0803ce800000060085560196009556019600a556005600b556103e8600c556032600d556001600e556002600f553480156200004557600080fd5b506040516200312638038062003126833981016040819052620000689162000110565b83836200007533620000a3565b6001600160a01b0391821660a052166080526002805460ff1916905560159190915560145550620001589050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200010b57600080fd5b919050565b600080600080608085870312156200012757600080fd5b6200013285620000f3565b93506200014260208601620000f3565b6040860151606090960151949790965092505050565b60805160a051612f9a6200018c6000396000818161123301526121af01526000818161168701526121800152612f9a6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637537235311610151578063c07df5e3116100c3578063de96f07d11610087578063de96f07d14610597578063e1799fdc146105aa578063ec3f89a3146105bd578063ed65bbe2146105c6578063f10da244146105cf578063f2fde38b146105e257600080fd5b8063c07df5e31461054d578063c1cf76df14610560578063c5b4451a14610573578063c8e8506e1461057b578063d1d3fb481461058e57600080fd5b80639eef50d0116101155780639eef50d0146104ce578063a87642b2146104d7578063a8c4c5251461050b578063aa5860541461051e578063b121f2ac14610531578063b1fd8b521461054457600080fd5b8063753723531461047b57806386422320146104845780638da5cb5b1461049757806393c75b24146104a857806394985ddd146104bb57600080fd5b80633c4dd32e116101ea5780635c975abb116101ae5780635c975abb1461041c57806367e8ae6a146104275780636b1121c21461043a5780636bb9071e1461044d578063709053ad14610460578063715018a61461047357600080fd5b80633c4dd32e146103a55780633f516640146103b85780634c4f1ce3146103cb57806351c3d611146103de5780635498e3b71461040957600080fd5b806320c2ff771161023157806320c2ff771461032e57806329625005146103555780632f396d5f146103685780632ffe7dc31461038957806330ed46d11461039c57600080fd5b806304a8fa551461026e57806306e72aaf146102975780630e587b38146102d35780631617534e1461030657806318a5da771461031b575b600080fd5b61028161027c36600461265e565b6105f5565b60405161028e91906126b0565b60405180910390f35b6102be6102a53660046126f4565b6013602052600090815260409020805460019091015482565b6040805192835260208301919091520161028e565b6102f66102e136600461270d565b60176020526000908152604090205460ff1681565b604051901515815260200161028e565b610319610314366004612728565b6106a0565b005b61031961032936600461265e565b61076f565b6102be61033c3660046126f4565b6012602052600090815260409020805460019091015482565b610319610363366004612793565b610859565b61037b6103763660046126f4565b6108b0565b60405190815260200161028e565b6103196103973660046127c6565b6108d1565b61037b600c5481565b61037b6103b336600461289c565b6109ed565b6103196103c6366004612793565b610a2c565b6103196103d93660046128c6565b610a94565b6103f16103ec366004612942565b610b75565b6040516001600160a01b03909116815260200161028e565b61037b61041736600461289c565b610b9a565b60025460ff166102f6565b610319610435366004612728565b610c50565b6103196104483660046129a4565b610d17565b61028161045b36600461265e565b610e10565b61031961046e3660046126f4565b610f47565b610319610f76565b61037b600e5481565b61028161049236600461265e565b610fac565b6000546001600160a01b03166103f1565b61037b6104b636600461289c565b61104e565b6103196104c9366004612a03565b611228565b61037b600f5481565b6103f16104e5366004612a6b565b80516020818301810180516010825292820191909301209152546001600160a01b031681565b61031961051936600461289c565b6112ae565b61031961052c366004612a03565b611342565b61037b61053f36600461289c565b6115bc565b61037b60095481565b61031961055b3660046126f4565b6115e6565b61031961056e3660046126f4565b611615565b61037b611644565b6102f6610589366004612aff565b61174d565b61037b600d5481565b6103196105a5366004612728565b611aa9565b6103196105b8366004612b38565b611b78565b61037b600a5481565b61037b600b5481565b6103196105dd366004612b79565b611d01565b6103196105f036600461270d565b611e11565b60606000826001600160401b0381111561061157610611612a25565b60405190808252806020026020018201604052801561063a578160200160208202803683370190505b50905060005b838110156106975761066a8686868481811061065e5761065e612c38565b905060200201356115bc565b82828151811061067c5761067c612c38565b602090810291909101015261069081612c64565b9050610640565b50949350505050565b6000546001600160a01b031633146106d35760405162461bcd60e51b81526004016106ca90612c7f565b60405180910390fd5b60005b83811015610768578282828181106106f0576106f0612c38565b90506020020160208101906107059190612cb4565b6017600087878581811061071b5761071b612c38565b9050602002016020810190610730919061270d565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561076181612c64565b90506106d6565b5050505050565b3360009081526017602052604090205460ff1661079e5760405162461bcd60e51b81526004016106ca90612cd1565b60005b818110156108535760006107cd858585858181106107c1576107c1612c38565b905060200201356109ed565b600081815260036020526040902080549192509060ff1615610816578054610100900460ff161561080957610803600683611eac565b50610816565b610814600483611eac565b505b6108388686868681811061082c5761082c612c38565b90506020020135611ebf565b6000600390910155508061084b81612c64565b9150506107a1565b50505050565b3360009081526017602052604090205460ff166108885760405162461bcd60e51b81526004016106ca90612cd1565b806003600061089786866109ed565b8152602081019190915260400160002060010155505050565b601181815481106108c057600080fd5b600091825260209091200154905081565b3360009081526017602052604090205460ff166109005760405162461bcd60e51b81526004016106ca90612cd1565b60005b878110156109e15760006109238b8b8b858181106107c1576107c1612c38565b60008181526003602052604090206001810154919250906109cc5786868481811061095057610950612c38565b90506020020160208101906109659190612cb4565b81549015156101000261ff001990911617815584848481811061098a5761098a612c38565b905060200201602081019061099f9190612cb4565b815460ff19169015151781558888848181106109bd576109bd612c38565b60200291909101356001830155505b505080806109d990612c64565b915050610903565b50505050505050505050565b604080516001600160a01b03841660208201529081018290526000906060015b6040516020818303038152906040528051906020012090505b92915050565b3360009081526017602052604090205460ff16610a5b5760405162461bcd60e51b81526004016106ca90612cd1565b8060036000610a6a86866109ed565b81526020019081526020016000206001016000828254610a8a9190612d15565b9091555050505050565b3360009081526017602052604090205460ff16610ac35760405162461bcd60e51b81526004016106ca90612cd1565b60005b81811015610b6d576000610ae6878585858181106107c1576107c1612c38565b60008181526003602052604090206004810180546001600160a01b0319166001600160a01b038a1617905580549192509060ff1615610b4c578054610100900460ff1615610b3f57610b3960068361208e565b50610b4c565b610b4a60048361208e565b505b60038101869055426002909101555080610b6581612c64565b915050610ac6565b505050505050565b60008215610b8f57610b8860068361209a565b9050610a26565b610b8860048361209a565b6000806000610ba985856109ed565b601154909150600090610bbe90600190612d2d565b90505b60118181548110610bd457610bd4612c38565b9060005260206000200154600360008481526020019081526020016000206001015410610c36576012600060118381548110610c1257610c12612c38565b90600052602060002001548152602001908152602001600020600001549250610c46565b610c3f81612d44565b9050610bc1565b5090949350505050565b3360009081526017602052604090205460ff16610c7f5760405162461bcd60e51b81526004016106ca90612cd1565b60005b8381101561076857828282818110610c9c57610c9c612c38565b9050602002013560036000610cf36010604051610cc8906874726565486f75736560b81b815260090190565b908152604051908190036020019020546001600160a01b03168989878181106107c1576107c1612c38565b8152602081019190915260400160002060010155610d1081612c64565b9050610c82565b6000546001600160a01b03163314610d415760405162461bcd60e51b81526004016106ca90612c7f565b828114610d815760405162461bcd60e51b815260206004820152600e60248201526d0929cac8298928840988a9c8ea8960931b60448201526064016106ca565b60005b8381101561076857600060136000878785818110610da457610da4612c38565b9050602002013581526020019081526020016000209050838383818110610dcd57610dcd612c38565b6040029190910135825550838383818110610dea57610dea612c38565b905060400201602001358160010181905550508080610e0890612c64565b915050610d84565b60606000826001600160401b03811115610e2c57610e2c612a25565b604051908082528060200260200182016040528015610e55578160200160208202803683370190505b50905060005b83811015610697576000610e7b878787858181106107c1576107c1612c38565b601154909150600090610e9090600190612d2d565b90505b60118181548110610ea657610ea6612c38565b9060005260206000200154600360008481526020019081526020016000206001015410610f24576012600060118381548110610ee457610ee4612c38565b9060005260206000200154815260200190815260200160002060000154848481518110610f1357610f13612c38565b602002602001018181525050610f34565b610f2d81612d44565b9050610e93565b505080610f4090612c64565b9050610e5b565b6000546001600160a01b03163314610f715760405162461bcd60e51b81526004016106ca90612c7f565b600955565b6000546001600160a01b03163314610fa05760405162461bcd60e51b81526004016106ca90612c7f565b610faa60006120fa565b565b60606000826001600160401b03811115610fc857610fc8612a25565b604051908082528060200260200182016040528015610ff1578160200160208202803683370190505b50905060005b83811015610697576110218686868481811061101557611015612c38565b9050602002013561104e565b82828151811061103357611033612c38565b602090810291909101015261104781612c64565b9050610ff7565b60008061105b84846109ed565b600f546000828152600360208190526040909120015491925014806110935750600e5460008281526003602081905260409091200154145b806110ae575060008181526003602081905260409091200154155b156110cc576000908152600360205260409020600101549050610a26565b60405163067656e360e41b8152601090600401908152604051908190036020019020546001600160a01b0385811691161480159061113857506040516367656e3160e01b8152601090600401908152604051908190036020019020546001600160a01b03858116911614155b15611156576000908152600360205260409020600101549050610a26565b600c54600082815260036020526040902060010154141561117b575050600c54610a26565b6000818152600360208181526040808420909201548352601390528120546111a69062015180612d5b565b6000838152600360205260409020600201546111c29042612d2d565b6111cc9190612d90565b600c54600084815260036020526040902060010154919250906111f0908390612d15565b111561120257600c5492505050610a26565b60008281526003602052604090206001015461121f908290612d15565b95945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a05760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c0060448201526064016106ca565b6112aa828261214a565b5050565b3360009081526017602052604090205460ff166112dd5760405162461bcd60e51b81526004016106ca90612cd1565b60006112e983836109ed565b60008181526003602052604090205490915060ff161561130857600080fd5b600081815260036020819052604090912001541561132557600080fd5b6000908152600360205260409020805460ff191660011790555050565b600b54816003600061138a601060405161136b906874726565486f75736560b81b815260090190565b908152604051908190036020019020546001600160a01b0316876109ed565b8152602001908152602001600020600101546113a69190612d15565b11156113b157600080fd5b336001600160a01b0316600360006113ff60106040516113e0906874726565486f75736560b81b815260090190565b908152604051908190036020019020546001600160a01b0316866109ed565b81526020810191909152604001600020600401546001600160a01b03161461142657600080fd5b806008546114349190612d5b565b604051643a37b5b2b760d91b815260109060050190815260405190819003602001812054633b63b06560e21b82523360048301526001600160a01b03169063ed8ec194906024016020604051808303816000875af115801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be9190612da4565b10156114c957600080fd5b604051643a37b5b2b760d91b8152601090600501908152604051908190036020019020546008546001600160a01b039091169063af7d6ca390339061150f908590612d5b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561155557600080fd5b505af1158015611569573d6000803e3d6000fd5b50505050806003600061159360106040516113e0906874726565486f75736560b81b815260090190565b815260200190815260200160002060010160008282546115b39190612d15565b90915550505050565b6000600360006115cc85856109ed565b815260200190815260200160002060010154905092915050565b6000546001600160a01b031633146116105760405162461bcd60e51b81526004016106ca90612c7f565b600a55565b6000546001600160a01b0316331461163f5760405162461bcd60e51b81526004016106ca90612c7f565b600855565b600080546001600160a01b0316331461166f5760405162461bcd60e51b81526004016106ca90612c7f565b6014546040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156116d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fa9190612da4565b101561173a5760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204c494e4b60881b60448201526064016106ca565b61174860155460145461217c565b905090565b6000806000601060405161176b9063067656e360e41b815260040190565b908152604051908190036020019020546001600160a01b03888116911614806117c157506040516367656e3160e01b8152601090600401908152604051908190036020019020546001600160a01b038881169116145b905080156118cc57600d546117d7906064612d5b565b6011549092506000906117ec90600190612d2d565b90505b6011818154811061180257611802612c38565b90600052602060002001546003600061181b8b8b6109ed565b8152602001908152602001600020600101541061187857601260006011838154811061184957611849612c38565b9060005260206000200154815260200190815260200160002060010154836118719190612d2d565b9250611888565b61188181612d44565b90506117ef565b506000848152601360205260409020600101546064906118a89084612d90565b6118b29190612d90565b9150600a82106118c257816118c5565b600a5b9150611957565b6040516d3a37b5b2b723b2b732b930ba37b960911b8152601090600e01908152604051908190036020019020546001600160a01b038881169116141561191657600a549150611957565b6040516874726565486f75736560b81b8152601090600901908152604051908190036020019020546001600160a01b03888116911614156119575760095491505b60006119648388886122d8565b90508015611a9d57600082156119a357600360006119828b8b6109ed565b8152602081019190915260400160002054610100900460ff161590506119af565b6119ac8861235c565b90505b60006119bb828a610b75565b90506001600160a01b03811615611a9557604080516001600160a01b0383168152602081018a90527f100dfb0adc6f839c0d11660468ad65f3b1224e793f77b8284f5c5b8224d77167910160405180910390a1604051643a37b5b2b760d91b81526010906005019081526040519081900360200181205463f5d82b6b60e01b82526001600160a01b038381166004840152602483018b9052169063f5d82b6b90604401600060405180830381600087803b158015611a7857600080fd5b505af1158015611a8c573d6000803e3d6000fd5b50505050611a9a565b600092505b50505b15979650505050505050565b6000546001600160a01b03163314611ad35760405162461bcd60e51b81526004016106ca90612c7f565b60005b8381101561076857828282818110611af057611af0612c38565b9050602002016020810190611b05919061270d565b6010868684818110611b1957611b19612c38565b9050602002810190611b2b9190612dbd565b604051611b39929190612e03565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055611b7181612c64565b9050611ad6565b60005b81811015611cfc5760005b838383818110611b9857611b98612c38565b9050602002810190611baa9190612e13565b611bb8906020810190612e33565b9050811015611ceb576000611c3a858585818110611bd857611bd8612c38565b9050602002810190611bea9190612e13565b611bf890602081019061270d565b868686818110611c0a57611c0a612c38565b9050602002810190611c1c9190612e13565b611c2a906020810190612e33565b858181106107c1576107c1612c38565b6000818152600360205260409020600401549091506001600160a01b03163314611c6357600080fd5b611cda858585818110611c7857611c78612c38565b9050602002810190611c8a9190612e13565b611c9890602081019061270d565b868686818110611caa57611caa612c38565b9050602002810190611cbc9190612e13565b611cca906020810190612e33565b8581811061082c5761082c612c38565b50611ce481612c64565b9050611b86565b50611cf581612c64565b9050611b7b565b505050565b6000546001600160a01b03163314611d2b5760405162461bcd60e51b81526004016106ca90612c7f565b82518114611d6c5760405162461bcd60e51b815260206004820152600e60248201526d0929cac8298928840988a9c8ea8960931b60448201526064016106ca565b8251611d7f906011906020860190612597565b5060005b835181101561085357600060126000868481518110611da457611da4612c38565b602002602001015181526020019081526020016000209050838383818110611dce57611dce612c38565b6040029190910135825550838383818110611deb57611deb612c38565b905060400201602001358160010181905550508080611e0990612c64565b915050611d83565b6000546001600160a01b03163314611e3b5760405162461bcd60e51b81526004016106ca90612c7f565b6001600160a01b038116611ea05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ca565b611ea9816120fa565b50565b6000611eb883836123ab565b9392505050565b6000611ecb83836109ed565b600f54600082815260036020819052604090912001549192501480611f035750600e5460008281526003602081905260409091200154145b80611f1e575060008181526003602081905260409091200154155b15611f2857505050565b60405163067656e360e41b8152601090600401908152604051908190036020019020546001600160a01b03848116911614801590611f9457506040516367656e3160e01b8152601090600401908152604051908190036020019020546001600160a01b03848116911614155b15611f9e57505050565b600c5460008281526003602052604090206001015414611cfc57600081815260036020818152604080842090920154835260139052812054611fe39062015180612d5b565b600083815260036020526040902060020154611fff9042612d2d565b6120099190612d90565b600c546000848152600360205260409020600101549192509061202d908390612d15565b111561204d57600c54600083815260036020526040902060010155612074565b6000828152600360205260408120600101805483929061206e908490612d15565b90915550505b506000908152600360205260409020426002909101555050565b6000611eb8838361249e565b60006120a5836124ed565b6120b157506000610a26565b60006120c56120bf856124ed565b846124f7565b9050600360006120d58684612545565b81526020810191909152604001600020600401546001600160a01b0316949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60168190556040517f0db1519ec32f10575cf08e612ef5575c94d9c26112d8439b084c223e8b0b103190600090a15050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016121ec929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161221993929190612e7c565b6020604051808303816000875af1158015612238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225c9190612ee8565b50600083815260016020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a090910190925281519183019190912093879052908290526122b791612d15565b6000858152600160205260409020556122d08482612551565b949350505050565b60008360646016548585326001436122f09190612d2d565b6040805160208101969096528501939093526060808501929092526bffffffffffffffffffffffff19911b1660808301524060948201524260b482015260d4016040516020818303038152906040528051906020012060001c6123539190612f05565b10949350505050565b601654600090823261236f600143612d2d565b4042604051602001612385959493929190612f19565b6040516020818303038152906040528051906020012060001c6001166001149050919050565b600081815260018301602052604081205480156124945760006123cf600183612d2d565b85549091506000906123e390600190612d2d565b905081811461244857600086600001828154811061240357612403612c38565b906000526020600020015490508087600001848154811061242657612426612c38565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061245957612459612f4e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a26565b6000915050610a26565b60008181526001830160205260408120546124e557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a26565b506000610a26565b6000610a26825490565b600082601654833260014361250c9190612d2d565b4042604051602001612522959493929190612f19565b6040516020818303038152906040528051906020012060001c611eb89190612f05565b6000611eb8838361256d565b6040805160208101849052908101829052600090606001610a0d565b600082600001828154811061258457612584612c38565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156125d2579160200282015b828111156125d25782518255916020019190600101906125b7565b506125de9291506125e2565b5090565b5b808211156125de57600081556001016125e3565b80356001600160a01b038116811461260e57600080fd5b919050565b60008083601f84011261262557600080fd5b5081356001600160401b0381111561263c57600080fd5b6020830191508360208260051b850101111561265757600080fd5b9250929050565b60008060006040848603121561267357600080fd5b61267c846125f7565b925060208401356001600160401b0381111561269757600080fd5b6126a386828701612613565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b818110156126e8578351835292840192918401916001016126cc565b50909695505050505050565b60006020828403121561270657600080fd5b5035919050565b60006020828403121561271f57600080fd5b611eb8826125f7565b6000806000806040858703121561273e57600080fd5b84356001600160401b038082111561275557600080fd5b61276188838901612613565b9096509450602087013591508082111561277a57600080fd5b5061278787828801612613565b95989497509550505050565b6000806000606084860312156127a857600080fd5b6127b1846125f7565b95602085013595506040909401359392505050565b600080600080600080600080600060a08a8c0312156127e457600080fd5b6127ed8a6125f7565b985060208a01356001600160401b038082111561280957600080fd5b6128158d838e01612613565b909a50985060408c013591508082111561282e57600080fd5b61283a8d838e01612613565b909850965060608c013591508082111561285357600080fd5b61285f8d838e01612613565b909650945060808c013591508082111561287857600080fd5b506128858c828d01612613565b915080935050809150509295985092959850929598565b600080604083850312156128af57600080fd5b6128b8836125f7565b946020939093013593505050565b6000806000806000608086880312156128de57600080fd5b6128e7866125f7565b94506128f5602087016125f7565b93506040860135925060608601356001600160401b0381111561291757600080fd5b61292388828901612613565b969995985093965092949392505050565b8015158114611ea957600080fd5b6000806040838503121561295557600080fd5b82356128b881612934565b60008083601f84011261297257600080fd5b5081356001600160401b0381111561298957600080fd5b6020830191508360208260061b850101111561265757600080fd5b600080600080604085870312156129ba57600080fd5b84356001600160401b03808211156129d157600080fd5b6129dd88838901612613565b909650945060208701359150808211156129f657600080fd5b5061278787828801612960565b60008060408385031215612a1657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612a6357612a63612a25565b604052919050565b60006020808385031215612a7e57600080fd5b82356001600160401b0380821115612a9557600080fd5b818501915085601f830112612aa957600080fd5b813581811115612abb57612abb612a25565b612acd601f8201601f19168501612a3b565b91508082528684828501011115612ae357600080fd5b8084840185840137600090820190930192909252509392505050565b60008060008060808587031215612b1557600080fd5b612b1e856125f7565b966020860135965060408601359560600135945092505050565b60008060208385031215612b4b57600080fd5b82356001600160401b03811115612b6157600080fd5b612b6d85828601612613565b90969095509350505050565b600080600060408486031215612b8e57600080fd5b83356001600160401b0380821115612ba557600080fd5b818601915086601f830112612bb957600080fd5b8135602082821115612bcd57612bcd612a25565b8160051b612bdc828201612a3b565b928352848101820192828101908b851115612bf657600080fd5b958301955b84871015612c1457863582529583019590830190612bfb565b9850505087013592505080821115612c2b57600080fd5b506126a386828701612960565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612c7857612c78612c4e565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612cc657600080fd5b8135611eb881612934565b60208082526024908201527f54686520746f6b656e20636f6e7472616374206973206e6f7420617574686f726040820152631a5cd95960e21b606082015260800190565b60008219821115612d2857612d28612c4e565b500190565b600082821015612d3f57612d3f612c4e565b500390565b600081612d5357612d53612c4e565b506000190190565b6000816000190483118215151615612d7557612d75612c4e565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612d9f57612d9f612d7a565b500490565b600060208284031215612db657600080fd5b5051919050565b6000808335601e19843603018112612dd457600080fd5b8301803591506001600160401b03821115612dee57600080fd5b60200191503681900382131561265757600080fd5b8183823760009101908152919050565b60008235603e19833603018112612e2957600080fd5b9190910192915050565b6000808335601e19843603018112612e4a57600080fd5b8301803591506001600160401b03821115612e6457600080fd5b6020019150600581901b360382131561265757600080fd5b60018060a01b038416815260006020848184015260606040840152835180606085015260005b81811015612ebe57858101830151858201608001528201612ea2565b81811115612ed0576000608083870101525b50601f01601f19169290920160800195945050505050565b600060208284031215612efa57600080fd5b8151611eb881612934565b600082612f1457612f14612d7a565b500690565b948552602085019390935260609190911b6bffffffffffffffffffffffff191660408401526054830152607482015260940190565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205c88436a331a9bb13909089a86341d212f6028786515df33b4ed49e6af4f64f564736f6c634300080a0033000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986caaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af4450000000000000000000000000000000000000000000000001bc16d674ec80000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c80637537235311610151578063c07df5e3116100c3578063de96f07d11610087578063de96f07d14610597578063e1799fdc146105aa578063ec3f89a3146105bd578063ed65bbe2146105c6578063f10da244146105cf578063f2fde38b146105e257600080fd5b8063c07df5e31461054d578063c1cf76df14610560578063c5b4451a14610573578063c8e8506e1461057b578063d1d3fb481461058e57600080fd5b80639eef50d0116101155780639eef50d0146104ce578063a87642b2146104d7578063a8c4c5251461050b578063aa5860541461051e578063b121f2ac14610531578063b1fd8b521461054457600080fd5b8063753723531461047b57806386422320146104845780638da5cb5b1461049757806393c75b24146104a857806394985ddd146104bb57600080fd5b80633c4dd32e116101ea5780635c975abb116101ae5780635c975abb1461041c57806367e8ae6a146104275780636b1121c21461043a5780636bb9071e1461044d578063709053ad14610460578063715018a61461047357600080fd5b80633c4dd32e146103a55780633f516640146103b85780634c4f1ce3146103cb57806351c3d611146103de5780635498e3b71461040957600080fd5b806320c2ff771161023157806320c2ff771461032e57806329625005146103555780632f396d5f146103685780632ffe7dc31461038957806330ed46d11461039c57600080fd5b806304a8fa551461026e57806306e72aaf146102975780630e587b38146102d35780631617534e1461030657806318a5da771461031b575b600080fd5b61028161027c36600461265e565b6105f5565b60405161028e91906126b0565b60405180910390f35b6102be6102a53660046126f4565b6013602052600090815260409020805460019091015482565b6040805192835260208301919091520161028e565b6102f66102e136600461270d565b60176020526000908152604090205460ff1681565b604051901515815260200161028e565b610319610314366004612728565b6106a0565b005b61031961032936600461265e565b61076f565b6102be61033c3660046126f4565b6012602052600090815260409020805460019091015482565b610319610363366004612793565b610859565b61037b6103763660046126f4565b6108b0565b60405190815260200161028e565b6103196103973660046127c6565b6108d1565b61037b600c5481565b61037b6103b336600461289c565b6109ed565b6103196103c6366004612793565b610a2c565b6103196103d93660046128c6565b610a94565b6103f16103ec366004612942565b610b75565b6040516001600160a01b03909116815260200161028e565b61037b61041736600461289c565b610b9a565b60025460ff166102f6565b610319610435366004612728565b610c50565b6103196104483660046129a4565b610d17565b61028161045b36600461265e565b610e10565b61031961046e3660046126f4565b610f47565b610319610f76565b61037b600e5481565b61028161049236600461265e565b610fac565b6000546001600160a01b03166103f1565b61037b6104b636600461289c565b61104e565b6103196104c9366004612a03565b611228565b61037b600f5481565b6103f16104e5366004612a6b565b80516020818301810180516010825292820191909301209152546001600160a01b031681565b61031961051936600461289c565b6112ae565b61031961052c366004612a03565b611342565b61037b61053f36600461289c565b6115bc565b61037b60095481565b61031961055b3660046126f4565b6115e6565b61031961056e3660046126f4565b611615565b61037b611644565b6102f6610589366004612aff565b61174d565b61037b600d5481565b6103196105a5366004612728565b611aa9565b6103196105b8366004612b38565b611b78565b61037b600a5481565b61037b600b5481565b6103196105dd366004612b79565b611d01565b6103196105f036600461270d565b611e11565b60606000826001600160401b0381111561061157610611612a25565b60405190808252806020026020018201604052801561063a578160200160208202803683370190505b50905060005b838110156106975761066a8686868481811061065e5761065e612c38565b905060200201356115bc565b82828151811061067c5761067c612c38565b602090810291909101015261069081612c64565b9050610640565b50949350505050565b6000546001600160a01b031633146106d35760405162461bcd60e51b81526004016106ca90612c7f565b60405180910390fd5b60005b83811015610768578282828181106106f0576106f0612c38565b90506020020160208101906107059190612cb4565b6017600087878581811061071b5761071b612c38565b9050602002016020810190610730919061270d565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561076181612c64565b90506106d6565b5050505050565b3360009081526017602052604090205460ff1661079e5760405162461bcd60e51b81526004016106ca90612cd1565b60005b818110156108535760006107cd858585858181106107c1576107c1612c38565b905060200201356109ed565b600081815260036020526040902080549192509060ff1615610816578054610100900460ff161561080957610803600683611eac565b50610816565b610814600483611eac565b505b6108388686868681811061082c5761082c612c38565b90506020020135611ebf565b6000600390910155508061084b81612c64565b9150506107a1565b50505050565b3360009081526017602052604090205460ff166108885760405162461bcd60e51b81526004016106ca90612cd1565b806003600061089786866109ed565b8152602081019190915260400160002060010155505050565b601181815481106108c057600080fd5b600091825260209091200154905081565b3360009081526017602052604090205460ff166109005760405162461bcd60e51b81526004016106ca90612cd1565b60005b878110156109e15760006109238b8b8b858181106107c1576107c1612c38565b60008181526003602052604090206001810154919250906109cc5786868481811061095057610950612c38565b90506020020160208101906109659190612cb4565b81549015156101000261ff001990911617815584848481811061098a5761098a612c38565b905060200201602081019061099f9190612cb4565b815460ff19169015151781558888848181106109bd576109bd612c38565b60200291909101356001830155505b505080806109d990612c64565b915050610903565b50505050505050505050565b604080516001600160a01b03841660208201529081018290526000906060015b6040516020818303038152906040528051906020012090505b92915050565b3360009081526017602052604090205460ff16610a5b5760405162461bcd60e51b81526004016106ca90612cd1565b8060036000610a6a86866109ed565b81526020019081526020016000206001016000828254610a8a9190612d15565b9091555050505050565b3360009081526017602052604090205460ff16610ac35760405162461bcd60e51b81526004016106ca90612cd1565b60005b81811015610b6d576000610ae6878585858181106107c1576107c1612c38565b60008181526003602052604090206004810180546001600160a01b0319166001600160a01b038a1617905580549192509060ff1615610b4c578054610100900460ff1615610b3f57610b3960068361208e565b50610b4c565b610b4a60048361208e565b505b60038101869055426002909101555080610b6581612c64565b915050610ac6565b505050505050565b60008215610b8f57610b8860068361209a565b9050610a26565b610b8860048361209a565b6000806000610ba985856109ed565b601154909150600090610bbe90600190612d2d565b90505b60118181548110610bd457610bd4612c38565b9060005260206000200154600360008481526020019081526020016000206001015410610c36576012600060118381548110610c1257610c12612c38565b90600052602060002001548152602001908152602001600020600001549250610c46565b610c3f81612d44565b9050610bc1565b5090949350505050565b3360009081526017602052604090205460ff16610c7f5760405162461bcd60e51b81526004016106ca90612cd1565b60005b8381101561076857828282818110610c9c57610c9c612c38565b9050602002013560036000610cf36010604051610cc8906874726565486f75736560b81b815260090190565b908152604051908190036020019020546001600160a01b03168989878181106107c1576107c1612c38565b8152602081019190915260400160002060010155610d1081612c64565b9050610c82565b6000546001600160a01b03163314610d415760405162461bcd60e51b81526004016106ca90612c7f565b828114610d815760405162461bcd60e51b815260206004820152600e60248201526d0929cac8298928840988a9c8ea8960931b60448201526064016106ca565b60005b8381101561076857600060136000878785818110610da457610da4612c38565b9050602002013581526020019081526020016000209050838383818110610dcd57610dcd612c38565b6040029190910135825550838383818110610dea57610dea612c38565b905060400201602001358160010181905550508080610e0890612c64565b915050610d84565b60606000826001600160401b03811115610e2c57610e2c612a25565b604051908082528060200260200182016040528015610e55578160200160208202803683370190505b50905060005b83811015610697576000610e7b878787858181106107c1576107c1612c38565b601154909150600090610e9090600190612d2d565b90505b60118181548110610ea657610ea6612c38565b9060005260206000200154600360008481526020019081526020016000206001015410610f24576012600060118381548110610ee457610ee4612c38565b9060005260206000200154815260200190815260200160002060000154848481518110610f1357610f13612c38565b602002602001018181525050610f34565b610f2d81612d44565b9050610e93565b505080610f4090612c64565b9050610e5b565b6000546001600160a01b03163314610f715760405162461bcd60e51b81526004016106ca90612c7f565b600955565b6000546001600160a01b03163314610fa05760405162461bcd60e51b81526004016106ca90612c7f565b610faa60006120fa565b565b60606000826001600160401b03811115610fc857610fc8612a25565b604051908082528060200260200182016040528015610ff1578160200160208202803683370190505b50905060005b83811015610697576110218686868481811061101557611015612c38565b9050602002013561104e565b82828151811061103357611033612c38565b602090810291909101015261104781612c64565b9050610ff7565b60008061105b84846109ed565b600f546000828152600360208190526040909120015491925014806110935750600e5460008281526003602081905260409091200154145b806110ae575060008181526003602081905260409091200154155b156110cc576000908152600360205260409020600101549050610a26565b60405163067656e360e41b8152601090600401908152604051908190036020019020546001600160a01b0385811691161480159061113857506040516367656e3160e01b8152601090600401908152604051908190036020019020546001600160a01b03858116911614155b15611156576000908152600360205260409020600101549050610a26565b600c54600082815260036020526040902060010154141561117b575050600c54610a26565b6000818152600360208181526040808420909201548352601390528120546111a69062015180612d5b565b6000838152600360205260409020600201546111c29042612d2d565b6111cc9190612d90565b600c54600084815260036020526040902060010154919250906111f0908390612d15565b111561120257600c5492505050610a26565b60008281526003602052604090206001015461121f908290612d15565b95945050505050565b336001600160a01b037f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146112a05760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c0060448201526064016106ca565b6112aa828261214a565b5050565b3360009081526017602052604090205460ff166112dd5760405162461bcd60e51b81526004016106ca90612cd1565b60006112e983836109ed565b60008181526003602052604090205490915060ff161561130857600080fd5b600081815260036020819052604090912001541561132557600080fd5b6000908152600360205260409020805460ff191660011790555050565b600b54816003600061138a601060405161136b906874726565486f75736560b81b815260090190565b908152604051908190036020019020546001600160a01b0316876109ed565b8152602001908152602001600020600101546113a69190612d15565b11156113b157600080fd5b336001600160a01b0316600360006113ff60106040516113e0906874726565486f75736560b81b815260090190565b908152604051908190036020019020546001600160a01b0316866109ed565b81526020810191909152604001600020600401546001600160a01b03161461142657600080fd5b806008546114349190612d5b565b604051643a37b5b2b760d91b815260109060050190815260405190819003602001812054633b63b06560e21b82523360048301526001600160a01b03169063ed8ec194906024016020604051808303816000875af115801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be9190612da4565b10156114c957600080fd5b604051643a37b5b2b760d91b8152601090600501908152604051908190036020019020546008546001600160a01b039091169063af7d6ca390339061150f908590612d5b565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561155557600080fd5b505af1158015611569573d6000803e3d6000fd5b50505050806003600061159360106040516113e0906874726565486f75736560b81b815260090190565b815260200190815260200160002060010160008282546115b39190612d15565b90915550505050565b6000600360006115cc85856109ed565b815260200190815260200160002060010154905092915050565b6000546001600160a01b031633146116105760405162461bcd60e51b81526004016106ca90612c7f565b600a55565b6000546001600160a01b0316331461163f5760405162461bcd60e51b81526004016106ca90612c7f565b600855565b600080546001600160a01b0316331461166f5760405162461bcd60e51b81526004016106ca90612c7f565b6014546040516370a0823160e01b81523060048201527f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316906370a0823190602401602060405180830381865afa1580156116d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fa9190612da4565b101561173a5760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768204c494e4b60881b60448201526064016106ca565b61174860155460145461217c565b905090565b6000806000601060405161176b9063067656e360e41b815260040190565b908152604051908190036020019020546001600160a01b03888116911614806117c157506040516367656e3160e01b8152601090600401908152604051908190036020019020546001600160a01b038881169116145b905080156118cc57600d546117d7906064612d5b565b6011549092506000906117ec90600190612d2d565b90505b6011818154811061180257611802612c38565b90600052602060002001546003600061181b8b8b6109ed565b8152602001908152602001600020600101541061187857601260006011838154811061184957611849612c38565b9060005260206000200154815260200190815260200160002060010154836118719190612d2d565b9250611888565b61188181612d44565b90506117ef565b506000848152601360205260409020600101546064906118a89084612d90565b6118b29190612d90565b9150600a82106118c257816118c5565b600a5b9150611957565b6040516d3a37b5b2b723b2b732b930ba37b960911b8152601090600e01908152604051908190036020019020546001600160a01b038881169116141561191657600a549150611957565b6040516874726565486f75736560b81b8152601090600901908152604051908190036020019020546001600160a01b03888116911614156119575760095491505b60006119648388886122d8565b90508015611a9d57600082156119a357600360006119828b8b6109ed565b8152602081019190915260400160002054610100900460ff161590506119af565b6119ac8861235c565b90505b60006119bb828a610b75565b90506001600160a01b03811615611a9557604080516001600160a01b0383168152602081018a90527f100dfb0adc6f839c0d11660468ad65f3b1224e793f77b8284f5c5b8224d77167910160405180910390a1604051643a37b5b2b760d91b81526010906005019081526040519081900360200181205463f5d82b6b60e01b82526001600160a01b038381166004840152602483018b9052169063f5d82b6b90604401600060405180830381600087803b158015611a7857600080fd5b505af1158015611a8c573d6000803e3d6000fd5b50505050611a9a565b600092505b50505b15979650505050505050565b6000546001600160a01b03163314611ad35760405162461bcd60e51b81526004016106ca90612c7f565b60005b8381101561076857828282818110611af057611af0612c38565b9050602002016020810190611b05919061270d565b6010868684818110611b1957611b19612c38565b9050602002810190611b2b9190612dbd565b604051611b39929190612e03565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055611b7181612c64565b9050611ad6565b60005b81811015611cfc5760005b838383818110611b9857611b98612c38565b9050602002810190611baa9190612e13565b611bb8906020810190612e33565b9050811015611ceb576000611c3a858585818110611bd857611bd8612c38565b9050602002810190611bea9190612e13565b611bf890602081019061270d565b868686818110611c0a57611c0a612c38565b9050602002810190611c1c9190612e13565b611c2a906020810190612e33565b858181106107c1576107c1612c38565b6000818152600360205260409020600401549091506001600160a01b03163314611c6357600080fd5b611cda858585818110611c7857611c78612c38565b9050602002810190611c8a9190612e13565b611c9890602081019061270d565b868686818110611caa57611caa612c38565b9050602002810190611cbc9190612e13565b611cca906020810190612e33565b8581811061082c5761082c612c38565b50611ce481612c64565b9050611b86565b50611cf581612c64565b9050611b7b565b505050565b6000546001600160a01b03163314611d2b5760405162461bcd60e51b81526004016106ca90612c7f565b82518114611d6c5760405162461bcd60e51b815260206004820152600e60248201526d0929cac8298928840988a9c8ea8960931b60448201526064016106ca565b8251611d7f906011906020860190612597565b5060005b835181101561085357600060126000868481518110611da457611da4612c38565b602002602001015181526020019081526020016000209050838383818110611dce57611dce612c38565b6040029190910135825550838383818110611deb57611deb612c38565b905060400201602001358160010181905550508080611e0990612c64565b915050611d83565b6000546001600160a01b03163314611e3b5760405162461bcd60e51b81526004016106ca90612c7f565b6001600160a01b038116611ea05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ca565b611ea9816120fa565b50565b6000611eb883836123ab565b9392505050565b6000611ecb83836109ed565b600f54600082815260036020819052604090912001549192501480611f035750600e5460008281526003602081905260409091200154145b80611f1e575060008181526003602081905260409091200154155b15611f2857505050565b60405163067656e360e41b8152601090600401908152604051908190036020019020546001600160a01b03848116911614801590611f9457506040516367656e3160e01b8152601090600401908152604051908190036020019020546001600160a01b03848116911614155b15611f9e57505050565b600c5460008281526003602052604090206001015414611cfc57600081815260036020818152604080842090920154835260139052812054611fe39062015180612d5b565b600083815260036020526040902060020154611fff9042612d2d565b6120099190612d90565b600c546000848152600360205260409020600101549192509061202d908390612d15565b111561204d57600c54600083815260036020526040902060010155612074565b6000828152600360205260408120600101805483929061206e908490612d15565b90915550505b506000908152600360205260409020426002909101555050565b6000611eb8838361249e565b60006120a5836124ed565b6120b157506000610a26565b60006120c56120bf856124ed565b846124f7565b9050600360006120d58684612545565b81526020810191909152604001600020600401546001600160a01b0316949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60168190556040517f0db1519ec32f10575cf08e612ef5575c94d9c26112d8439b084c223e8b0b103190600090a15050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952848660006040516020016121ec929190918252602082015260400190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161221993929190612e7c565b6020604051808303816000875af1158015612238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225c9190612ee8565b50600083815260016020818152604080842054815180840189905280830186905230606082015260808082018390528351808303909101815260a090910190925281519183019190912093879052908290526122b791612d15565b6000858152600160205260409020556122d08482612551565b949350505050565b60008360646016548585326001436122f09190612d2d565b6040805160208101969096528501939093526060808501929092526bffffffffffffffffffffffff19911b1660808301524060948201524260b482015260d4016040516020818303038152906040528051906020012060001c6123539190612f05565b10949350505050565b601654600090823261236f600143612d2d565b4042604051602001612385959493929190612f19565b6040516020818303038152906040528051906020012060001c6001166001149050919050565b600081815260018301602052604081205480156124945760006123cf600183612d2d565b85549091506000906123e390600190612d2d565b905081811461244857600086600001828154811061240357612403612c38565b906000526020600020015490508087600001848154811061242657612426612c38565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061245957612459612f4e565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a26565b6000915050610a26565b60008181526001830160205260408120546124e557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a26565b506000610a26565b6000610a26825490565b600082601654833260014361250c9190612d2d565b4042604051602001612522959493929190612f19565b6040516020818303038152906040528051906020012060001c611eb89190612f05565b6000611eb8838361256d565b6040805160208101849052908101829052600090606001610a0d565b600082600001828154811061258457612584612c38565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156125d2579160200282015b828111156125d25782518255916020019190600101906125b7565b506125de9291506125e2565b5090565b5b808211156125de57600081556001016125e3565b80356001600160a01b038116811461260e57600080fd5b919050565b60008083601f84011261262557600080fd5b5081356001600160401b0381111561263c57600080fd5b6020830191508360208260051b850101111561265757600080fd5b9250929050565b60008060006040848603121561267357600080fd5b61267c846125f7565b925060208401356001600160401b0381111561269757600080fd5b6126a386828701612613565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b818110156126e8578351835292840192918401916001016126cc565b50909695505050505050565b60006020828403121561270657600080fd5b5035919050565b60006020828403121561271f57600080fd5b611eb8826125f7565b6000806000806040858703121561273e57600080fd5b84356001600160401b038082111561275557600080fd5b61276188838901612613565b9096509450602087013591508082111561277a57600080fd5b5061278787828801612613565b95989497509550505050565b6000806000606084860312156127a857600080fd5b6127b1846125f7565b95602085013595506040909401359392505050565b600080600080600080600080600060a08a8c0312156127e457600080fd5b6127ed8a6125f7565b985060208a01356001600160401b038082111561280957600080fd5b6128158d838e01612613565b909a50985060408c013591508082111561282e57600080fd5b61283a8d838e01612613565b909850965060608c013591508082111561285357600080fd5b61285f8d838e01612613565b909650945060808c013591508082111561287857600080fd5b506128858c828d01612613565b915080935050809150509295985092959850929598565b600080604083850312156128af57600080fd5b6128b8836125f7565b946020939093013593505050565b6000806000806000608086880312156128de57600080fd5b6128e7866125f7565b94506128f5602087016125f7565b93506040860135925060608601356001600160401b0381111561291757600080fd5b61292388828901612613565b969995985093965092949392505050565b8015158114611ea957600080fd5b6000806040838503121561295557600080fd5b82356128b881612934565b60008083601f84011261297257600080fd5b5081356001600160401b0381111561298957600080fd5b6020830191508360208260061b850101111561265757600080fd5b600080600080604085870312156129ba57600080fd5b84356001600160401b03808211156129d157600080fd5b6129dd88838901612613565b909650945060208701359150808211156129f657600080fd5b5061278787828801612960565b60008060408385031215612a1657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612a6357612a63612a25565b604052919050565b60006020808385031215612a7e57600080fd5b82356001600160401b0380821115612a9557600080fd5b818501915085601f830112612aa957600080fd5b813581811115612abb57612abb612a25565b612acd601f8201601f19168501612a3b565b91508082528684828501011115612ae357600080fd5b8084840185840137600090820190930192909252509392505050565b60008060008060808587031215612b1557600080fd5b612b1e856125f7565b966020860135965060408601359560600135945092505050565b60008060208385031215612b4b57600080fd5b82356001600160401b03811115612b6157600080fd5b612b6d85828601612613565b90969095509350505050565b600080600060408486031215612b8e57600080fd5b83356001600160401b0380821115612ba557600080fd5b818601915086601f830112612bb957600080fd5b8135602082821115612bcd57612bcd612a25565b8160051b612bdc828201612a3b565b928352848101820192828101908b851115612bf657600080fd5b958301955b84871015612c1457863582529583019590830190612bfb565b9850505087013592505080821115612c2b57600080fd5b506126a386828701612960565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612c7857612c78612c4e565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612cc657600080fd5b8135611eb881612934565b60208082526024908201527f54686520746f6b656e20636f6e7472616374206973206e6f7420617574686f726040820152631a5cd95960e21b606082015260800190565b60008219821115612d2857612d28612c4e565b500190565b600082821015612d3f57612d3f612c4e565b500390565b600081612d5357612d53612c4e565b506000190190565b6000816000190483118215151615612d7557612d75612c4e565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612d9f57612d9f612d7a565b500490565b600060208284031215612db657600080fd5b5051919050565b6000808335601e19843603018112612dd457600080fd5b8301803591506001600160401b03821115612dee57600080fd5b60200191503681900382131561265757600080fd5b8183823760009101908152919050565b60008235603e19833603018112612e2957600080fd5b9190910192915050565b6000808335601e19843603018112612e4a57600080fd5b8301803591506001600160401b03821115612e6457600080fd5b6020019150600581901b360382131561265757600080fd5b60018060a01b038416815260006020848184015260606040840152835180606085015260005b81811015612ebe57858101830151858201608001528201612ea2565b81811115612ed0576000608083870101525b50601f01601f19169290920160800195945050505050565b600060208284031215612efa57600080fd5b8151611eb881612934565b600082612f1457612f14612d7a565b500690565b948552602085019390935260609190911b6bffffffffffffffffffffffff191660408401526054830152607482015260940190565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205c88436a331a9bb13909089a86341d212f6028786515df33b4ed49e6af4f64f564736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986caaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af4450000000000000000000000000000000000000000000000001bc16d674ec80000
-----Decoded View---------------
Arg [0] : vrfCoordinatorAddr_ (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
Arg [1] : linkTokenAddr_ (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [2] : vrfKeyHash_ (bytes32): 0xaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [3] : fee_ (uint256): 2000000000000000000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [2] : aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [3] : 0000000000000000000000000000000000000000000000001bc16d674ec80000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.