Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 33 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Recover | 16494501 | 579 days ago | IN | 0 ETH | 0.00252143 | ||||
Recover | 16494492 | 579 days ago | IN | 0 ETH | 0.00271403 | ||||
Recover | 16494490 | 579 days ago | IN | 0 ETH | 0.00333905 | ||||
Synthesize | 16458160 | 584 days ago | IN | 0 ETH | 0.00491714 | ||||
Synthesize | 16409220 | 591 days ago | IN | 0 ETH | 0.00432708 | ||||
Synthesize | 16408922 | 591 days ago | IN | 0 ETH | 0.00515316 | ||||
Synthesize | 16408625 | 591 days ago | IN | 0 ETH | 0.00564587 | ||||
Synthesize | 16408325 | 591 days ago | IN | 0 ETH | 0.00652506 | ||||
Synthesize | 16408027 | 591 days ago | IN | 0 ETH | 0.0048171 | ||||
Synthesize | 16407729 | 591 days ago | IN | 0 ETH | 0.00492248 | ||||
Synthesize | 16407431 | 591 days ago | IN | 0 ETH | 0.00500768 | ||||
Synthesize | 16407132 | 591 days ago | IN | 0 ETH | 0.00526092 | ||||
Synthesize | 16406834 | 591 days ago | IN | 0 ETH | 0.00562991 | ||||
Synthesize | 16406534 | 591 days ago | IN | 0 ETH | 0.00617411 | ||||
Synthesize | 16406234 | 591 days ago | IN | 0 ETH | 0.00744329 | ||||
Synthesize | 16405934 | 591 days ago | IN | 0 ETH | 0.0066829 | ||||
Synthesize | 16405638 | 591 days ago | IN | 0 ETH | 0.00498889 | ||||
Synthesize | 16405339 | 591 days ago | IN | 0 ETH | 0.00528499 | ||||
Synthesize | 16405040 | 591 days ago | IN | 0 ETH | 0.00502051 | ||||
Synthesize | 16404741 | 591 days ago | IN | 0 ETH | 0.00505488 | ||||
Synthesize | 16404443 | 591 days ago | IN | 0 ETH | 0.00966148 | ||||
Synthesize | 16404146 | 591 days ago | IN | 0 ETH | 0.01410049 | ||||
Synthesize | 16403846 | 591 days ago | IN | 0 ETH | 0.00543908 | ||||
Synthesize | 16403546 | 591 days ago | IN | 0 ETH | 0.00544289 | ||||
Synthesize | 16403247 | 591 days ago | IN | 0 ETH | 0.00547761 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
KaijuSynthesizer
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol"; import "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "./interfaces/IKaijuKingz.sol"; import "./interfaces/IRWaste.sol"; import "./interfaces/IScales.sol"; import "./interfaces/IScientists.sol"; error KaijuSynthesizer_AllKaijusMinted(); /** ..',,;;;;:::;;;,,'.. .';:ccccc:::;;,,,,,;;;:::ccccc:;'. .,:ccc:;'.. ..';:ccc:,. .':cc:,. .,ccc:'. .,clc,. .,clc,. 'clc' 'clc' .;ll,. .;ll;. .:ol. 'co:. ;oc. .co; 'oo' 'lo' .cd; ;dc. .ol. .,. .lo. ,dc. 'cxKWK; cd, ;d; .;oONWMMMMXc ;d; ;d; 'cxKWMMMMMMMMMXl. ;x; ,x: ;dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0NMMMMMMMMMMMMMMNd. :x, .dc .lXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNd. cd. ld. .oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXkl' .dl ,x; .xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN0d:. ;x, oo. .kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKxc'. .oo 'x: .kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOo;. :x' :x. .xWMMMMMMMMMMM0occcccccccccccccccccccccccccccccccccccc:' .x: lo. .oNMMMMMMMMMX; .ol .ol .lXMMMMMMMWd. ,dddddddddddddddo;. .:dddddddddddddo, lo. .dl cXMMMMMM0, 'OMMMMMMMMMMMMMMNd. .xWMMMMMMMMMMMMXo. ld. .dl ;KMMMMNl oWMMMMMMMMMMMMMXc. ,OWMMMMMMMMMMMMK: ld. oo ,OWMMO. ,KMMMMMMMMMMMMW0; .cKMMMMMMMMMMMMWO, oo cd. 'kWX: .xWMMMMMMMMMMMWx. .dKNMMMMMMMMMMMMNd. .dc ,x, .dd. ;KMMMMMMMMMMMXo. 'kWMMMMMMMMMMMMMXl. ,x; .dc . .,:loxOKNWMMK: ;0WMMMMMMMMMMMMW0; cd. :d. ... ..,:c' .lXMMMMMMMMMMMMMWk' .d: .dl :OKOxoc:,.. .xNMMMMMMMMMMMMMNo. cd. ;x, ;0MMMMWWXKOxoclOWMMMMMMMMMMMMMKc ,x; cd. ,OWMMMMMMMMMMMMMMMMMMMMMMMMWO, .dc .oo. .kWMMMMMMMMMMMMMMMMMMMMMMNx. .oo. .oo. .xWMMMMMMMMMMMMMMMMMMMMXl. .oo. .lo. .oNMMMMMMMMMMMMMMMMMW0; .ol. .cd, .lXMMMMMMMMMMMMMMMWk' ,dc. ;dc. :KMMMMMMMMMMMMNKo. .cd; .lo, ;0WWWWWWWWWWKc. 'ol. ,ol. .,,,,,,,,,,. .lo, .;oc. .co:. .;ol' 'lo;. ,ll:. .:ll, .:ll;. .;ll:. .:ll:,. .,:ll:. .,:ccc;'. .';ccc:,. .';cccc::;'... ...';:ccccc;'. .',;::cc::cc::::::::::::;,.. ........ * @title KaijuSynthesizer * @author Augminted Labs, LLC * @notice Synthesize baby kaijus into the wallets of eligible scientists */ contract KaijuSynthesizer is IERC721Receiver, AccessControl, VRFConsumerBaseV2 { struct RequestConfig { bytes32 keyHash; uint64 subId; uint32 callbackGasLimit; uint16 requestConfirmations; } event KaijuSynthesized( address indexed receiver, uint256 indexed id, uint256 indexed seed ); bytes32 public constant SYNTHESIZER_ROLE = keccak256("SYNTHESIZER_ROLE"); IKaijuKingz internal immutable KAIJU; IRWaste internal immutable RWASTE; IScales internal immutable SCALES; IScientists internal immutable SCIENTISTS; VRFCoordinatorV2Interface internal immutable COORDINATOR; uint256 internal constant KAIJU_MAX_SUPPLY = 9999; uint256 internal constant BURN_AMOUNT = 3000 ether; uint256 internal constant FUSION_COST = 750 ether; RequestConfig public requestConfig; mapping(uint256 => uint256) public requestIdToTokenId; constructor( address admin, IKaijuKingz kaiju, IRWaste rwaste, IScales scales, IScientists scientists, address vrfCoordinator, bytes32 keyHash, uint64 subId ) VRFConsumerBaseV2(vrfCoordinator) { _grantRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(SYNTHESIZER_ROLE, msg.sender); KAIJU = kaiju; RWASTE = rwaste; SCALES = scales; SCIENTISTS = scientists; COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); requestConfig = RequestConfig({ keyHash: keyHash, subId: subId, callbackGasLimit: 250000, requestConfirmations: 3 }); } /** * @notice Set configuration data for Chainlink VRF * @dev https://docs.chain.link/docs/chainlink-vrf/ * @param _requestConfig Struct with updated configuration values */ function setRequestConfig(RequestConfig calldata _requestConfig) external onlyRole(DEFAULT_ADMIN_ROLE) { requestConfig = _requestConfig; } /** * @notice Synthesize a new KAIJU, burn leftover $RWASTE, and transfer to a random eligible SCIENTIST * @param parent1 First KAIJU parent to use for fusion * @param parent2 Second KAIJU parent to use for fusion * @param claim Should $RWASTE be claimed by the staking contract */ function synthesize(uint256 parent1, uint256 parent2, bool claim) external onlyRole(SYNTHESIZER_ROLE) { if (KAIJU.totalSupply() == KAIJU.maxSupply()) revert KaijuSynthesizer_AllKaijusMinted(); if (claim) SCALES.claimRWaste(); RWASTE.burn(address(SCALES), BURN_AMOUNT); RWASTE.transferFrom(address(SCALES), address(this), FUSION_COST); KAIJU.fusion(parent1, parent2); requestIdToTokenId[COORDINATOR.requestRandomWords( requestConfig.keyHash, requestConfig.subId, requestConfig.requestConfirmations, requestConfig.callbackGasLimit, 1 // number of random words )] = KAIJU.maxGenCount() + KAIJU.babyCount() - 1; } /** * @notice Recover KAIJU token * @param to Account to send the KAIJU to * @param tokenId KAIJU to recover */ function recover(address to, uint256 tokenId) external onlyRole(DEFAULT_ADMIN_ROLE) { KAIJU.transferFrom(address(this), to, tokenId); } /** * @inheritdoc IERC721Receiver */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external override returns (bytes4) { return this.onERC721Received.selector; } /** * @inheritdoc VRFConsumerBaseV2 * @notice Transfer KAIJU to a random eligible SCIENTIST */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { address receiver = SCIENTISTS.getRandomPaidScientistOwner(randomWords[0]); KAIJU.transferFrom( address(this), receiver, requestIdToTokenId[requestId] ); emit KaijuSynthesized( receiver, requestIdToTokenId[requestId], randomWords[0] ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; }
// SPDX-License-Identifier: MIT 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. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IKaijuKingz is IERC721 { function totalSupply() external view returns (uint256); function babyCount() external view returns (uint256); function maxGenCount() external view returns (uint256); function maxSupply() external view returns (uint256); function fusion(uint256 parent1, uint256 parent2) external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IRWaste is IERC20 { function burn(address user, uint256 amount) external; function claimReward() external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "./ISpendable.sol"; interface IScales is ISpendable { function getAllOwned(address) external view returns (uint256[] memory); function claimRWaste() external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IScientists is IERC721 { function getRandomPaidScientistOwner(uint256) external returns (address); function increasePool(uint256) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface ISpendable is IERC20 { function getSpendable(address) external view returns (uint256); function spend(address, uint256) external; function credit(address, uint256) external; }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"contract IKaijuKingz","name":"kaiju","type":"address"},{"internalType":"contract IRWaste","name":"rwaste","type":"address"},{"internalType":"contract IScales","name":"scales","type":"address"},{"internalType":"contract IScientists","name":"scientists","type":"address"},{"internalType":"address","name":"vrfCoordinator","type":"address"},{"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"internalType":"uint64","name":"subId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"KaijuSynthesizer_AllKaijusMinted","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"seed","type":"uint256"}],"name":"KaijuSynthesized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYNTHESIZER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestConfig","outputs":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"internalType":"uint64","name":"subId","type":"uint64"},{"internalType":"uint32","name":"callbackGasLimit","type":"uint32"},{"internalType":"uint16","name":"requestConfirmations","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestIdToTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"internalType":"uint64","name":"subId","type":"uint64"},{"internalType":"uint32","name":"callbackGasLimit","type":"uint32"},{"internalType":"uint16","name":"requestConfirmations","type":"uint16"}],"internalType":"struct KaijuSynthesizer.RequestConfig","name":"_requestConfig","type":"tuple"}],"name":"setRequestConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"parent1","type":"uint256"},{"internalType":"uint256","name":"parent2","type":"uint256"},{"internalType":"bool","name":"claim","type":"bool"}],"name":"synthesize","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b5060405162001a8738038062001a878339810160408190526200003591620001d6565b6001600160a01b0383166080526200004f6000896200011c565b6200007b7fe4d7462aef13f3a87b131da37aa6e800b9680cd0bee1ec7d70b800970c11e7bb336200011c565b6001600160a01b0396871660a05294861660c05292851660e0529084166101005290921661012052604080516080810182528381526001600160401b03909216602083018190526203d090918301919091526003606090920191909152600191909155600280546001600160601b0319169091176a03d09000000000000000001761ffff60601b19166c030000000000000000000000001790555062000296565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001b9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001783390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b0381168114620001d357600080fd5b50565b600080600080600080600080610100898b031215620001f457600080fd5b88516200020181620001bd565b60208a01519098506200021481620001bd565b60408a01519097506200022781620001bd565b60608a01519096506200023a81620001bd565b60808a01519095506200024d81620001bd565b60a08a01519094506200026081620001bd565b60c08a015160e08b015191945092506001600160401b03811681146200028557600080fd5b809150509295985092959890939650565b60805160a05160c05160e051610100516101205161175b6200032c6000396000610b8b01526000610c4101526000818161075b015281816107fd01526108a501526000818161083401526108e201526000818161058b015281816106190152818161069b01528181610988015281816109f001528181610a720152610d2a0152600081816103e60152610441015261175b6000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806336568abe1161009757806391d148541161006657806391d14854146102c9578063a217fddf14610300578063d547741f14610308578063ddff07791461031b57600080fd5b806336568abe1461021757806352566e931461022a5780635705ae43146102a35780636df4c6a8146102b657600080fd5b80631fe543e3116100d35780631fe543e3146101b9578063248a9ca3146101ce5780632a2ae6b7146101f15780632f2ff15d1461020457600080fd5b806301ffc9a7146100fa5780630750b16314610122578063150b7a0214610150575b600080fd5b61010d6101083660046111bb565b610342565b60405190151581526020015b60405180910390f35b6101426101303660046111fd565b60036020526000908152604090205481565b604051908152602001610119565b61018861015e36600461122e565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610119565b6101cc6101c73660046112e3565b6103db565b005b6101426101dc3660046111fd565b60009081526020819052604090206001015490565b6101cc6101ff3660046113ad565b610481565b6101cc6102123660046113c5565b6104a0565b6101cc6102253660046113c5565b6104cb565b60015460025461026b919067ffffffffffffffff81169068010000000000000000810463ffffffff16906c01000000000000000000000000900461ffff1684565b6040805194855267ffffffffffffffff909316602085015263ffffffff9091169183019190915261ffff166060820152608001610119565b6101cc6102b13660046113f5565b610553565b6101cc6102c436600461142f565b6105ec565b61010d6102d73660046113c5565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610142600081565b6101cc6103163660046113c5565b610c17565b6101427fe4d7462aef13f3a87b131da37aa6e800b9680cd0bee1ec7d70b800970c11e7bb81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806103d557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610473576040517f1cf993f40000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b61047d8282610c3d565b5050565b600061048d8133610df0565b81600161049a8282611468565b50505050565b6000828152602081905260409020600101546104bc8133610df0565b6104c68383610e6e565b505050565b6001600160a01b03811633146105495760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161046a565b61047d8282610f0c565b600061055f8133610df0565b6040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b1580156105cf57600080fd5b505af11580156105e3573d6000803e3d6000fd5b50505050505050565b7fe4d7462aef13f3a87b131da37aa6e800b9680cd0bee1ec7d70b800970c11e7bb6106178133610df0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015610675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106999190611561565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071b9190611561565b1415610753576040517fdea47e9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81156107cd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312bf78b76040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107b457600080fd5b505af11580156107c8573d6000803e3d6000fd5b505050505b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015268a2a15d09519be0000060248301527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b15801561087857600080fd5b505af115801561088c573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301523060248301526828a857425466f8000060448301527f00000000000000000000000000000000000000000000000000000000000000001692506323b872dd91506064016020604051808303816000875af115801561092d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610951919061157a565b506040517f65a8a03700000000000000000000000000000000000000000000000000000000815260048101859052602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906365a8a03790604401600060405180830381600087803b1580156109d457600080fd5b505af11580156109e8573d6000803e3d6000fd5b5050505060017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663539cb1e76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a709190611561565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633299c1206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af29190611561565b610afc91906115ad565b610b0691906115c5565b600180546002546040517f5d3b1d30000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff811660248301526c01000000000000000000000000810461ffff16604483015268010000000000000000900463ffffffff16606482015260848101919091526003906000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635d3b1d309060a4016020604051808303816000875af1158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c009190611561565b815260208101919091526040016000205550505050565b600082815260208190526040902060010154610c338133610df0565b6104c68383610f0c565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166399c04c0183600081518110610c8157610c816115dc565b60200260200101516040518263ffffffff1660e01b8152600401610ca791815260200190565b6020604051808303816000875af1158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea91906115f2565b600084815260036020526040908190205490516323b872dd60e01b81523060048201526001600160a01b03808416602483015260448201929092529192507f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b158015610d6e57600080fd5b505af1158015610d82573d6000803e3d6000fd5b5050505081600081518110610d9957610d996115dc565b60200260200101516003600085815260200190815260200160002054826001600160a01b03167f6af15671f701d06db328c1db50260c4c9097653f264ea928002427fb954986c560405160405180910390a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661047d57610e2c816001600160a01b03166014610f8b565b610e37836020610f8b565b604051602001610e4892919061163b565b60408051601f198184030181529082905262461bcd60e51b825261046a916004016116bc565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661047d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610ec83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff161561047d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606000610f9a8360026116ef565b610fa59060026115ad565b67ffffffffffffffff811115610fbd57610fbd6112cd565b6040519080825280601f01601f191660200182016040528015610fe7576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061101e5761101e6115dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611081576110816115dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006110bd8460026116ef565b6110c89060016115ad565b90505b6001811115611165577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611109576111096115dc565b1a60f81b82828151811061111f5761111f6115dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361115e8161170e565b90506110cb565b5083156111b45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161046a565b9392505050565b6000602082840312156111cd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111b457600080fd5b60006020828403121561120f57600080fd5b5035919050565b6001600160a01b038116811461122b57600080fd5b50565b60008060008060006080868803121561124657600080fd5b853561125181611216565b9450602086013561126181611216565b935060408601359250606086013567ffffffffffffffff8082111561128557600080fd5b818801915088601f83011261129957600080fd5b8135818111156112a857600080fd5b8960208285010111156112ba57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156112f657600080fd5b8235915060208084013567ffffffffffffffff8082111561131657600080fd5b818601915086601f83011261132a57600080fd5b81358181111561133c5761133c6112cd565b8060051b604051601f19603f83011681018181108582111715611361576113616112cd565b60405291825284820192508381018501918983111561137f57600080fd5b938501935b8285101561139d57843584529385019392850192611384565b8096505050505050509250929050565b6000608082840312156113bf57600080fd5b50919050565b600080604083850312156113d857600080fd5b8235915060208301356113ea81611216565b809150509250929050565b6000806040838503121561140857600080fd5b823561141381611216565b946020939093013593505050565b801515811461122b57600080fd5b60008060006060848603121561144457600080fd5b8335925060208401359150604084013561145d81611421565b809150509250925092565b8135815560018101602083013567ffffffffffffffff811680821461148c57600080fd5b82549150807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316178355604085013563ffffffff811681146114ce57600080fd5b6bffffffff00000000000000008160401b16827fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851617178455505050606083013561ffff8116811461152057600080fd5b81547fffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff16606082901b6dffff0000000000000000000000001617825561049a565b60006020828403121561157357600080fd5b5051919050565b60006020828403121561158c57600080fd5b81516111b481611421565b634e487b7160e01b600052601160045260246000fd5b600082198211156115c0576115c0611597565b500190565b6000828210156115d7576115d7611597565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561160457600080fd5b81516111b481611216565b60005b8381101561162a578181015183820152602001611612565b8381111561049a5750506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161167381601785016020880161160f565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516116b081602884016020880161160f565b01602801949350505050565b60208152600082518060208401526116db81604085016020870161160f565b601f01601f19169190910160400192915050565b600081600019048311821515161561170957611709611597565b500290565b60008161171d5761171d611597565b50600019019056fea2646970667358221220cf631396dd857a753a19eadbb3d52894bfe54bccf97c6b967c45e9b6b812769464736f6c634300080b0033000000000000000000000000084fd17c6a5697bd651b6482fa916c0b3a0e61610000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d830000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea0000000000000000000000000a310425046661c523d98344f7e9d66b32195365d000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef0000000000000000000000000000000000000000000000000000000000000080
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806336568abe1161009757806391d148541161006657806391d14854146102c9578063a217fddf14610300578063d547741f14610308578063ddff07791461031b57600080fd5b806336568abe1461021757806352566e931461022a5780635705ae43146102a35780636df4c6a8146102b657600080fd5b80631fe543e3116100d35780631fe543e3146101b9578063248a9ca3146101ce5780632a2ae6b7146101f15780632f2ff15d1461020457600080fd5b806301ffc9a7146100fa5780630750b16314610122578063150b7a0214610150575b600080fd5b61010d6101083660046111bb565b610342565b60405190151581526020015b60405180910390f35b6101426101303660046111fd565b60036020526000908152604090205481565b604051908152602001610119565b61018861015e36600461122e565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610119565b6101cc6101c73660046112e3565b6103db565b005b6101426101dc3660046111fd565b60009081526020819052604090206001015490565b6101cc6101ff3660046113ad565b610481565b6101cc6102123660046113c5565b6104a0565b6101cc6102253660046113c5565b6104cb565b60015460025461026b919067ffffffffffffffff81169068010000000000000000810463ffffffff16906c01000000000000000000000000900461ffff1684565b6040805194855267ffffffffffffffff909316602085015263ffffffff9091169183019190915261ffff166060820152608001610119565b6101cc6102b13660046113f5565b610553565b6101cc6102c436600461142f565b6105ec565b61010d6102d73660046113c5565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610142600081565b6101cc6103163660046113c5565b610c17565b6101427fe4d7462aef13f3a87b131da37aa6e800b9680cd0bee1ec7d70b800970c11e7bb81565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806103d557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610473576040517f1cf993f40000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091660248201526044015b60405180910390fd5b61047d8282610c3d565b5050565b600061048d8133610df0565b81600161049a8282611468565b50505050565b6000828152602081905260409020600101546104bc8133610df0565b6104c68383610e6e565b505050565b6001600160a01b03811633146105495760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161046a565b61047d8282610f0c565b600061055f8133610df0565b6040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018490527f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d8316906323b872dd90606401600060405180830381600087803b1580156105cf57600080fd5b505af11580156105e3573d6000803e3d6000fd5b50505050505050565b7fe4d7462aef13f3a87b131da37aa6e800b9680cd0bee1ec7d70b800970c11e7bb6106178133610df0565b7f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d836001600160a01b031663d5abeb016040518163ffffffff1660e01b8152600401602060405180830381865afa158015610675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106999190611561565b7f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071b9190611561565b1415610753576040517fdea47e9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81156107cd577f00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea06001600160a01b03166312bf78b76040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107b457600080fd5b505af11580156107c8573d6000803e3d6000fd5b505050505b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea08116600483015268a2a15d09519be0000060248301527f0000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d1690639dc29fac90604401600060405180830381600087803b15801561087857600080fd5b505af115801561088c573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b037f00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea0811660048301523060248301526828a857425466f8000060448301527f0000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d1692506323b872dd91506064016020604051808303816000875af115801561092d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610951919061157a565b506040517f65a8a03700000000000000000000000000000000000000000000000000000000815260048101859052602481018490527f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d836001600160a01b0316906365a8a03790604401600060405180830381600087803b1580156109d457600080fd5b505af11580156109e8573d6000803e3d6000fd5b5050505060017f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d836001600160a01b031663539cb1e76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a709190611561565b7f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d836001600160a01b0316633299c1206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af29190611561565b610afc91906115ad565b610b0691906115c5565b600180546002546040517f5d3b1d30000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff811660248301526c01000000000000000000000000810461ffff16604483015268010000000000000000900463ffffffff16606482015260848101919091526003906000907f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699096001600160a01b031690635d3b1d309060a4016020604051808303816000875af1158015610bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c009190611561565b815260208101919091526040016000205550505050565b600082815260208190526040902060010154610c338133610df0565b6104c68383610f0c565b60007f000000000000000000000000a310425046661c523d98344f7e9d66b32195365d6001600160a01b03166399c04c0183600081518110610c8157610c816115dc565b60200260200101516040518263ffffffff1660e01b8152600401610ca791815260200190565b6020604051808303816000875af1158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea91906115f2565b600084815260036020526040908190205490516323b872dd60e01b81523060048201526001600160a01b03808416602483015260448201929092529192507f0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d8316906323b872dd90606401600060405180830381600087803b158015610d6e57600080fd5b505af1158015610d82573d6000803e3d6000fd5b5050505081600081518110610d9957610d996115dc565b60200260200101516003600085815260200190815260200160002054826001600160a01b03167f6af15671f701d06db328c1db50260c4c9097653f264ea928002427fb954986c560405160405180910390a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661047d57610e2c816001600160a01b03166014610f8b565b610e37836020610f8b565b604051602001610e4892919061163b565b60408051601f198184030181529082905262461bcd60e51b825261046a916004016116bc565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661047d576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610ec83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff161561047d576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606000610f9a8360026116ef565b610fa59060026115ad565b67ffffffffffffffff811115610fbd57610fbd6112cd565b6040519080825280601f01601f191660200182016040528015610fe7576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061101e5761101e6115dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611081576110816115dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006110bd8460026116ef565b6110c89060016115ad565b90505b6001811115611165577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611109576111096115dc565b1a60f81b82828151811061111f5761111f6115dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c9361115e8161170e565b90506110cb565b5083156111b45760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161046a565b9392505050565b6000602082840312156111cd57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111b457600080fd5b60006020828403121561120f57600080fd5b5035919050565b6001600160a01b038116811461122b57600080fd5b50565b60008060008060006080868803121561124657600080fd5b853561125181611216565b9450602086013561126181611216565b935060408601359250606086013567ffffffffffffffff8082111561128557600080fd5b818801915088601f83011261129957600080fd5b8135818111156112a857600080fd5b8960208285010111156112ba57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156112f657600080fd5b8235915060208084013567ffffffffffffffff8082111561131657600080fd5b818601915086601f83011261132a57600080fd5b81358181111561133c5761133c6112cd565b8060051b604051601f19603f83011681018181108582111715611361576113616112cd565b60405291825284820192508381018501918983111561137f57600080fd5b938501935b8285101561139d57843584529385019392850192611384565b8096505050505050509250929050565b6000608082840312156113bf57600080fd5b50919050565b600080604083850312156113d857600080fd5b8235915060208301356113ea81611216565b809150509250929050565b6000806040838503121561140857600080fd5b823561141381611216565b946020939093013593505050565b801515811461122b57600080fd5b60008060006060848603121561144457600080fd5b8335925060208401359150604084013561145d81611421565b809150509250925092565b8135815560018101602083013567ffffffffffffffff811680821461148c57600080fd5b82549150807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008316178355604085013563ffffffff811681146114ce57600080fd5b6bffffffff00000000000000008160401b16827fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851617178455505050606083013561ffff8116811461152057600080fd5b81547fffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff16606082901b6dffff0000000000000000000000001617825561049a565b60006020828403121561157357600080fd5b5051919050565b60006020828403121561158c57600080fd5b81516111b481611421565b634e487b7160e01b600052601160045260246000fd5b600082198211156115c0576115c0611597565b500190565b6000828210156115d7576115d7611597565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561160457600080fd5b81516111b481611216565b60005b8381101561162a578181015183820152602001611612565b8381111561049a5750506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161167381601785016020880161160f565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516116b081602884016020880161160f565b01602801949350505050565b60208152600082518060208401526116db81604085016020870161160f565b601f01601f19169190910160400192915050565b600081600019048311821515161561170957611709611597565b500290565b60008161171d5761171d611597565b50600019019056fea2646970667358221220cf631396dd857a753a19eadbb3d52894bfe54bccf97c6b967c45e9b6b812769464736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000084fd17c6a5697bd651b6482fa916c0b3a0e61610000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d830000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea0000000000000000000000000a310425046661c523d98344f7e9d66b32195365d000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef0000000000000000000000000000000000000000000000000000000000000080
-----Decoded View---------------
Arg [0] : admin (address): 0x084FD17c6A5697bd651b6482fa916C0b3a0e6161
Arg [1] : kaiju (address): 0x0c2E57EFddbA8c768147D1fdF9176a0A6EBd5d83
Arg [2] : rwaste (address): 0x5cd2FAc9702D68dde5a94B1af95962bCFb80fC7d
Arg [3] : scales (address): 0x27192b750fF796514f039512aaf5A3655a095ea0
Arg [4] : scientists (address): 0xA310425046661c523d98344F7E9D66B32195365d
Arg [5] : vrfCoordinator (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [6] : keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [7] : subId (uint64): 128
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000084fd17c6a5697bd651b6482fa916c0b3a0e6161
Arg [1] : 0000000000000000000000000c2e57efddba8c768147d1fdf9176a0a6ebd5d83
Arg [2] : 0000000000000000000000005cd2fac9702d68dde5a94b1af95962bcfb80fc7d
Arg [3] : 00000000000000000000000027192b750ff796514f039512aaf5a3655a095ea0
Arg [4] : 000000000000000000000000a310425046661c523d98344f7e9d66b32195365d
Arg [5] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [6] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000080
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.