More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 25,496 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Many | 2386621 | 2 secs ago | IN | 0 ETH | 0.00000823 | ||||
Upgrade Many | 2386618 | 5 secs ago | IN | 0 ETH | 0.0000071 | ||||
Claim Many | 2386618 | 5 secs ago | IN | 0 ETH | 0.00000653 | ||||
Claim Many | 2386614 | 9 secs ago | IN | 0 ETH | 0.0000088 | ||||
Upgrade Many | 2386608 | 15 secs ago | IN | 0 ETH | 0.00000725 | ||||
Upgrade Many | 2386601 | 22 secs ago | IN | 0 ETH | 0.00000722 | ||||
Upgrade Many | 2386592 | 31 secs ago | IN | 0 ETH | 0.0000071 | ||||
Unstake Many | 2386590 | 33 secs ago | IN | 0 ETH | 0.00000593 | ||||
Upgrade Many | 2386589 | 34 secs ago | IN | 0 ETH | 0.00000732 | ||||
Claim Many | 2386588 | 35 secs ago | IN | 0 ETH | 0.00000832 | ||||
Claim Many | 2386588 | 35 secs ago | IN | 0 ETH | 0.00000475 | ||||
Upgrade Many | 2386586 | 37 secs ago | IN | 0 ETH | 0.00000697 | ||||
Claim Many | 2386578 | 45 secs ago | IN | 0 ETH | 0.00001209 | ||||
Claim Many | 2386575 | 48 secs ago | IN | 0 ETH | 0.00000883 | ||||
Claim Many | 2386572 | 51 secs ago | IN | 0 ETH | 0.00000653 | ||||
Claim Many | 2386566 | 57 secs ago | IN | 0 ETH | 0.00000576 | ||||
Claim Many | 2386563 | 1 min ago | IN | 0 ETH | 0.00001211 | ||||
Claim Many | 2386560 | 1 min ago | IN | 0 ETH | 0.00000745 | ||||
Stake Many | 2386559 | 1 min ago | IN | 0 ETH | 0.00000463 | ||||
Claim Many | 2386552 | 1 min ago | IN | 0 ETH | 0.00000475 | ||||
Unstake Many | 2386547 | 1 min ago | IN | 0 ETH | 0.00000853 | ||||
Claim Many | 2386543 | 1 min ago | IN | 0 ETH | 0.00000651 | ||||
Unstake Many | 2386541 | 1 min ago | IN | 0 ETH | 0.00000842 | ||||
Unstake Many | 2386539 | 1 min ago | IN | 0 ETH | 0.00000849 | ||||
Unstake Many | 2386539 | 1 min ago | IN | 0 ETH | 0.00000593 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
2251095 | 38 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
LevelingGame
Compiler Version
v0.8.28+commit.7893614a
ZkSolc Version
v1.5.10
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.27; import {IERC20} from "./interfaces/IERC20.sol"; import {IERC721} from "./interfaces/IERC721.sol"; import {IVRFSystem} from "./interfaces/IVRFSystem.sol"; import {Ownable} from "solady/auth/Ownable.sol"; import {DelegateCheckerLib} from "solady/utils/ext/zksync/delegatexyz/DelegateCheckerLib.sol"; /// @notice Leveling contract for the Genesis Heroes. /// @author Onchain-Heroes (https://www.onchainheroes.xyz/) /// @author atarpara (https://www.github.com/atarpara) contract LevelingGame is Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Caller is not a owner or delegate wallet. error CallerIsNotOwnerOrDelegateWallet(); /// @dev Level is not upgraded yet. error LevelUpgradeInProgress(); /// @dev Level upgrade type is not valid. error InvalidLevelUpgradeType(); /// @dev Already reached max level. error MaxLevelReached(); /// @dev Not eligible for upgrade level. error NotEligible(); /// @dev Cooldown period is not over yet. error CoolDownPeriod(); /// @dev Contract is paused. error Paused(); /// @dev Contract is not paused. error Unpaused(); /// @dev Given action is not allowed. error NotAllowed(); /// @dev Request is already fulfilled. error AlreadyFulfilled(); /// @dev Request is not exist. error RequestNotExist(); /// @dev Season is not running yet. error NotActiveSeason(); /// @dev Hero must be unstake before a upgrade. error RequiresUnstakedForUpgrade(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when `owner` stakes `tokenId` at `timestamp`. event Staked(address owner, uint256 tokenId, uint256 timestamp); /// @dev Emitted when `user` claims rewards for `tokenID` with `amount` at `timestamp`. event Claimed(address indexed user, uint256 tokenId, uint256 timestamp, uint256 amount); /// @dev Emitted when `owner` unstakes `tokenId` at `timestamp`. event Unstaked(address owner, uint256 tokenId, uint256 timestamp); /// @dev Emitted when `user` requested upgrade `tokenId` for `levelUpType`. event UpgradeRequested(address indexed user, uint256 indexed tokenId, uint8 levelUpType); /// @dev Emitted when `tokenId` is upgraded from `oldLevel` to `newLevel`. event Upgraded(address indexed user, uint256 tokenId, uint256 oldLevel, uint256 newLevel); /// @dev Emitted when `tokenId` is lucky upgraded from `oldLevel` to `newLevel`. event LuckyUpgraded(address indexed user, uint256 tokenId, uint256 oldLevel, uint256 newLevel); /// @dev Emitted when `tokenId` is chaos upgraded from `oldLevel` to `newLevel`. event ChaosUpgraded(address indexed user, uint256 tokenId, uint256 oldLevel, uint256 newLevel); /// @dev Emitted when `chaosLevel` is changed. event ChaosPercentageChanged(uint256[5] percentags); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANT */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Hero must unstake after 6 hours. uint256 internal constant _MINIMUM_STAKING_TIME = 6 hours; /// @dev Maximum possible level of `hero`. uint256 internal constant _MAX_LEVEL = 69; /// @dev Hero next level upgrade possible after 12 hours. uint256 internal constant _MINIMUM_UPGRADE_TIME = 12 hours; /// @dev Bitmask for the retrieve value of last level upgrade time. uint256 internal constant _BITMASK_LEVEL_UPGRADE = 0x0fffffffffff << 8; /// @dev Bitmask for the retrieve value of level of the hero. uint256 internal constant _BITMASK_LEVEL = 0xff; /// @dev Bitmask for the retrieve value of stake time of the hero. uint256 internal constant _BITMASK_STAKE_TIME = 0x0fffffffffff << 52; /// @dev Bitmask for the retrieve value of `tokenID` of the hero. uint256 internal constant _BITMASK_TOKEN_ID = 0x3fffffffffff << 8; /// @dev ERC-20 reward token `HERO20`. IERC20 internal constant hero20 = IERC20(0x33EE11cE309854a45B65368C078616ABcb5c6e3d); /// @dev ERC-721A token representing in-game assets (`HeroERC721AC`). IERC721 internal constant hero721 = IERC721(0x7c47ea32FD27d1a74Fc6e9F31Ce8162e6Ce070eB); /// @dev VRF system contract for getting verifiable random numbers in the POP Network. IVRFSystem internal constant vrf = IVRFSystem(0xBDC8B6eb1840215A22fC1134046f595b7D42C2DE); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev `requestData` bit layout /// [255..256) fulfilled: Boolean value which used checking request fulfill status. /// [254..255) exists: Boolean value which checks request existence. /// [214..254) chaosLevel : Percentage of chaos for request. /// [54..214) account : Address of the user. /// [8..54) tokenId: Indicate which `tokenId` will be upgrade. /// [0..8) levelUpType: Indicates which type of level upgrade. mapping(uint256 requestId => uint256 requestData) private _requests; /// @dev `stakeInfomation` bit layout. /// [96..256) owner: Address of the user who stake hero. /// [52..96) stakeTime : Indicate timestamp of the last staking. ( 2^44 -1 ) /// [8..52) upgradeTime: Indicate timestamp of the level upgraded. /// [0..8) level: Indicates current level of hero. mapping(uint256 id => uint256) public stakeI; /// @dev Tracks the last claim time for each hero. mapping(uint256 id => uint256) public claimTime; /// @dev Timestamp of start season for staking. uint64 public startSeasonTime; /// @dev Timestamp of end season for staking. uint64 public endSeasonTime; /// @dev Flag for checking contract pause. uint64 pauseFlag; /// @dev Chaos level Percentage Bit Layout. /// [32..39] Percentage of upgrade by 3 /// [24..31] Percentage of upgrade by 2 /// [16..23] Percentage of upgrade by 1 /// [8..15] Percentage of upgrade by 0 /// [0..7] Percentage of upgrade by -1 uint40 chaosLevel; constructor(address _owner) { _initializeOwner(_owner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Modifier for the checking season running. modifier onlyDuringActiveSeason() { if (block.timestamp >= endSeasonTime || block.timestamp < startSeasonTime) { revert NotActiveSeason(); } _; } /// @dev Modifier for the checking contract pause status. modifier whenNotPaused() { if (pauseFlag != 0) revert Paused(); _; } /// @dev Modifier for the checking contract unpause status. modifier whenPaused() { if (pauseFlag == 0) revert Unpaused(); _; } /// @dev Allows the owner of a tokens to stake it during an active season. /// /// Requirements: /// - caller is must owner of `id` /// - season must be active /// - contract must be not pause /// /// Emits a `Staked` event upon successful staking function stakeMany(uint256[] calldata ids) external onlyDuringActiveSeason whenNotPaused { uint256 len = ids.length; for (uint256 i = 0; i < len;) { uint256 id = ids[i]; address owner = hero721.ownerOf(id); // Caller must owner of given token id or delegated wallet if (owner != msg.sender) { if (!DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)) { revert CallerIsNotOwnerOrDelegateWallet(); } } uint256 stake = stakeI[id]; // Can't allow to stake in between level upgrade. if ((stake & _BITMASK_LEVEL_UPGRADE) >> 8 == 0x0fffffffffff) revert LevelUpgradeInProgress(); uint256 level = (stake & _BITMASK_LEVEL) == 0 ? 1 : stake & _BITMASK_LEVEL; /// @solidity memory-safe-assembly assembly { // Store staking information stake := or(or(shl(96, owner), or(shl(52, timestamp()), level)), and(stake, _BITMASK_LEVEL_UPGRADE)) } stakeI[id] = stake; // updates claim time for correct rewards claimTime[id] = block.timestamp; hero721.transferFrom(owner, address(this), id); emit Staked(owner, id, block.timestamp); ++i; } } /// @dev Unstake the heroes and give pending rewards to owner. /// /// Requirements: /// - caller must be original owner. /// - must be staked for at least 6 hr. /// /// Emits a `Unstaked` event upon successful unstaking. function unstakeMany(uint256[] calldata ids) external whenNotPaused { uint256 len = ids.length; for (uint256 i = 0; i < len;) { uint256 id = ids[i]; uint256 stake = stakeI[id]; address owner = address(uint160(stake >> 96)); // Caller must owner of given token id or delegated wallet if (owner != msg.sender) { if (!DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)) { revert CallerIsNotOwnerOrDelegateWallet(); } } if ((block.timestamp - ((stake & _BITMASK_STAKE_TIME) >> 52)) < _MINIMUM_STAKING_TIME) { revert CoolDownPeriod(); } // claim remmaing tokens _claim(id, stake); // Clear owner and staking time stakeI[id] = (stakeI[id] << 204) >> 204; emit Unstaked(owner, id, block.timestamp); // Transfer back to original owner. hero721.transferFrom(address(this), owner, id); ++i; } } /// @dev Claims staking rewards against staked hero based on level. /// /// Requirements: /// - contract must be not pause /// /// Emits a `Claimed` event upon successful claim. function claimMany(uint256[] calldata ids) public whenNotPaused { uint256 len = ids.length; for (uint256 i; i < len;) { uint256 id = ids[i]; uint256 stake = stakeI[id]; address owner = address(uint160(stake >> 96)); // Caller must owner of given token id or delegated wallet if (owner != msg.sender) { if (!DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)) { revert CallerIsNotOwnerOrDelegateWallet(); } } _claim(id, stake); ++i; } } /// @dev Upgrades the level of a `ids` with `levelUpType` and `randomness`. /// Requirements: /// - contract must be not paused /// - must be passed 12h cooldown period /// function upgradeMany(uint256[] calldata ids, uint8 levelUpType) external payable whenNotPaused onlyDuringActiveSeason { // Checks the levelUpType if (levelUpType > 2) revert InvalidLevelUpgradeType(); uint256 len = ids.length; for (uint256 i = 0; i < len; ++i) { _upgradeLevel(ids[i], levelUpType); } } /// @dev Upgrade the level of a `id` with `levelUpType`. function _upgradeLevel(uint256 id, uint8 levelUpType) internal { address owner = hero721.ownerOf(id); // Caller must owner of given token id or delegated wallet if (owner != msg.sender) { // forgefmt: disable-next-item if (!(DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id) && DelegateCheckerLib.checkDelegateForContract(msg.sender, owner, address(hero20)))) { revert CallerIsNotOwnerOrDelegateWallet(); } } // Get a hero information uint256 stake = stakeI[id]; // Current level of hero uint256 level = stake & _BITMASK_LEVEL; // Can't upgrade more if already reached `MAX_LEVEL` if (level == _MAX_LEVEL) revert MaxLevelReached(); // Must be staked a once for a upgrade if (level == 0) revert NotEligible(); // For a upgrade hero must be unstaked if ((stake >> 96) != 0) revert RequiresUnstakedForUpgrade(); // For a next upgrade must be wait `_MINIMUM_UPGRADE_TIME` if (block.timestamp - ((stake & _BITMASK_LEVEL_UPGRADE) >> 8) <= _MINIMUM_UPGRADE_TIME) { revert CoolDownPeriod(); } // Pays amount of HERO20 token for a upgrade uint256 amount = getRewardsPerDay(id); hero20.transferFrom(owner, address(this), amount); if (levelUpType == 0) { /// @solidity memory-safe-assembly assembly { stake := or(shl(8, timestamp()), add(level, 1)) } // Updates hero information stakeI[id] = stake; emit Upgraded(owner, id, level, level + 1); } else { uint256 requestId = vrf.requestRandomNumberWithTraceId(0); uint256 req; uint40 currentChaosLevel = chaosLevel; /// @solidity memory-safe-assembly assembly { req := or(or(or(or(shl(254, 1), shl(214, currentChaosLevel)), shl(54, owner)), shl(8, id)), levelUpType) } _requests[requestId] = req; stakeI[id] = stake | _BITMASK_LEVEL_UPGRADE; emit UpgradeRequested(owner, id, levelUpType); } } /// @dev Returns earned per day $HERO20. function getRewardsPerDay(uint256 id) public view returns (uint256) { uint256 level = stakeI[id] & 0xff; return (2000 * level * 10 ** 18) / (20 + level); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Handdles the callback for random number vrf used to upgrade token levels. function vrfCallback(uint256 requestId, uint256 randomNumber) internal { // Retrieve request data from `requestId`. uint256 requestData = _requests[requestId]; // Check requests fulfill status. if (requestData >> 255 & 1 == 1) revert AlreadyFulfilled(); // Check requests exists status. if (requestData >> 254 & 1 == 0) revert RequestNotExist(); // Set a fulfill status _requests[requestId] |= 1 << 255; uint256 levelType = requestData & _BITMASK_LEVEL; // Upgrade Level Type uint256 tokenId = (requestData & _BITMASK_TOKEN_ID) >> 8; // Hero tokenId address account = address(uint160(requestData >> 54)); uint256 stake = stakeI[tokenId]; uint256 oldLevel = stake & _BITMASK_LEVEL; // Current Level of tokenId randomNumber = uint256(keccak256(abi.encode(requestId, randomNumber))); if (levelType == 1) { // lucky level uint256 newLevel = oldLevel + (uint256(randomNumber) & 2); if (newLevel > _MAX_LEVEL) newLevel = _MAX_LEVEL; emit LuckyUpgraded(account, uint64(tokenId), oldLevel, newLevel); stakeI[tokenId] = block.timestamp << 8 | newLevel; } else { // chaos level uint256 newLevel; /// @solidity memory-safe-assembly assembly { for { let up let i := 0x00 let chaosPercentage := and(shr(214, requestData), 0xffffffffff) let chance := mod(randomNumber, 100) } 1 {} { up := add(up, and(shr(i, chaosPercentage), 0xff)) if lt(chance, up) { newLevel := sub(add(oldLevel, shr(3, i)), 1) break } i := add(i, 0x08) } } if (newLevel > _MAX_LEVEL) newLevel = _MAX_LEVEL; if (newLevel == 0) newLevel = 1; emit ChaosUpgraded(account, uint64(tokenId), oldLevel, newLevel); stakeI[tokenId] = block.timestamp << 8 | newLevel; } } /// @dev Claims remanning earned tokens. function _claim(uint256 id, uint256 stake) internal { uint256 lastClaimTime = claimTime[id]; if (lastClaimTime >= endSeasonTime) return; uint256 duration; if (block.timestamp > endSeasonTime) { duration = endSeasonTime - lastClaimTime; } else { duration = block.timestamp - lastClaimTime; } uint256 level = stake & 0xff; uint256 rewards = ((2000 * level * 10 ** 18 * duration) / (20 + level)) / 1 days; if (rewards == 0) return; claimTime[id] = uint256(block.timestamp); address user = address(uint160(stake >> 96)); emit Claimed(user, id, block.timestamp, rewards); hero20.transfer(user, rewards); } /// @dev Recovery mechanisms for retrieving heroes when contract paused. /// /// Requirements: /// - caller must be original owner. /// /// Note: This function doesn't give any pending rewards. function emergencyUnstake(uint256[] memory ids) external whenPaused { uint256 len = ids.length; for (uint256 i = 0; i < len;) { uint256 id = ids[i]; uint256 stake = stakeI[id]; address owner = address(uint160(stake >> 96)); // Caller must owner of given token id or delegated wallet if (owner != msg.sender) { if (!DelegateCheckerLib.checkDelegateForERC721(msg.sender, owner, address(hero721), id)) { revert CallerIsNotOwnerOrDelegateWallet(); } } // Clear owner and staking time stakeI[id] = (stakeI[id] << 204) >> 204; emit Unstaked(owner, id, block.timestamp); // Transfer back to original owner. hero721.transferFrom(address(this), owner, id); ++i; } } function isPaused() external view returns (bool) { return pauseFlag != 0; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* OWNER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Owner can set chaos level percentage. function setChaosLevelPercentage(uint256[5] calldata per) external onlyOwner { uint256 newchaos = per[0] + per[1] + per[2] + per[3] + per[4]; if (newchaos != 100) revert NotAllowed(); chaosLevel = uint40(per[4] << 32 | per[3] << 24 | per[2] << 16 | per[1] << 8 | per[0]); emit ChaosPercentageChanged(per); } /// @dev Get chaos level percentage. function getChaosLevelPercentage() public view returns (uint256[5] memory result) { result[0] = chaosLevel & 0xff; result[1] = (chaosLevel >> 8) & 0xff; result[2] = (chaosLevel >> 16) & 0xff; result[3] = (chaosLevel >> 24) & 0xff; result[4] = (chaosLevel >> 32) & 0xff; } /// @dev Owner can set pause flag. /// Note: Non-zero values means contract paused. function setFlag(uint64 flag) external onlyOwner { pauseFlag = flag; } /// @dev Owner can set timestamp of the season. function setParameter(uint64 startTimestamp, uint64 endTimestamp) external onlyOwner { if (startSeasonTime != startTimestamp) { // Reverts if season stared. if (block.timestamp >= startSeasonTime && startSeasonTime != 0) revert NotAllowed(); startSeasonTime = startTimestamp; } if (endSeasonTime != endTimestamp) { // Reverts if season ended. if ((block.timestamp > endSeasonTime && endSeasonTime != 0) || endTimestamp < startTimestamp) { revert NotAllowed(); } endSeasonTime = endTimestamp; } } /// @dev Withdraw `HERO20` tokens to `to`. function withdrawFee(address to) external onlyOwner { uint256 balance = hero20.balanceOf(address(this)); hero20.transfer(to, balance); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* POP FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev This method is called by Entropy contract of Play-of-proof network. function randomNumberCallback(uint256 requestId, uint256 randomNumber) external { if (msg.sender != address(vrf)) revert Unauthorized(); vrfCallback(requestId, randomNumber); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { function mint(address to, uint256 amount) external; function transferFrom(address from, address to, uint256 amount) external returns (bool); function transfer(address to, uint256 amount) external returns (bool); function balanceOf(address to) external returns (uint256); function burn(uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC721 { function transferFrom(address from, address to, uint256 amount) external; function safeTransferFrom(address from, address to, uint256 amount) external; function ownerOf(uint256 tokenId) external view returns (address owner); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IVRFSystem { function requestRandomNumberWithTraceId(uint256 traceId) external returns (uint256 requestId); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple single owner authorization mixin. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol) /// /// @dev Note: /// This implementation does NOT auto-initialize the owner to `msg.sender`. /// You MUST call the `_initializeOwner` in the constructor / initializer. /// /// While the ownable portion follows /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility, /// the nomenclature for the 2-step ownership handover may be unique to this codebase. abstract contract Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The `newOwner` cannot be the zero address. error NewOwnerIsZeroAddress(); /// @dev The `pendingOwner` does not have a valid handover request. error NoHandoverRequest(); /// @dev Cannot double-initialize. error AlreadyInitialized(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ownership is transferred from `oldOwner` to `newOwner`. /// This event is intentionally kept the same as OpenZeppelin's Ownable to be /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), /// despite it not being as lightweight as a single argument event. event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); /// @dev An ownership handover to `pendingOwner` has been requested. event OwnershipHandoverRequested(address indexed pendingOwner); /// @dev The ownership handover to `pendingOwner` has been canceled. event OwnershipHandoverCanceled(address indexed pendingOwner); /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`. uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE = 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0; /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE = 0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d; /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE = 0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The owner slot is given by: /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`. /// It is intentionally chosen to be a high value /// to avoid collision with lower slots. /// The choice of manual storage layout is to enable compatibility /// with both regular and upgradeable contracts. bytes32 internal constant _OWNER_SLOT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927; /// The ownership handover slot of `newOwner` is given by: /// ``` /// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED)) /// let handoverSlot := keccak256(0x00, 0x20) /// ``` /// It stores the expiry timestamp of the two-step ownership handover. uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Override to return true to make `_initializeOwner` prevent double-initialization. function _guardInitializeOwner() internal pure virtual returns (bool guard) {} /// @dev Initializes the owner directly without authorization guard. /// This function must be called upon initialization, /// regardless of whether the contract is upgradeable or not. /// This is to enable generalization to both regular and upgradeable contracts, /// and to save gas in case the initial owner is not the caller. /// For performance reasons, this function will not check if there /// is an existing owner. function _initializeOwner(address newOwner) internal virtual { if (_guardInitializeOwner()) { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT if sload(ownerSlot) { mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`. revert(0x1c, 0x04) } // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner)))) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } else { /// @solidity memory-safe-assembly assembly { // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(_OWNER_SLOT, newOwner) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } } /// @dev Sets the owner directly without authorization guard. function _setOwner(address newOwner) internal virtual { if (_guardInitializeOwner()) { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner)))) } } else { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, newOwner) } } } /// @dev Throws if the sender is not the owner. function _checkOwner() internal view virtual { /// @solidity memory-safe-assembly assembly { // If the caller is not the stored owner, revert. if iszero(eq(caller(), sload(_OWNER_SLOT))) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } } } /// @dev Returns how long a two-step ownership handover is valid for in seconds. /// Override to return a different value if needed. /// Made internal to conserve bytecode. Wrap it in a public function if needed. function _ownershipHandoverValidFor() internal view virtual returns (uint64) { return 48 * 3600; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC UPDATE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Allows the owner to transfer the ownership to `newOwner`. function transferOwnership(address newOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { if iszero(shl(96, newOwner)) { mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`. revert(0x1c, 0x04) } } _setOwner(newOwner); } /// @dev Allows the owner to renounce their ownership. function renounceOwnership() public payable virtual onlyOwner { _setOwner(address(0)); } /// @dev Request a two-step ownership handover to the caller. /// The request will automatically expire in 48 hours (172800 seconds) by default. function requestOwnershipHandover() public payable virtual { unchecked { uint256 expires = block.timestamp + _ownershipHandoverValidFor(); /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to `expires`. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), expires) // Emit the {OwnershipHandoverRequested} event. log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller()) } } } /// @dev Cancels the two-step ownership handover to the caller, if any. function cancelOwnershipHandover() public payable virtual { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), 0) // Emit the {OwnershipHandoverCanceled} event. log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller()) } } /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`. /// Reverts if there is no existing ownership handover requested by `pendingOwner`. function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) let handoverSlot := keccak256(0x0c, 0x20) // If the handover does not exist, or has expired. if gt(timestamp(), sload(handoverSlot)) { mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`. revert(0x1c, 0x04) } // Set the handover slot to 0. sstore(handoverSlot, 0) } _setOwner(pendingOwner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC READ FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the owner of the contract. function owner() public view virtual returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(_OWNER_SLOT) } } /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`. function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the handover slot. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) // Load the handover slot. result := sload(keccak256(0x0c, 0x20)) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Marks a function as only callable by the owner. modifier onlyOwner() virtual { _checkOwner(); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Library for efficient querying of the delegate registry on ZKsync. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ext/zksync/delegatexyz/DelegateCheckerLib.sol) library DelegateCheckerLib { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The canonical delegate registry V2 on ZKsync. /// There's no V1 on ZKsync. /// See: https://sepolia.abscan.org/address/0x0000000059A24EB229eED07Ac44229DB56C5d797 address internal constant DELEGATE_REGISTRY_V2 = 0x0000000059A24EB229eED07Ac44229DB56C5d797; /// @dev The storage slot to store an override address for the `DELEGATE_REGISTRY_V2`. /// If the address is non-zero, it will be used instead. /// This is so that you can avoid using `vm.etch` in ZKsync Foundry, /// and instead use `vm.store` instead. bytes32 internal constant DELEGATE_REGISTRY_V2_OVERRIDE_SLOT = 0x04ecb0522ab37ca0b278a89c6884dfdbcde83c177150fc939ab02e069068bdef; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* DELEGATE CHECKING OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ // Note: // - `to` is the delegate. Typically called the "hot wallet". // - `from` is the grantor of the delegate rights. Typically called the "cold vault". /// @dev Returns if `to` is a delegate of `from`. /// ``` /// v2.checkDelegateForAll(to, from, "") /// ``` function checkDelegateForAll(address to, address from) internal view returns (bool isValid) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // `0x60` is already 0. mstore(0x40, from) mstore(0x2c, shl(96, to)) mstore(0x0c, 0xe839bd53000000000000000000000000) // `checkDelegateForAll(address,address,bytes32)`. isValid := eq(mload(staticcall(gas(), v2, 0x1c, 0x64, 0x01, 0x20)), 1) mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Returns if `to` is a delegate of `from`. /// ``` /// v2.checkDelegateForAll(to, from, rights) /// ``` function checkDelegateForAll(address to, address from, bytes32 rights) internal view returns (bool isValid) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(0x60, rights) mstore(0x40, from) mstore(0x2c, shl(96, to)) mstore(0x0c, 0xe839bd53000000000000000000000000) // `checkDelegateForAll(address,address,bytes32)`. isValid := eq(mload(staticcall(gas(), v2, 0x1c, 0x64, 0x01, 0x20)), 1) mstore(0x40, m) // Restore the free memory pointer. mstore(0x60, 0) // Restore the zero pointer. } } /// @dev Returns if `to` is a delegate of `from` for the specified `contract_`. /// ``` /// v2.checkDelegateForContract(to, from, contract_, "") /// ``` /// Returns true if `checkDelegateForAll(to, from)` returns true. function checkDelegateForContract(address to, address from, address contract_) internal view returns (bool isValid) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(add(0x80, m), 0) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForContract(address,address,address,bytes32)`. mstore(add(0x0c, m), 0x8988eea9000000000000000000000000) isValid := staticcall(gas(), v2, add(m, 0x1c), 0x84, m, 0x20) isValid := and(eq(mload(m), 1), isValid) } } /// @dev Returns if `to` is a delegate of `from` for the specified `contract_`. /// ``` /// v2.checkDelegateForContract(to, from, contract_, rights) /// ``` /// Returns true if `checkDelegateForAll(to, from, rights)` returns true. function checkDelegateForContract(address to, address from, address contract_, bytes32 rights) internal view returns (bool isValid) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(add(0x80, m), rights) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForContract(address,address,address,bytes32)`. mstore(add(0x0c, m), 0x8988eea9000000000000000000000000) isValid := staticcall(gas(), v2, add(m, 0x1c), 0x84, m, 0x20) isValid := and(eq(mload(m), 1), isValid) } } /// @dev Returns if `to` is a delegate of `from` for the specified `contract_` and token `id`. /// ``` /// v2.checkDelegateForERC721(to, from, contract_, id, "") /// ``` /// Returns true if `checkDelegateForContract(to, from, contract_)` returns true. function checkDelegateForERC721(address to, address from, address contract_, uint256 id) internal view returns (bool isValid) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(add(0xa0, m), 0) mstore(add(0x80, m), id) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForERC721(address,address,address,uint256,bytes32)`. mstore(add(0x0c, m), 0xb9f36874000000000000000000000000) isValid := staticcall(gas(), v2, add(m, 0x1c), 0xa4, m, 0x20) isValid := and(eq(mload(m), 1), isValid) } } /// @dev Returns if `to` is a delegate of `from` for the specified `contract_` and token `id`. /// ``` /// v2.checkDelegateForERC721(to, from, contract_, id, rights) /// ``` /// Returns true if `checkDelegateForContract(to, from, contract_, rights)` returns true. function checkDelegateForERC721( address to, address from, address contract_, uint256 id, bytes32 rights ) internal view returns (bool isValid) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(add(0xa0, m), rights) mstore(add(0x80, m), id) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForERC721(address,address,address,uint256,bytes32)`. mstore(add(0x0c, m), 0xb9f36874000000000000000000000000) isValid := staticcall(gas(), v2, add(m, 0x1c), 0xa4, m, 0x20) isValid := and(eq(mload(m), 1), isValid) } } /// @dev Returns the amount of an ERC20 token for `contract_` /// that `to` is granted rights to act on the behalf of `from`. /// ``` /// v2.checkDelegateForERC20(to, from, contract_, "") /// ``` /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_)` returns true. function checkDelegateForERC20(address to, address from, address contract_) internal view returns (uint256 amount) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) let o := add(0x80, m) mstore(o, 0) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForERC20(address,address,address,bytes32)`. mstore(add(0x0c, m), 0xba63c817000000000000000000000000) amount := staticcall(gas(), v2, add(m, 0x1c), 0x84, o, 0x20) amount := mul(mload(o), amount) } } /// @dev Returns the amount of an ERC20 token for `contract_` /// that `to` is granted rights to act on the behalf of `from`. /// ``` /// v2.checkDelegateForERC20(to, from, contract_, rights) /// ``` /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_, rights)` returns true. function checkDelegateForERC20(address to, address from, address contract_, bytes32 rights) internal view returns (uint256 amount) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(0x00, 0) mstore(add(0x80, m), rights) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForERC20(address,address,address,bytes32)`. mstore(add(0x0c, m), 0xba63c817000000000000000000000000) amount := staticcall(gas(), v2, add(m, 0x1c), 0x84, 0x00, 0x20) amount := mul(mload(0x00), amount) } } /// @dev Returns the amount of an ERC1155 token `id` for `contract_` /// that `to` is granted rights to act on the behalf of `from`. /// ``` /// v2.checkDelegateForERC1155(to, from, contract_, id, "") /// ``` /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_)` returns true. function checkDelegateForERC1155(address to, address from, address contract_, uint256 id) internal view returns (uint256 amount) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) let o := add(0xa0, m) mstore(o, 0) mstore(add(0x80, m), id) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForERC1155(address,address,address,uint256,bytes32)`. mstore(add(0x0c, m), 0xb8705875000000000000000000000000) amount := staticcall(gas(), v2, add(m, 0x1c), 0xa4, o, 0x20) amount := mul(mload(o), amount) } } /// @dev Returns the amount of an ERC1155 token `id` for `contract_` /// that `to` is granted rights to act on the behalf of `from`. /// ``` /// v2.checkDelegateForERC1155(to, from, contract_, id, rights) /// ``` /// Returns `type(uint256).max` if `checkDelegateForContract(to, from, contract_, rights)` returns true. function checkDelegateForERC1155( address to, address from, address contract_, uint256 id, bytes32 rights ) internal view returns (uint256 amount) { address v2 = _delegateRegistryV2(); /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(0x00, 0) mstore(add(0xa0, m), rights) mstore(add(0x80, m), id) mstore(add(0x60, m), contract_) mstore(add(0x4c, m), shl(96, from)) mstore(add(0x2c, m), shl(96, to)) // `checkDelegateForERC1155(address,address,address,uint256,bytes32)`. mstore(add(0x0c, m), 0xb8705875000000000000000000000000) amount := staticcall(gas(), v2, add(m, 0x1c), 0xa4, 0x00, 0x20) amount := mul(mload(0x00), amount) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PRIVATE HELPERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the address of the delegate registry V2. function _delegateRegistryV2() private view returns (address result) { /// @solidity memory-safe-assembly assembly { // Don't worry about it, storage read is cheap on ZKsync VM. result := shr(96, shl(96, sload(DELEGATE_REGISTRY_V2_OVERRIDE_SLOT))) result := or(mul(DELEGATE_REGISTRY_V2, iszero(result)), result) } } }
{ "viaIR": false, "codegen": "yul", "remappings": [ "@limitbreak/permit-c/=lib/creator-token-standards/lib/PermitC/src/", "@opensea/tstorish/=lib/creator-token-standards/lib/tstorish/src/", "@openzeppelin/=lib/creator-token-standards/lib/openzeppelin-contracts/", "@rari-capital/solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/", "ERC721A/=lib/ERC721A/contracts/", "PermitC/=lib/creator-token-standards/lib/PermitC/", "creator-token-standards/=lib/creator-token-standards/", "delegate-registry/=lib/delegate-registry/", "ds-test/=lib/creator-token-standards/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/delegate-registry/lib/openzeppelin-contracts/lib/erc4626-tests/", "erc721a/=lib/creator-token-standards/lib/ERC721A/", "forge-gas-metering/=lib/creator-token-standards/lib/PermitC/lib/forge-gas-metering/", "forge-std/=lib/forge-std/src/", "forge-zksync-std/=lib/forge-zksync-std/src/", "murky/=lib/creator-token-standards/lib/murky/", "openzeppelin-contracts/=lib/creator-token-standards/lib/openzeppelin-contracts/", "openzeppelin/=lib/delegate-registry/lib/openzeppelin-contracts/contracts/", "solady/=lib/solady/src/", "solmate/=lib/creator-token-standards/lib/PermitC/lib/solmate/src/", "tstorish/=lib/creator-token-standards/lib/tstorish/src/" ], "evmVersion": "cancun", "outputSelection": { "*": { "*": [ "abi" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyFulfilled","type":"error"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"CallerIsNotOwnerOrDelegateWallet","type":"error"},{"inputs":[],"name":"CoolDownPeriod","type":"error"},{"inputs":[],"name":"InvalidLevelUpgradeType","type":"error"},{"inputs":[],"name":"LevelUpgradeInProgress","type":"error"},{"inputs":[],"name":"MaxLevelReached","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"NotActiveSeason","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"NotEligible","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"RequestNotExist","type":"error"},{"inputs":[],"name":"RequiresUnstakedForUpgrade","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"Unpaused","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[5]","name":"percentags","type":"uint256[5]"}],"name":"ChaosPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"ChaosUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"LuckyUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"levelUpType","type":"uint8"}],"name":"UpgradeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLevel","type":"uint256"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claimMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSeasonTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChaosLevelPercentage","outputs":[{"internalType":"uint256[5]","name":"result","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRewardsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"randomNumber","type":"uint256"}],"name":"randomNumberCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"per","type":"uint256[5]"}],"name":"setChaosLevelPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"flag","type":"uint64"}],"name":"setFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"}],"name":"setParameter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"stakeI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"stakeMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSeasonTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"unstakeMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint8","name":"levelUpType","type":"uint8"}],"name":"upgradeMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010003b1ff1399fefc2f88ce5fd2e06f968beed38823d466f7238c435aa52ad4000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef
Deployed Bytecode
0x0001000000000002000e000000000002000000000001035500000060031002700000032e033001970000000100200190000000550000c13d0000008002000039000000400020043f000000040030008c00000b9b0000413d000000000401043b000000e004400270000003360040009c0000008b0000213d000003460040009c000000d30000213d0000034e0040009c000000fe0000213d000003520040009c000001610000613d000003530040009c000001840000613d000003540040009c00000b9b0000c13d000000440030008c00000b9b0000413d0000000402100370000000000202043b000003570020009c00000b9b0000213d0000002304200039000000000034004b00000b9b0000813d0000000404200039000000000441034f000000000404043b000400000004001d000003570040009c00000b9b0000213d000300240020003d000000040200002900000005022002100000000302200029000000000032004b00000b9b0000213d0000002401100370000000000101043b000100000001001d000000ff0010008c00000b9b0000213d0000000301000039000000000101041a0000035a00100198000007660000c13d000c00000001001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b0000000c0300002900000040023002700000035702200197000000000021004b000008350000813d0000035702300197000000000021004b000008350000413d0000000101000029000000ff0110018f000700000001001d000000030010008c000009330000413d000003a701000041000000000010043f0000036c0100004100000cb4000104300000000002000416000000000002004b00000b9b0000c13d0000001f023000390000032f022001970000008002200039000000400020043f0000001f0430018f00000330053001980000008002500039000000660000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000620000c13d000000000004004b000000730000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000200030008c00000b9b0000413d000000800600043d000003310060009c00000b9b0000213d0000033201000041000000000061041b00000000010004140000032e0010009c0000032e01008041000000c00110021000000333011001c70000800d020000390000000303000039000003340400004100000000050000190cb20ca80000040f000000010020019000000b9b0000613d000000200100003900000100001004430000012000000443000003350100004100000cb30001042e000003370040009c000000e50000213d0000033f0040009c0000010b0000213d000003430040009c000003370000613d000003440040009c0000046d0000613d000003450040009c00000b9b0000c13d000000a40030008c00000b9b0000413d0000000003000416000000000003004b00000b9b0000c13d0000033203000041000000000303041a0000000004000411000000000034004b000005f60000c13d0000000403100370000000000403043b0000002405100370000000000505043b000000000045001a00000b400000413d00000000074500190000004406100370000000000606043b000000000076001a00000b400000413d00000000087600190000006407100370000000000707043b000000000087001a00000b400000413d00000000088700190000008401100370000000000101043b000000000081001a00000b400000413d0000000008810019000000640080008c000008310000c13d00000010066002100000000805500210000000000565019f0000001806700210000000000565019f0000002001100210000000000115019f000000000141019f000000c0011002100000037e011001970000000304000039000000000504041a0000037f05500197000000000115019f000000000014041b000000003103043c0000000002120436000001200020008c000000c60000c13d00000000010004140000032e0010009c0000032e01008041000000c00110021000000380011001c70000800d0200003900000001030000390000038104000041000005b50000013d000003470040009c000001260000213d0000034b0040009c0000047c0000613d0000034c0040009c000004850000613d0000034d0040009c00000b9b0000c13d000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000101043b000000000010043f00000002010000390000060c0000013d000003380040009c0000014c0000213d0000033c0040009c0000049d0000613d0000033d0040009c000004e70000613d0000033e0040009c00000b9b0000c13d000000240030008c00000b9b0000413d0000000401100370000000000101043b000003310010009c00000b9b0000213d0000033202000041000000000202041a0000000003000411000000000023004b000005f60000c13d000000000001004b0000083c0000c13d0000036d01000041000000000010043f0000036e0100004100000cb4000104300000034f0040009c000005160000613d000003500040009c0000058e0000613d000003510040009c00000b9b0000c13d0000000001000416000000000001004b00000b9b0000c13d0000000301000039000000000101041a0000004001100270000004810000013d000003400040009c000005ba0000613d000003410040009c000005c50000613d000003420040009c00000b9b0000c13d000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000101043b000c00000001001d000003570010009c00000b9b0000213d0cb20c720000040f0000000c0100002900000080011002100000035a011001970000000302000039000000000302041a0000037403300197000000000113019f000000000012041b000000000100001900000cb30001042e000003480040009c000005e10000613d000003490040009c000005fa0000613d0000034a0040009c00000b9b0000c13d000000440030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000201043b00000000010004110000038a0010009c000007620000c13d000c00000002001d000000000020043f000000200000043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a0000038c0010009c0000076a0000813d0000038e00100198000007a40000c13d0000039401000041000000000010043f0000036c0100004100000cb400010430000003390040009c000006030000613d0000033a0040009c000006140000613d0000033b0040009c00000b9b0000c13d000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000101043b000003310010009c00000b9b0000213d00000355020000410000000c0020043f000000000010043f0000000c0100003900000020020000390000060f0000013d0000000002000416000000000002004b00000b9b0000c13d0000012002000039000000400020043f000000000131034f0000008002000039000000001301043c0000000002320436000001200020008c000001680000c13d0000000301000039000000000101041a000000c002100270000000ff0220018f000000800020043f000000c803100270000000ff0330018f000000a00030043f000000d004100270000000ff0440018f000000c00040043f000000d805100270000000ff0550018f000000e00050043f000000e001100270000000ff0110018f000001000010043f000001200020043f000001400030043f000001600040043f000001800050043f000001a00010043f000003ac0100004100000cb30001042e000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000402100370000000000202043b000003570020009c00000b9b0000213d0000002304200039000000000034004b00000b9b0000813d0000000404200039000000000141034f000000000101043b000700000001001d000003570010009c00000b9b0000213d000600240020003d000000070100002900000005011002100000000601100029000000000031004b00000b9b0000213d0000000301000039000000000101041a0000035a00100198000007660000c13d000000070000006b000005b80000613d0000000001000410000503310010019b000900000000001d0000000901000029000000050110021000000006011000290000000001100367000000000101043b000c00000001001d000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000a00000001001d000b00600010027800000000010004110000000b0010006b000002050000613d0000035e01000041000000000101041a000000400400043d000800000004001d00000060024000390000035d03000041000000000032043500000080024000390000000c030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000035f0300004100000000003204350000000a0200002900000378022001970000004c034000390000000000230435000000a0024000390000000000020435000003310110019800000000020000190000036002006041000000000212019f0000001c014000390000032e0010009c0000032e01008041000000400110021000000000030004140000032e0030009c0000032e03008041000000c003300210000000000113019f00000379011001c70cb20cad0000040f000000080900002900000060031002700000032e05300197000000200050008c000000200500803900000020045001900000000003490019000001f20000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000001ee0000c13d0000001f05500190000001ff0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003ad012001670000000002090433000000010020008c000000010110c1bf000000010010019000000b460000c13d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d0000000a020000290000003402200270000003a102200197000000000101043b000800000001001d000000000121004b00000b400000413d000054600010008c00000b4a0000413d0000000c01000029000000000010043f0000000201000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000201041a0000000301000039000000000101041a00000040011002700000035701100197000000000012004b000002c90000813d000300000001001d000400000002001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000501043b0000000306000029000000000065004b0000000404000029000002430000213d000000000054004b000000000605001900000b400000213d0000000a01000029000000ff01100190000002510000613d00000383031000d1000007d0021000c900000000022300d9000003840020009c00000b400000c13d000000000446004900000000023400a900000000033200d9000000000034004b000002520000613d00000b400000013d0000000002000019000000140110003900000000021200d9000003850020009c000002c90000413d0000000c01000029000000000010043f0000000201000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c7000400000002001d0000801002000039000a00000005001d0cb20cad0000040f0000000a030000290000000100200190000000040200002900000b9b0000613d000003850420012a000000000101043b000000000031041b000000400100043d0000004002100039000400000004001d0000000000420435000000200210003900000000003204350000000c0200002900000000002104350000032e0010009c0000032e01008041000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d02000039000000020300003900000386040000410000000b050000290cb20ca80000040f000000010020019000000b9b0000613d000000400300043d000a00000003001d0000002401300039000000040200002900000000002104350000038701000041000000000013043500000004013000390000000b0200002900000000002104350000032e0030009c0000032e010000410000000001034019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000388011001c700000389020000410cb20ca80000040f0000000a0a00002900000060031002700000032e03300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000002a70000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000002a30000c13d0000001f07400190000002b40000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000bf60000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000003570010009c000005db0000213d0000000100200190000005db0000c13d000000400010043f000000200030008c00000b9b0000413d00000000010a0433000000000001004b0000000002000039000000010200c039000000000021004b00000b9b0000c13d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000a00000001001d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b0000000a020000290000037a02200197000000000021041b000000400100043d00000040021000390000000803000029000000000032043500000020021000390000000c0300002900000000003204350000000b0200002900000000002104350000032e0010009c0000032e01008041000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d0200003900000001030000390000037b040000410cb20ca80000040f000000010020019000000b9b0000613d000003650100004100000000001004430000035d01000041000000040010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000366011001c700008002020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b000000000001004b00000b9b0000613d000000400300043d00000044013000390000000c02000029000000000021043500000024013000390000000b020000290000000000210435000003670100004100000000001304350000000401300039000000050200002900000000002104350000032e0030009c000c00000003001d0000032e010000410000000001034019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000368011001c70000035d020000410cb20ca80000040f000000010020019000000b9e0000613d0000000c01000029000003570010009c000005db0000213d000000400010043f00000009020000290000000102200039000900000002001d000000070020006c000001a50000413d000005b80000013d000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000402100370000000000202043b000003570020009c00000b9b0000213d0000002304200039000000000034004b00000b9b0000813d0000000404200039000000000141034f000000000101043b000800000001001d000003570010009c00000b9b0000213d000700240020003d000000080100002900000005011002100000000701100029000000000031004b00000b9b0000213d0000000301000039000000000101041a0000035a00100198000007660000c13d000000080000006b000005b80000613d000c00000000001d0000035c0000013d0000000c020000290000000102200039000c00000002001d000000080020006c000005b80000813d0000000c01000029000000050110021000000007011000290000000001100367000000000101043b000b00000001001d000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000a00000001001d00090060001002780000000001000411000000090010006b000003bc0000613d0000035e01000041000000000101041a000000400400043d000600000004001d00000060024000390000035d03000041000000000032043500000080024000390000000b030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000035f0300004100000000003204350000000a0200002900000378022001970000004c034000390000000000230435000000a0024000390000000000020435000003310110019800000000020000190000036002006041000000000212019f0000001c014000390000032e0010009c0000032e01008041000000400110021000000000030004140000032e0030009c0000032e03008041000000c003300210000000000113019f00000379011001c70cb20cad0000040f000000060900002900000060031002700000032e05300197000000200050008c000000200500803900000020045001900000000003490019000003a90000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000003a50000c13d0000001f05500190000003b60000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003ad012001670000000002090433000000010020008c000000010110c1bf000000010010019000000b460000c13d0000000b01000029000000000010043f0000000201000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000201041a0000000301000039000000000101041a00000040011002700000035701100197000000000012004b000003570000813d000500000001001d000600000002001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000501043b0000000506000029000000000065004b0000000604000029000003e60000213d000000000054004b000000000605001900000b400000213d0000000a01000029000000ff01100190000003f40000613d00000383031000d1000007d0021000c900000000022300d9000003840020009c00000b400000c13d000000000446004900000000023400a900000000033200d9000000000034004b000003f50000613d00000b400000013d0000000002000019000000140110003900000000021200d9000003850020009c000003570000413d0000000b01000029000000000010043f0000000201000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c7000600000002001d0000801002000039000a00000005001d0cb20cad0000040f0000000a030000290000000100200190000000060200002900000b9b0000613d000003850420012a000000000101043b000000000031041b000000400100043d0000004002100039000600000004001d0000000000420435000000200210003900000000003204350000000b0200002900000000002104350000032e0010009c0000032e01008041000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d020000390000000203000039000003860400004100000009050000290cb20ca80000040f000000010020019000000b9b0000613d000000400300043d000b00000003001d000000240130003900000006020000290000000000210435000003870100004100000000001304350000000401300039000000090200002900000000002104350000032e0030009c0000032e010000410000000001034019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000388011001c700000389020000410cb20ca80000040f0000000b0a00002900000060031002700000032e03300197000000200030008c00000020040000390000000004034019000000200640019000000000056a00190000044a0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000004460000c13d0000001f07400190000004570000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000bbe0000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000003570010009c000005db0000213d0000000100200190000005db0000c13d000000400010043f000000200030008c00000b9b0000413d00000000010a0433000000000001004b0000000002000039000000010200c039000000000021004b000003570000613d00000b9b0000013d000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000101043b0cb20c520000040f000000400200043d00000000001204350000032e0020009c0000032e02008041000000400120021000000382011001c700000cb30001042e0000000001000416000000000001004b00000b9b0000c13d0000000301000039000000000101041a0000035701100197000000800010043f000003560100004100000cb30001042e00000355010000410000000c0010043f0000000001000411000000000010043f00000000010004140000032e0010009c0000032e01008041000000c0011002100000036f011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000001041b00000000010004140000032e0010009c0000032e01008041000000c00110021000000333011001c70000800d0200003900000002030000390000039504000041000005b40000013d000000440030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000402100370000000000202043b000c00000002001d000003570020009c00000b9b0000213d0000002401100370000000000101043b000b00000001001d000003570010009c00000b9b0000213d0000033201000041000000000101041a0000000002000411000000000012004b000005f60000c13d0000000301000039000900000001001d000000000201041a00000357032001970000000c0030006c0000081f0000c13d0000000b010000290000035703100197000a00000002001d00000040012002700000035701100197000700000003001d000800000001001d000000000031004b000005b80000613d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d00000000020004150000000e0220008a0000000502200210000000000101043b0000000803000029000000000031004b000004d70000a13d00000000020004150000000d0220008a0000000502200210000000000003004b000008310000c13d00000007030000290000000c0030006c0000000501200270000000000100003f000000010100403f000008310000413d0000000a0100002900000372011001970000000b0200002900000040022002100000037302200197000000000221019f0000000901000029000000000021041b000000000100001900000cb30001042e000000240030008c00000b9b0000413d0000000401100370000000000101043b000c00000001001d000003310010009c00000b9b0000213d0000033201000041000000000101041a0000000002000411000000000012004b000005f60000c13d00000355010000410000000c0010043f0000000c01000029000000000010043f00000000010004140000032e0010009c0000032e01008041000000c0011002100000036f011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000a00000001001d000000000101041a000b00000001001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b0000000b0010006c000008390000a13d0000037001000041000000000010043f0000036e0100004100000cb400010430000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000101043b000c00000001001d000003310010009c00000b9b0000213d0000033201000041000000000101041a0000000002000411000000000012004b000005f60000c13d0000039901000041000000800010043f0000000001000410000000840010043f00000000010004140000032e0010009c0000032e01008041000000c0011002100000039a011001c700000389020000410cb20ca80000040f00000060031002700000032e03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf0000053f0000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b0000053b0000c13d000000000006004b0000054c0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000076e0000613d0000001f01400039000000600110018f00000080021001bf000b00000002001d000000400020043f000000200030008c00000b9b0000413d000000800200043d00000387030000410000000b05000029000000000035043500000084031001bf0000000c040000290000000000430435000000a401100039000000000021043500000000010004140000032e0010009c0000032e01008041000000c0011002100000004002500210000000000121019f00000388011001c700000389020000410cb20ca80000040f00000060031002700000032e03300197000000200030008c000000200a000039000000000a0340190000001f05a0018f0000002006a001900000000b04600029000005760000613d000000000701034f0000000b08000029000000007907043c0000000008980436000000000048004b000005720000c13d000000000005004b000005830000613d000000000661034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f000000000054043500000001002001900000083f0000613d0000000b0100002900000000020a0019000c0000000a001d0cb20c320000040f0000000b010000290000000c021000290cb20c440000040f000000000100001900000cb30001042e00000355010000410000000c0010043f0000000001000411000000000010043f0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b000c00000001001d00000000010004140000032e0010009c0000032e01008041000000c0011002100000036f011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b0000000c02000029000003960220009a000000000021041b00000000010004140000032e0010009c0000032e01008041000000c00110021000000333011001c70000800d020000390000000203000039000003970400004100000000050004110cb20ca80000040f000000010020019000000b9b0000613d000000000100001900000cb30001042e0000000001000416000000000001004b00000b9b0000c13d0000000301000039000000000101041a0000035a001001980000000001000039000000010100c039000000800010043f000003560100004100000cb30001042e000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000402100370000000000202043b000003570020009c00000b9b0000213d0000002304200039000000000034004b00000b9b0000813d0000000404200039000000000441034f000000000504043b000003570050009c000005db0000213d00000005045002100000003f064000390000037506600197000003760060009c0000078c0000a13d0000037701000041000000000010043f0000004101000039000000040010043f0000035c0100004100000cb4000104300000033201000041000000000101041a0000000005000411000000000015004b000005f60000c13d00000000010004140000032e0010009c0000032e01008041000000c00110021000000333011001c70000800d020000390000000303000039000003340400004100000000060000190cb20ca80000040f000000010020019000000b9b0000613d0000033201000041000000000001041b000000000100001900000cb30001042e0000039801000041000000000010043f0000036e0100004100000cb4000104300000000001000416000000000001004b00000b9b0000c13d0000033201000041000000000101041a0000033101100197000000800010043f000003560100004100000cb30001042e000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000401100370000000000101043b000000000010043f0000000101000039000000200010043f000000400200003900000000010000190cb20c930000040f000000000101041a000000800010043f000003560100004100000cb30001042e000000240030008c00000b9b0000413d0000000002000416000000000002004b00000b9b0000c13d0000000402100370000000000202043b000003570020009c00000b9b0000213d0000002304200039000000000034004b00000b9b0000813d0000000404200039000000000141034f000000000101043b000500000001001d000003570010009c00000b9b0000213d000400240020003d000000050100002900000005011002100000000401100029000000000031004b00000b9b0000213d0000000301000039000000000101041a000c00000001001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000201043b0000000c0300002900000040013002700000035701100197000000000012004b000008350000813d0000035701300197000000000012004b000008350000413d000800000002001d0000035a00300198000007660000c13d000000050000006b000005b80000613d000000080100002900030034001002180000000001000410000203310010019b000a00000000001d0000000a01000029000000050110021000000004011000290000000001100367000000000201043b000000400300043d000b00000003001d0000035b0100004100000000001304350000000401300039000c00000002001d00000000002104350000032e0030009c0000032e010000410000000001034019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f0000035c011001c70000035d020000410cb20cad0000040f0000000b0a00002900000060031002700000032e03300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000006740000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000006700000c13d0000001f07400190000006810000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000bca0000613d0000001f01400039000000600110018f0000000004a10019000000000014004b00000000010000390000000101004039000003570040009c000005db0000213d0000000100100190000005db0000c13d000000400040043f000000200030008c00000b9b0000413d00000000010a0433000b00000001001d000003310010009c00000b9b0000213d00000000010004110000000b02000029000000000012004b0009006000200218000006de0000613d0000035e01000041000000000101041a00000060024000390000035d03000041000000000032043500000080024000390000000c030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000035f0300004100000000003204350000004c0240003900000009030000290000000000320435000000a0024000390000000000020435000003310110019800000000020000190000036002006041000000000212019f000003610040009c00000361010000410000000001044019000000400110021000000000030004140000032e0030009c0000032e03008041000000c003300210000000000131019f000003620110009a000700000004001d0cb20cad0000040f000000070900002900000060031002700000032e05300197000000200050008c000000200500803900000020045001900000000003490019000006cb0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000006c70000c13d0000001f05500190000006d80000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003ad012001670000000002090433000000010020008c000000010110c1bf000000010010019000000b460000c13d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000600000001001d0000036401100197000700000001001d000003640010009c00000bd60000613d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d0000000602000029000000ff0220018f000000010020008c000000010200a03900000003022001af00000009022001af00000007022001af000000000101043b000000000021041b0000000c01000029000000000010043f0000000201000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b0000000802000029000000000021041b000003650100004100000000001004430000035d01000041000000040010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000366011001c700008002020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b000000000001004b00000b9b0000613d000000400300043d00000044013000390000000c02000029000000000021043500000024013000390000000202000029000000000021043500000367010000410000000001130436000600000001001d00000004013000390000000b0200002900000000002104350000032e0030009c000900000003001d0000032e010000410000000001034019000700400010021800000000010004140000032e0010009c0000032e01008041000000c00110021000000007011001af00000368011001c70000035d020000410cb20ca80000040f000000010020019000000bda0000613d0000000903000029000003570030009c000005db0000213d000000400030043f0000004001300039000000080200002900000000002104350000000c01000029000000060200002900000000001204350000000b01000029000000000013043500000000010004140000032e0010009c0000032e01008041000000c00110021000000007011001af00000369011001c70000800d0200003900000001030000390000036a040000410cb20ca80000040f000000010020019000000b9b0000613d0000000a020000290000000102200039000a00000002001d000000050020006c0000064d0000413d000005b80000013d0000038b01000041000000000010043f0000036c0100004100000cb400010430000003a901000041000000000010043f0000036c0100004100000cb4000104300000038d01000041000000000010043f0000036c0100004100000cb4000104300000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000007750000c13d000000000005004b000007860000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f000000000014043500000060013002100000032e0020009c0000032e020080410000004002200210000000000112019f00000cb4000104300000008006600039000000400060043f000000800050043f00000024022000390000000004240019000000000034004b00000b9b0000213d000000000005004b0000079c0000613d000000a003000039000000000521034f000000000505043b00000000035304360000002002200039000000000042004b000007960000413d0000000301000039000000000101041a0000035a001001980000084b0000c13d0000037c01000041000000000010043f0000036c0100004100000cb400010430000b00000001001d0000000c01000029000000000010043f000000200000043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000201041a0000038c022001c7000000000021041b0000000b0100002900000008011002700000038f01100197000a00000001001d000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000900000001001d000000400100043d00000020021000390000000c03000029000000000032043500000024030000390000000003300367000000000303043b0000004004100039000000000034043500000040030000390000000000310435000003900010009c000005db0000213d0000006003100039000000400030043f0000032e0020009c0000032e02008041000000400220021000000000010104330000032e0010009c0000032e010080410000006001100210000000000121019f00000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000333011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d0000000b03000029000000360230027000000331052001970000000902000029000000ff0220018f000000000101043b000000ff0330018f000000010030008c00000b4e0000c13d000000400300043d0000000a0400002900000000044304360000000000240435000000020110018f0000000002210019000000450020008c00000045020080390000004001300039000c00000002001d00000000002104350000032e0030009c0000032e03008041000000400130021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d02000039000000020300003900000393040000410cb20ca80000040f000000010020019000000b9b0000613d0000000a01000029000000000010043f0000000101000039000000200010043f0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b000b00000001001d000000000100041400000b8d0000013d000800000003001d000a00000002001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b0000000802000029000000010220008a000000000012004b0000092d0000813d0000037d01000041000000000010043f0000036c0100004100000cb400010430000003a801000041000000000010043f0000036c0100004100000cb4000104300000000a01000029000000000001041b0000000c010000290cb20c7c0000040f000000000100001900000cb30001042e0000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000008460000c13d000007790000013d000000800100043d000800000001001d000000000001004b000005b80000613d0000000001000410000703310010019b000b00000000001d000000800100043d0000000b02000029000000000012004b00000bab0000813d0000000501200210000000a0011000390000000001010433000c00000001001d000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000a00600010027800000000020004110000000a0020006b000008b20000613d0000035e02000041000000000202041a000000400500043d000900000005001d00000060035000390000035d04000041000000000043043500000080035000390000000c040000290000000000430435000000000300041100000060033002100000002c0450003900000000003404350000000c035000390000035f04000041000000000043043500000378011001970000004c035000390000000000130435000000a0015000390000000000010435000003310120019800000000020000190000036002006041000000000212019f0000001c015000390000032e0010009c0000032e01008041000000400110021000000000030004140000032e0030009c0000032e03008041000000c003300210000000000113019f00000379011001c70cb20cad0000040f000000090900002900000060031002700000032e05300197000000200050008c0000002005008039000000200450019000000000034900190000089f0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000089b0000c13d0000001f05500190000008ac0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003ad012001670000000002090433000000010020008c000000010110c1bf000000010010019000000b460000c13d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000900000001001d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b00000009020000290000037a02200197000000000021041b000000400100043d000900000001001d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b00000009030000290000004002300039000000000012043500000020013000390000000c0200002900000000002104350000000a0100002900000000001304350000032e0030009c0000032e03008041000000400130021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d0200003900000001030000390000037b040000410cb20ca80000040f000000010020019000000b9b0000613d000003650100004100000000001004430000035d01000041000000040010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000366011001c700008002020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b000000000001004b00000b9b0000613d000000400300043d00000044013000390000000c02000029000000000021043500000024013000390000000a020000290000000000210435000003670100004100000000001304350000000401300039000000070200002900000000002104350000032e0030009c000c00000003001d0000032e010000410000000001034019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000368011001c70000035d020000410cb20ca80000040f000000010020019000000bb10000613d0000000c01000029000003570010009c0000000b02000029000005db0000213d000000400010043f0000000102200039000b00000002001d000000080020006c000008520000413d000005b80000013d0000000a0100002900000371011001970000000c021001af0000000301000039000000000021041b000004b70000013d000000040000006b000005b80000613d0000000001000410000203310010019b000a00000000001d0000000a01000029000000050110021000000003011000290000000001100367000000000201043b000000400300043d000b00000003001d0000035b0100004100000000001304350000000401300039000c00000002001d00000000002104350000032e0030009c0000032e010000410000000001034019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f0000035c011001c70000035d020000410cb20cad0000040f0000000b0a00002900000060031002700000032e03300197000000200030008c00000020040000390000000004034019000000200640019000000000056a00190000095f0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b0000095b0000c13d0000001f074001900000096c0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000c020000613d0000001f01400039000000600110018f0000000004a10019000000000014004b00000000010000390000000101004039000003570040009c000005db0000213d0000000100100190000005db0000c13d000000400040043f000000200030008c00000b9b0000413d00000000010a0433000b00000001001d000003310010009c00000b9b0000213d00000000010004110000000b0010006b00000a0e0000613d0000035e01000041000000000101041a00000060024000390000035d03000041000000000032043500000080024000390000000c0300002900000000003204350000000c024000390000035f030000410000000000320435000000000200041100000060032002100000002c02400039000600000003001d00000000003204350000000b0200002900000060032002100000004c02400039000800000003001d0000000000320435000000a0024000390000000000020435000003310110019800000000020000190000036002006041000000000212019f000003610040009c00000361010000410000000001044019000000400110021000000000030004140000032e0030009c0000032e03008041000000c003300210000000000131019f000003620110009a000900000004001d0cb20cad0000040f000000090900002900000060031002700000032e05300197000000200050008c000000200500803900000020045001900000000003490019000009b70000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000009b30000c13d0000001f05500190000009c40000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001090433000000010010008c00000000010000390000000101006039000000000112016f000000010010019000000b460000613d0000035e01000041000000000101041a000000400400043d000900000004001d0000006002400039000003890300004100000000003204350000002c02400039000000060300002900000000003204350000000c024000390000039b0300004100000000003204350000004c024000390000000803000029000000000032043500000080024000390000000000020435000003310110019800000000020000190000036002006041000000000212019f0000001c014000390000032e0010009c0000032e01008041000000400110021000000000030004140000032e0030009c0000032e03008041000000c003300210000000000113019f0000039c011001c70cb20cad0000040f000000090900002900000060031002700000032e05300197000000200050008c000000200500803900000020045001900000000003490019000009fa0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000009f60000c13d0000001f0550019000000a070000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001090433000000010010008c00000000010000390000000101006039000000000112016f000000010010019000000b460000613d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000000ff0210019000000c0e0000613d000000450020008c00000c120000613d000600000002001d000900000001001d0000039f0010009c00000c160000813d0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d00000009020000290000000802200270000003a102200197000000000301043b000000000123004b00000b400000413d000500000003001d0000a8c10010008c00000b4a0000413d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000000101041a000000400400043d000800000004001d0000002402400039000000020300002900000000003204350000036702000041000000000024043500000004024000390000000b030000290000000000320435000000ff0110018f000000140210003900000383011000d100000000012100d9000000440240003900000000001204350000032e0040009c0000032e010000410000000001044019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000368011001c700000389020000410cb20ca80000040f000000080a00002900000060031002700000032e03300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000a730000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000a6f0000c13d0000001f0740019000000a800000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000c1a0000613d0000001f01400039000000600110018f0000000004a10019000000000014004b00000000010000390000000101004039000003570040009c000005db0000213d0000000100100190000005db0000c13d000000400040043f000000200030008c00000b9b0000413d00000000010a0433000000000001004b0000000002000039000000010200c039000000000021004b00000b9b0000c13d000000070000006b00000b0f0000613d000003a2010000410000000000140435000000040140003900000000000104350000032e0040009c0000032e010000410000000001044019000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f0000035c011001c70000038a02000041000800000004001d0cb20ca80000040f000000080a00002900000060031002700000032e03300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000ab70000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000ab30000c13d0000001f0740019000000ac40000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000c260000613d0000001f01400039000000600110018f0000000001a10019000003570010009c000005db0000213d000000400010043f000000200030008c00000b9b0000413d0000000301000039000000000101041a000600000001001d00000000010a0433000000000010043f000000200000043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d0000000b0200002900000036022002100000000c040000290000000803400210000000000223019f00000006030000290000001603300210000003a303300197000000000232019f00000001022001af0000038e022001c7000000000101043b000000000021041b000000000040043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d000000000101043b000000090200002900000364022001c7000000000021041b000000400100043d000000070200002900000000002104350000032e0010009c0000032e01008041000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f000003a4011001c70000800d020000390000000303000039000003a5040000410000000b050000290000000c060000290cb20ca80000040f000000010020019000000b3a0000c13d00000b9b0000013d0000000c01000029000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d0000000502000029000000080220021000000006040000290000000103400039000000000232019f000000000101043b000000000021041b000000400100043d00000040021000390000000000320435000000200210003900000000004204350000000c0200002900000000002104350000032e0010009c0000032e01008041000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d020000390000000203000039000003a6040000410000000b050000290cb20ca80000040f000000010020019000000b9b0000613d0000000a020000290000000102200039000a00000002001d000000040020006c000009380000413d000005b80000013d0000037701000041000000000010043f0000001101000039000000040010043f0000035c0100004100000cb400010430000003aa01000041000000000010043f0000036c0100004100000cb400010430000003ab01000041000000000010043f0000036c0100004100000cb400010430000000641010011a0000000b03000029000000d6033002700000039103300197000000000600001900000000070000190000000004070019000000000773022f000000ff0770018f000000ff0040008c000000000700201900000000066700190000000807400039000000000061004b00000b540000813d000000400100043d00000020031000390000000000230435000000030340027000000000023200190000000a030000290000000000310435000000010320008a000000450030008c0000004503008039000000010030008c000000010300a0390000004002100039000c00000003001d00000000003204350000032e0010009c0000032e01008041000000400110021000000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000369011001c70000800d02000039000000020300003900000392040000410cb20ca80000040f000000010020019000000b9b0000613d0000000a01000029000000000010043f0000000101000039000000200010043f0000035801000041000000000010044300000000010004140000032e0010009c0000032e01008041000000c00110021000000359011001c70000800b020000390cb20cad0000040f000000010020019000000b9d0000613d000000000101043b000b00000001001d00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000b9b0000613d0000000b0200002900000008022002100000000c022001af000000000101043b000900000001001d000004e30000013d000000000100001900000cb400010430000000000001042f00000060061002700000001f0460018f0000033005600198000000400200043d000000000352001900000be60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000ba60000c13d00000be60000013d0000037701000041000000000010043f0000003201000039000000040010043f0000035c0100004100000cb40001043000000060061002700000001f0460018f0000033005600198000000400200043d000000000352001900000be60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000bb90000c13d00000be60000013d0000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bc50000c13d000007790000013d0000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bd10000c13d000007790000013d0000036b01000041000000000010043f0000036c0100004100000cb40001043000000060061002700000001f0460018f0000033005600198000000400200043d000000000352001900000be60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000be20000c13d0000032e06600197000000000004004b00000bf40000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000007870000013d0000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000bfd0000c13d000007790000013d0000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000c090000c13d000007790000013d0000039d01000041000000000010043f0000036c0100004100000cb4000104300000039e01000041000000000010043f0000036c0100004100000cb400010430000003a001000041000000000010043f0000036c0100004100000cb4000104300000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000c210000c13d000007790000013d0000001f0530018f0000033006300198000000400200043d0000000004620019000007790000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000c2d0000c13d000007790000013d0000001f02200039000003ae022001970000000001120019000000000021004b00000000020000390000000102004039000003570010009c00000c3e0000213d000000010020019000000c3e0000c13d000000400010043f000000000001042d0000037701000041000000000010043f0000004101000039000000040010043f0000035c0100004100000cb4000104300000000002120049000003af0020009c00000c500000213d0000001f0020008c00000c500000a13d0000000001010433000000000001004b0000000002000039000000010200c039000000000021004b00000c500000c13d000000000001042d000000000100001900000cb400010430000000000010043f0000000101000039000000200010043f00000000010004140000032e0010009c0000032e01008041000000c00110021000000363011001c700008010020000390cb20cad0000040f000000010020019000000c6a0000613d000000000101043b000000000101041a000000ff0110019000000383021000d100000c670000613d000007d0031000c900000000033200d9000003840030009c00000c6c0000c13d000000140110003900000000011200d9000000000001042d000000000100001900000cb4000104300000037701000041000000000010043f0000001101000039000000040010043f0000035c0100004100000cb4000104300000033201000041000000000101041a0000000002000411000000000012004b00000c780000c13d000000000001042d0000039801000041000000000010043f0000036e0100004100000cb40001043000010000000000020000033202000041000000000502041a000000000200041400000331061001970000032e0020009c0000032e02008041000000c00120021000000333011001c70000800d0200003900000003030000390000033404000041000100000006001d0cb20ca80000040f000000010020019000000c900000613d00000332010000410000000102000029000000000021041b000000000001042d000000000100001900000cb400010430000000000001042f0000032e0010009c0000032e0100804100000040011002100000032e0020009c0000032e020080410000006002200210000000000112019f00000000020004140000032e0020009c0000032e02008041000000c002200210000000000112019f00000333011001c700008010020000390cb20cad0000040f000000010020019000000ca60000613d000000000101043b000000000001042d000000000100001900000cb40001043000000cab002104210000000102000039000000000001042d0000000002000019000000000001042d00000cb0002104230000000102000039000000000001042d0000000002000019000000000001042d00000cb20000043200000cb30001042e00000cb40001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392702000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000925489a700000000000000000000000000000000000000000000000000000000e147243900000000000000000000000000000000000000000000000000000000f3388ee200000000000000000000000000000000000000000000000000000000f3388ee300000000000000000000000000000000000000000000000000000000fe939afc00000000000000000000000000000000000000000000000000000000fee81cf400000000000000000000000000000000000000000000000000000000e147243a00000000000000000000000000000000000000000000000000000000f04e283e00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000b187bd2500000000000000000000000000000000000000000000000000000000b187bd2600000000000000000000000000000000000000000000000000000000bf0e5b9500000000000000000000000000000000000000000000000000000000d19e74a700000000000000000000000000000000000000000000000000000000925489a800000000000000000000000000000000000000000000000000000000a49c3f6400000000000000000000000000000000000000000000000000000000a9bda858000000000000000000000000000000000000000000000000000000004ccabce700000000000000000000000000000000000000000000000000000000715018a500000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008f561acc000000000000000000000000000000000000000000000000000000004ccabce80000000000000000000000000000000000000000000000000000000054d1f13d000000000000000000000000000000000000000000000000000000005c1154b0000000000000000000000000000000000000000000000000000000001ac3ddea000000000000000000000000000000000000000000000000000000001ac3ddeb0000000000000000000000000000000000000000000000000000000025692962000000000000000000000000000000000000000000000000000000002ae9b92f0000000000000000000000000000000000000000000000000000000002c2d378000000000000000000000000000000000000000000000000000000000d50c189000000000000000000000000000000000000000000000000000000001228f55500000000000000000000000000000000000000000000000000000000389a75e10000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913202000002000000000000000000000000000000040000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000006352211e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000007c47ea32fd27d1a74fc6e9f31ce8162e6ce070eb04ecb0522ab37ca0b278a89c6884dfdbcde83c177150fc939ab02e069068bdef00000000000000000000000000000000b9f368740000000000000000000000000000000000000000000000000000000059a24eb229eed07ac44229db56c5d79700000000000000000000000000000000000000000000000000000000ffffffe3ffffffffffffffffffffffffffffffffffffff5bffffffe400000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffff001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000002000000000000000000000000000000000000600000000000000000000000001449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90f48bc120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000007448fbae00000000000000000000000000000000000000040000001c000000000000000002000000000000000000000000000000000000200000000c0000000000000000000000000000000000000000000000000000000000000000000000006f5e8818ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff00000000000000000000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff7f4e487b7100000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74ea45f47fd000000000000000000000000000000000000000000000000000000003d693ada00000000000000000000000000000000000000000000000000000000000000ffffffffff000000000000000000000000000000000000000000000000ffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffffff02000000000000000000000000000000000000a0000000800000000000000000180b97b35ce46133f993779fee7f244de0b27896299ea4943f445d4bbd79931e000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000006c6b935b8bbd4000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000151809cdcf2f7714cca3508c7f0110b04a90a80a3a8dd0e35de99689db74d28c5383ea9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000033ee11ce309854a45b65368c078616abcb5c6e3d000000000000000000000000bdc8b6eb1840215a22fc1134046f595b7d42c2de82b429000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004a4117f900000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fffffffffff000000000000000000000000000000000000000000000000ffffffffffffff9f000000000000000000000000000000000000000000000000000000ffffffffffccc6ac05762b455dbab58ae589940712720fd28dbcb6262a741c1681e4d8406a21964768aefca4775352e6b0c5935a1e5d7f0189faf7fc5637a267b3891f62a1f9fbb6c000000000000000000000000000000000000000000000000000000000fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d0000000000000000000000000000000000000000000000000000000082b4290070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000800000000000000000000000000000000000000000000000008988eea90000000000000000000000000000000000000000000000000000000000000084000000000000000000000000f8eb54de00000000000000000000000000000000000000000000000000000000921c7d5f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000ecaa4880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffe3914472000000000000000000000000000000000000000000000000000000003fffffffffc000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000020000000000000000000000000b1e4d0cace0f62ae74ea2fa522dcad1736dba8347c70f0144736275ec6d644609c1ccdc91bf8cfe9ff410fa78f489a2cfd882132809cf9779293003b043a9e302400dba000000000000000000000000000000000000000000000000000000000e0bbc9fb000000000000000000000000000000000000000000000000000000009e87fac800000000000000000000000000000000000000000000000000000000eab52f840000000000000000000000000000000000000000000000000000000033e0294c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000001200000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e6bdba5e07fecfbba88aa700ab18f5c0e5b551cf06c0b26814d46500acc05b3
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef
-----Decoded View---------------
Arg [0] : _owner (address): 0x1B2C84dd7957b1e207Cd7b01Ded77984eC16fDEf
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.