More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 933 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake Many | 3229236 | 1 min ago | IN | 0 ETH | 0.00000533 | ||||
Stake Many | 3229234 | 1 min ago | IN | 0 ETH | 0.00000795 | ||||
Stake Many | 3229221 | 1 min ago | IN | 0 ETH | 0.00000554 | ||||
Stake Many | 3229149 | 3 mins ago | IN | 0 ETH | 0.00001802 | ||||
Stake Many | 3229111 | 3 mins ago | IN | 0 ETH | 0.00000538 | ||||
Stake Many | 3229106 | 3 mins ago | IN | 0 ETH | 0.00000536 | ||||
Stake Many | 3229051 | 4 mins ago | IN | 0 ETH | 0.00000645 | ||||
Stake Many | 3229020 | 5 mins ago | IN | 0 ETH | 0.00000538 | ||||
Stake Many | 3228854 | 8 mins ago | IN | 0 ETH | 0.00000554 | ||||
Stake Many | 3228680 | 10 mins ago | IN | 0 ETH | 0.00000525 | ||||
Stake Many | 3228641 | 11 mins ago | IN | 0 ETH | 0.00000722 | ||||
Stake Many | 3228455 | 14 mins ago | IN | 0 ETH | 0.0000076 | ||||
Stake Many | 3228227 | 18 mins ago | IN | 0 ETH | 0.00000518 | ||||
Stake Many | 3228066 | 21 mins ago | IN | 0 ETH | 0.00000539 | ||||
Stake Many | 3228046 | 21 mins ago | IN | 0 ETH | 0.000008 | ||||
Stake Many | 3227997 | 22 mins ago | IN | 0 ETH | 0.000008 | ||||
Stake Many | 3227922 | 23 mins ago | IN | 0 ETH | 0.00000769 | ||||
Stake Many | 3227891 | 24 mins ago | IN | 0 ETH | 0.00000889 | ||||
Stake Many | 3227888 | 24 mins ago | IN | 0 ETH | 0.00000575 | ||||
Stake Many | 3227694 | 27 mins ago | IN | 0 ETH | 0.00000535 | ||||
Stake Many | 3227526 | 30 mins ago | IN | 0 ETH | 0.00002046 | ||||
Stake Many | 3227489 | 31 mins ago | IN | 0 ETH | 0.00000553 | ||||
Stake Many | 3227424 | 32 mins ago | IN | 0 ETH | 0.00000926 | ||||
Stake Many | 3227358 | 33 mins ago | IN | 0 ETH | 0.00000615 | ||||
Stake Many | 3227192 | 36 mins ago | IN | 0 ETH | 0.00000675 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
3200643 | 8 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:
Endgame
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 {ILevelingGame} from "./interfaces/ILevelingGame.sol"; import {IERC721} from "./interfaces/IERC721.sol"; import {IGachaToken} from "./interfaces/IGachaToken.sol"; import {IVRFSystem} from "./interfaces/IVRFSystem.sol"; import {Ownable} from "solady/auth/Ownable.sol"; import {DelegateCheckerLib} from "solady/utils/ext/zksync/delegatexyz/DelegateCheckerLib.sol"; /// @dev Contract for staking heroes in dungeons with risk/reward mechanics. /// Heroes can be staked in 3 different dungeons with varying rewards and risks. /// Each dungeon has a minimum stake time and entry fee. /// When unstaking, there's a chance to get rewards or lose the hero. /// /// @author Onchain-Heroes (https://www.onchainheroes.xyz/) /// @author atarpara (https://www.github.com/atarpara) contract Endgame is Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Hero level must be at least 10 to stake. error HeroLevelNotMet(); /// @dev Invalid dungeon type selected. error InvalidDungeonType(); /// @dev Action attempted outside active season window. error NotActiveSeason(); /// @dev Caller is not the owner or delegate of the hero. error CallerIsNotOwnerOrDelegateWallet(); /// @dev Contract is paused. error Paused(); /// @dev Given action is not allowed. error NotAllowed(); /// @dev Contract is not paused. error Unpaused(); /// @dev Minimum stake time not met. error CoolDownPeriod(uint256 hero); /// @dev Hero has died and cannot be unstaked until season ends. error HeroDied(); /// @dev The hero has not died yet. error HeroNotDied(); /// @dev The season has not ended yet. error SeasonNotEnded(); /// @dev Entropy request already fulfilled error AlreadyFulfilled(); /// @dev Request is not exist. error RequestNotExist(); /// @dev Sum of rewards is not 100. error SumOfRewardsIsNotHundred(); /// @dev Rewards have not been set for dungeon. error RewardsNotConfigured(); /// @dev Unstake request is already in progress. error RequestIsAlreadyInProgress(uint256 hero); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Emitted when a hero dies in a dungeon. event Death(uint256 id); /// @dev Emitted when `owner` stakes hero `heroId` in `dungeonType` with `entryFee` and `rewardsChance`. event Staked(address indexed owner, uint256 heroId, uint256 entryFee, uint40 rewardsChance, uint8 dungeonType); /// @dev Emitted when a reward is granted after successful unstaking. event Unstaked(uint256 indexed heroId, address indexed owner, uint256 rewardType, uint8 dungeonType); /// @dev Emitted when hero unstake is requested. event UnstakeRequested(address indexed user, uint256 id); /// @dev Emitted when heroes emergency unstaked. event EmergencyUnstaked(uint256[] ids); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Minimum level of hero for dungeon1. uint256 public constant MIN_LEVEL_OF_HERO_D1 = 10; /// @dev Minimum level of hero for dungeon2. uint256 public constant MIN_LEVEL_OF_HERO_D2 = 15; /// @dev Minimum level of hero for dungeon3. uint256 public constant MIN_LEVEL_OF_HERO_D3 = 20; /// @dev Address of LevelingGame contract. ILevelingGame private constant levelingGame = ILevelingGame(0x06D7Ee1D50828Ca96e11890A1601f6fe61F1e584); /// @dev ERC20 token used for $HERO20 IERC20 private constant hero20 = IERC20(0x33EE11cE309854a45B65368C078616ABcb5c6e3d); /// @dev ERC721 token representing heroes. IERC721 private constant hero721 = IERC721(0x7c47ea32FD27d1a74Fc6e9F31Ce8162e6Ce070eB); /// @dev ERC1155 token representing gachatoken. IGachaToken private constant gachaToken = IGachaToken(0xB5EC907d0E80F9A1cA9C1942D69Fb558E01140d4); /// @dev Address of vrf contract of pop network. IVRFSystem private constant vrf = IVRFSystem(0xBDC8B6eb1840215A22fC1134046f595b7D42C2DE); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STRUCTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Stores staking information for each hero. struct StakedHero { address owner; //// @dev Timestamp of stake heroes (Till year 2038) uint32 stakeTime; /// @dev Minimum stake time in hours uint8 minStakeTime; /// @dev Rewards probability bit layout /// [0-7] : Chances of getting Bronze Token /// [8-15] : Chances of getting Silver Token /// [16-23] : Chances of getting Gold Token /// [24-31] : Chances of getting Diamond Token /// [32-39] : Chances of hero dying uint40 rewardsChance; uint8 dungeonType; bool isDead; } /// @dev Stores vrf request data. struct RequestData { address owner; uint48 heroId; /// @dev Rewards probability bit layout /// [0-7] : Chances of getting Bronze Token /// [8-15] : Chances of getting Silver Token /// [16-23] : Chances of getting Gold Token /// [24-31] : Chances of getting Diamond Token /// [32-39] : Chances of hero dying uint40 rewards; bool fulfilled; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Maps hero ID to staking information. mapping(uint256 => StakedHero) public stakingInformation; /// @dev Maps random number `requestId` to request data. mapping(uint256 => RequestData) public request; /// @dev Minimum stake time in hours for dungeon 1. uint8 public MIN_STAKE_TIME_DUNGEON1; /// @dev Minimum stake time in hours for dungeon 2. uint8 public MIN_STAKE_TIME_DUNGEON2; /// @dev Minimum stake time in hours for dungeon 3. uint8 public MIN_STAKE_TIME_DUNGEON3; /// @dev Season start timestamp. uint40 public startSeasonTime; /// @dev Season end timestamp. uint40 public endSeasonTime; /// @dev Reward probabilities for dungeon 1. uint40 dungeon1Rewards; /// @dev Reward probabilities for dungeon 2. uint40 dungeon2Rewards; /// @dev Reward probabilities for dungeon 3. uint40 dungeon3Rewards; /// @dev Pause flag for contract. uint8 pauseFlag; /// @dev Entry fee for dungeon 1. uint256 public dungeon1Fee; /// @dev Entry fee for dungeon 2. uint256 public dungeon2Fee; /// @dev Entry fee for dungeon 3. uint256 public dungeon3Fee; /// @dev Initializes contract with owner. constructor(address _owner) { _initializeOwner(_owner); startSeasonTime = type(uint40).max; endSeasonTime = type(uint40).max; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Modifier for the checking season active. 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 Stakes multiple heroes into a specified dungeon type. /// /// Requirements: /// - The caller must owns the heroes. /// - The hero level must meet the MIN_LEVEL_OF_HERO. function stakeMany(uint256[] calldata ids, uint8 _dungeonsType) external onlyDuringActiveSeason whenNotPaused { // cache ids length uint256 len = ids.length; // get a entryFee and rewards for `_dungeonsType` (uint256 entryFee, uint40 rewards, uint8 minStakeTime, uint256 min_level) = getDungeonsData(_dungeonsType); if (rewards == 0 || minStakeTime == 0) revert RewardsNotConfigured(); for (uint256 i; i < len;) { uint256 id = ids[i]; // Retrieve level from staking contract uint256 level = levelingGame.stakeI(id) & 0xff; // Hero Level at least minimal level for staking dungeon if (level < min_level) revert HeroLevelNotMet(); 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(); } } // Update staking information stakingInformation[id] = StakedHero({ owner: owner, stakeTime: uint32(block.timestamp), minStakeTime: minStakeTime, rewardsChance: rewards, dungeonType: _dungeonsType, isDead: false }); hero721.transferFrom(owner, address(this), id); // Transfer total entry fees for a staking heroes. hero20.transferFrom(owner, address(this), entryFee); // Emit a `Staked`. emit Staked(owner, id, entryFee, rewards, _dungeonsType); ++i; } } /// @dev Initiates unstake request of heroes with vrf for randomized rewards. /// /// Requirement: /// - The caller must owns the heroes. /// - The hero must be passed minimum staking period. function requestUnstakeMany(uint256[] calldata ids) external payable whenNotPaused { // Cache ids length uint256 len = ids.length; // Cache memory for StakedHero StakedHero memory stakeI; address owner; for (uint256 i; i < len;) { uint256 id = ids[i]; // Get staking data stakeI = stakingInformation[id]; owner = stakeI.owner; // 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(); } } // Revert if request is already in progress if (stakeI.stakeTime == 0xffffffff) revert RequestIsAlreadyInProgress(id); // For unstaking, minimum stake time must have passed if (uint256(block.timestamp - stakeI.stakeTime) < uint256(stakeI.minStakeTime) * 3600) { revert CoolDownPeriod(id); } // Cannot unstake dead hero until season ends if (stakeI.isDead) revert HeroDied(); uint256 requestId = vrf.requestRandomNumberWithTraceId(0); // Set stakeTime to max value to indicate request is in progress stakingInformation[id].stakeTime = type(uint32).max; request[requestId] = RequestData({owner: owner, heroId: uint48(id), rewards: stakeI.rewardsChance, fulfilled: false}); emit UnstakeRequested(owner, id); ++i; } } /// @dev Recovery mechanisms for retrieving hero when contract paused. /// Note: This function doesn't give any pending rewards. function emergencyUnstake(uint256[] calldata ids) external whenPaused { uint256 len = ids.length; for (uint256 i = 0; i < len;) { uint256 id = ids[i]; address owner = stakingInformation[id].owner; // 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 staking information delete stakingInformation[id]; // Transfer back to original owner hero721.transferFrom(address(this), owner, id); ++i; } emit EmergencyUnstaked(ids); } /// @dev Unstakes dead heroes after the season has ended. function unstakeDiedHeroes(uint256[] calldata ids) external { // Cannot unstake dead hero until season ends if (block.timestamp < endSeasonTime) revert SeasonNotEnded(); uint256 len = ids.length; StakedHero memory stakeI; for (uint256 i; i < len;) { uint256 id = ids[i]; // Get staking data stakeI = stakingInformation[id]; if (!stakeI.isDead) revert HeroNotDied(); hero721.transferFrom(address(this), stakeI.owner, id); emit Unstaked(id, stakeI.owner, 5, stakeI.dungeonType); ++i; } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Processes random number callback and determines unstaking outcome and mint rewards. function vrfCallback(uint256 requestId, uint256 randomNumber) internal { RequestData memory requestData = request[requestId]; if (requestData.owner == address(0x00)) revert RequestNotExist(); if (requestData.fulfilled) revert AlreadyFulfilled(); request[requestId].fulfilled = true; uint256 chance = uint256(keccak256(abi.encode(requestId, randomNumber))) % 100; uint40 rewards = requestData.rewards; uint256 rewardToken; uint256 probability; for (uint256 i = 0; true;) { uint256 rewardProb = (rewards >> i) & 0xff; probability += rewardProb; if (chance < probability) { rewardToken = (i >> 3) + 1; break; } i += 8; } // If hero dies, set isDead to true // Can't Unstake until season ends if (rewardToken == 5) { // update stake time to zero stakingInformation[requestData.heroId].stakeTime = 0; stakingInformation[requestData.heroId].isDead = true; emit Death(requestData.heroId); return; } emit Unstaked( requestData.heroId, requestData.owner, rewardToken, stakingInformation[requestData.heroId].dungeonType ); // Clear staking information delete stakingInformation[requestData.heroId]; // Transfer hero back to owner hero721.transferFrom(address(this), requestData.owner, requestData.heroId); // Mint reward token gachaToken.mint(requestData.owner, rewardToken, 1); } /// @dev Returns rewards probabilities in array. function _getRewards(uint40 rewards) internal pure returns (uint256[5] memory result) { result[0] = uint256(rewards & 0xff); result[1] = uint256((rewards >> 8) & 0xff); result[2] = uint256((rewards >> 16) & 0xff); result[3] = uint256((rewards >> 24) & 0xff); result[4] = uint256((rewards >> 32) & 0xff); } /// @dev Returns entry fee, rewards, minimum stake time and minimum level for specified dungeon type. function getDungeonsData(uint8 _type) internal view returns (uint256, uint40, uint8, uint256) { if (_type == 0) return (dungeon1Fee, dungeon1Rewards, MIN_STAKE_TIME_DUNGEON1, MIN_LEVEL_OF_HERO_D1); if (_type == 1) return (dungeon2Fee, dungeon2Rewards, MIN_STAKE_TIME_DUNGEON2, MIN_LEVEL_OF_HERO_D2); if (_type == 2) return (dungeon3Fee, dungeon3Rewards, MIN_STAKE_TIME_DUNGEON3, MIN_LEVEL_OF_HERO_D3); revert InvalidDungeonType(); } /// @dev Returns dungeon rewards probabilities. function dungeonRewards(uint8 dungeonType) external view returns (uint256[5] memory) { if (dungeonType == 0) return _getRewards(dungeon1Rewards); if (dungeonType == 1) return _getRewards(dungeon2Rewards); if (dungeonType == 2) return _getRewards(dungeon3Rewards); revert InvalidDungeonType(); } /// @dev Check if contract is paused function isPaused() external view returns (bool) { return pauseFlag != 0; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* OWNER FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Withdraw `HERO20` tokens to `to`. /// Note: Half Tokens must be burn. function withdrawFee(address to) external onlyOwner { uint256 balance = hero20.balanceOf(address(this)); hero20.transfer(to, balance >> 1); hero20.burn(balance - (balance >> 1)); } /// @dev Set season start and end times. function setSeasonTime(uint40 _startTime, uint40 _endTime) external onlyOwner { if (startSeasonTime != _startTime) { // Reverts if season stared. if (block.timestamp >= startSeasonTime) revert NotAllowed(); startSeasonTime = _startTime; } if (endSeasonTime != _endTime) { // Reverts if season ended. if (block.timestamp >= endSeasonTime || _endTime < startSeasonTime) { revert NotAllowed(); } endSeasonTime = _endTime; } } /// @dev Sets the reward probabilities for a specified dungeon type. /// /// Requirements: // - The caller must be the contract owner. // - The sum of the reward probabilities in `_rewards` must equal 100. function setDungeonRewards(uint256[5] memory _rewards, uint8 dungeonType) external onlyOwner { if (dungeonType > 2) revert InvalidDungeonType(); // Check rewards sum equals 100 uint256 sum = _rewards[0] + _rewards[1] + _rewards[2] + _rewards[3] + _rewards[4]; if (sum != 100) revert SumOfRewardsIsNotHundred(); uint40 reward = uint40(_rewards[4] << 32 | _rewards[3] << 24 | _rewards[2] << 16 | _rewards[1] << 8 | _rewards[0]); if (dungeonType == 0) { dungeon1Rewards = reward; } else if (dungeonType == 1) { dungeon2Rewards = reward; } else { dungeon3Rewards = reward; } } /// @dev Set dungeon entry fees for a specified dungeon type. function setDungeonFees(uint256 _dungeon1Fee, uint256 _dungeon2Fee, uint256 _dungeon3Fee) external onlyOwner { if (dungeon1Fee != _dungeon1Fee) { dungeon1Fee = _dungeon1Fee; } if (dungeon2Fee != _dungeon2Fee) { dungeon2Fee = _dungeon2Fee; } if (dungeon3Fee != _dungeon3Fee) { dungeon3Fee = _dungeon3Fee; } } /// @dev Set minimum stake time in hours for a specified dungeon type. function setDungeonStakeTime(uint8 minStakeTime1, uint8 minStakeTime2, uint8 minStakeTime3) external onlyOwner { if (MIN_STAKE_TIME_DUNGEON1 != minStakeTime1) { MIN_STAKE_TIME_DUNGEON1 = minStakeTime1; } if (MIN_STAKE_TIME_DUNGEON2 != minStakeTime2) { MIN_STAKE_TIME_DUNGEON2 = minStakeTime2; } if (MIN_STAKE_TIME_DUNGEON3 != minStakeTime3) { MIN_STAKE_TIME_DUNGEON3 = minStakeTime3; } } /// @dev Toggle pause state. function togglePause() external onlyOwner { pauseFlag = pauseFlag == 0 ? 1 : 0; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* 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 ILevelingGame { function stakeI(uint256 id) external returns (uint256); }
// 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 IGachaToken { function mint(address to, uint256 id, uint256 amount) external; }
// 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
Contract ABI
API[{"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":[{"internalType":"uint256","name":"hero","type":"uint256"}],"name":"CoolDownPeriod","type":"error"},{"inputs":[],"name":"HeroDied","type":"error"},{"inputs":[],"name":"HeroLevelNotMet","type":"error"},{"inputs":[],"name":"HeroNotDied","type":"error"},{"inputs":[],"name":"InvalidDungeonType","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"NotActiveSeason","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[{"internalType":"uint256","name":"hero","type":"uint256"}],"name":"RequestIsAlreadyInProgress","type":"error"},{"inputs":[],"name":"RequestNotExist","type":"error"},{"inputs":[],"name":"RewardsNotConfigured","type":"error"},{"inputs":[],"name":"SeasonNotEnded","type":"error"},{"inputs":[],"name":"SumOfRewardsIsNotHundred","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"Unpaused","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Death","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"EmergencyUnstaked","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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"heroId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"entryFee","type":"uint256"},{"indexed":false,"internalType":"uint40","name":"rewardsChance","type":"uint40"},{"indexed":false,"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UnstakeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"heroId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardType","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"MIN_LEVEL_OF_HERO_D1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LEVEL_OF_HERO_D2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LEVEL_OF_HERO_D3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKE_TIME_DUNGEON1","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKE_TIME_DUNGEON2","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_STAKE_TIME_DUNGEON3","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dungeon1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dungeon2Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dungeon3Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"dungeonRewards","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSeasonTime","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"request","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint48","name":"heroId","type":"uint48"},{"internalType":"uint40","name":"rewards","type":"uint40"},{"internalType":"bool","name":"fulfilled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"requestUnstakeMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dungeon1Fee","type":"uint256"},{"internalType":"uint256","name":"_dungeon2Fee","type":"uint256"},{"internalType":"uint256","name":"_dungeon3Fee","type":"uint256"}],"name":"setDungeonFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[5]","name":"_rewards","type":"uint256[5]"},{"internalType":"uint8","name":"dungeonType","type":"uint8"}],"name":"setDungeonRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"minStakeTime1","type":"uint8"},{"internalType":"uint8","name":"minStakeTime2","type":"uint8"},{"internalType":"uint8","name":"minStakeTime3","type":"uint8"}],"name":"setDungeonStakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint40","name":"_startTime","type":"uint40"},{"internalType":"uint40","name":"_endTime","type":"uint40"}],"name":"setSeasonTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint8","name":"_dungeonsType","type":"uint8"}],"name":"stakeMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingInformation","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"stakeTime","type":"uint32"},{"internalType":"uint8","name":"minStakeTime","type":"uint8"},{"internalType":"uint40","name":"rewardsChance","type":"uint40"},{"internalType":"uint8","name":"dungeonType","type":"uint8"},{"internalType":"bool","name":"isDead","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startSeasonTime","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"unstakeDiedHeroes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010003a76db4fb83d9cc82eeca25b0283f183a62eadb3e82a58ce270a4f21dad000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001b2c84dd7957b1e207cd7b01ded77984ec16fdef
Deployed Bytecode
0x0001000000000002001200000000000200000000000103550000006003100270000003010330019700000001002001900000002b0000c13d0000008006000039000000400060043f000000040030008c000005810000413d000000000201043b000000e0022002700000030a0020009c000000650000a13d0000030b0020009c0000011a0000a13d0000030c0020009c000001540000a13d0000030d0020009c0000018d0000a13d0000030e0020009c0000057b0000613d0000030f0020009c000002ab0000613d000003100020009c000005810000c13d000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b000003040010009c000005810000213d0000033a020000410000000c0020043f000000000010043f0000000c0100003900000020020000390bfe0bdf0000040f000002c60000013d0000000002000416000000000002004b000005810000c13d0000001f0230003900000302022001970000008002200039000000400020043f0000001f0430018f000003030530019800000080025000390000003c0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000380000c13d000000000004004b000000490000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000200030008c000005810000413d000000800600043d000003040060009c000005810000213d0000030501000041000000000061041b0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d020000390000000303000039000003070400004100000000050000190bfe0bf40000040f0000000100200190000005810000613d0000000201000039000000000201041a00000308022001c7000000000021041b000000200100003900000100001004430000012000000443000003090100004100000bff0001042e000003230020009c000001450000213d0000032f0020009c000001610000213d000003350020009c000001c00000213d000003380020009c000002b40000613d000003390020009c000005810000c13d000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b001200000001001d000003040010009c000005810000213d0000030501000041000000000101041a0000000002000411000000000012004b000005920000c13d0000039c01000041000000800010043f0000000001000410000000840010043f0000000001000414000003010010009c0000030101008041000000c0011002100000039d011001c70000038d020000410bfe0bf40000040f00000060031002700000030103300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000000980000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000000940000c13d000000000006004b000000a50000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000059c0000613d0000001f01400039000000600110018f00000080021001bf001100000002001d000000400020043f000000200030008c000005810000413d00000012020000290000030402200197000000800400043d0000039e030000410000001105000029000000000035043500000084031001bf0000000000230435000000a401100039001200000004001d0000000102400270001000000002001d00000000002104350000000001000414000003010010009c0000030101008041000000c0011002100000004002500210000000000121019f0000039f011001c70000038d020000410bfe0bf40000040f00000060031002700000030103300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000001105700029000000d30000613d000000000801034f0000001109000029000000008a08043c0000000009a90436000000000059004b000000cf0000c13d000000000006004b000000e00000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000065f0000613d0000001f01400039000000600110018f0000001101100029000000400010043f000000200030008c000005810000413d00000011010000290000000001010433000000000001004b0000000002000039000000010200c039000000000021004b000005810000c13d0000035f0100004100000000001004430000038d0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d00000010020000290000001201200069000000400300043d000003a002000041000000000023043500000004023000390000000000120435000003010030009c001200000003001d0000030101000041000000000103401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c70000038d020000410bfe0bf40000040f00000001002001900000088e0000613d000000120100002900000000020000190bfe0bac0000040f000000000100001900000bff0001042e000003180020009c000001710000213d0000031e0020009c000001fd0000213d000003210020009c000002b90000613d000003220020009c000005810000c13d000000440030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000002000411000003530020009c000005830000c13d0000002402100370000000000202043b001100000002001d0000000401100370000000000101043b001200000001001d000000000010043f0000000101000039000000200010043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000400400043d000003550040009c000005ba0000a13d0000037301000041000000000010043f0000004101000039000000040010043f000003520100004100000c0000010430000003240020009c000001820000213d0000032a0020009c000002080000213d0000032d0020009c000002c20000613d0000032e0020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a00000018011002700000016d0000013d000003130020009c0000024d0000213d000003160020009c000002ca0000613d000003170020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000f01000039000000800010043f0000033b0100004100000bff0001042e000003300020009c000002580000213d000003330020009c000004290000613d000003340020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a00000040011002700000034301100197000000800010043f0000033b0100004100000bff0001042e000003190020009c0000028e0000213d0000031c0020009c000004500000613d0000031d0020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a00000347001001980000000001000039000000010100c039000000800010043f0000033b0100004100000bff0001042e000003250020009c000002a00000213d000003280020009c0000046e0000613d000003290020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000401000039000002c60000013d000003110020009c0000048d0000613d000003120020009c000005810000c13d000000240030008c000005810000413d0000000401100370000000000101043b001200000001001d000003040010009c000005810000213d0000030501000041000000000101041a0000000002000411000000000012004b000005920000c13d0000033a010000410000000c0010043f0000001201000029000000000010043f0000000001000414000003010010009c0000030101008041000000c0011002100000033e011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b001000000001001d000000000101041a001100000001001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000110010006c0000066b0000a13d0000034101000041000000000010043f0000033d0100004100000c0000010430000003360020009c000004940000613d000003370020009c000005810000c13d000000440030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d0000000404200039000000000441034f000000000404043b000500000004001d000003460040009c000005810000213d000400240020003d000000050200002900000005022002100000000402200029000000000032004b000005810000213d0000002401100370000000000101043b000e00000001001d000000ff0010008c000005810000213d0000000201000039000000000101041a001200000001001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000120300002900000040023002700000034302200197000000000021004b000001f90000813d00000018023002700000034302200197000000000021004b000008090000813d0000039901000041000000000010043f000003500100004100000c00000104300000031f0020009c000004b50000613d000003200020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a0000001001100270000002b00000013d0000032b0020009c000004db0000613d0000032c0020009c000005810000c13d000000440030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b001200000002001d000003430020009c000005810000213d0000002401100370000000000101043b001100000001001d000003430010009c000005810000213d0000030501000041000000000101041a0000000002000411000000000012004b000005920000c13d000000120100002900000343011001970000000202000039000000000302041a00000018023002700000034302200197000000000012004b000006140000c13d00000011010000290000034302100197001000000003001d00000040013002700000034301100197000f00000002001d001200000001001d000000000021004b000004f60000613d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000120010006c0000001002000029000007fa0000813d000000180120027000000343011001970000000f0010006b000007fa0000413d0000037d01200197000000110200002900000040022002100000037e02200197000000000121019f0000000202000039000000000012041b000000000100001900000bff0001042e000003140020009c000004f80000613d000003150020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a0000000801100270000002b00000013d000003310020009c000005140000613d000003320020009c000005810000c13d000000640030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000502043b000000ff0050008c000005810000213d0000002402100370000000000302043b000000ff0030008c000005810000213d0000004401100370000000000101043b000000ff0010008c000005810000213d0000030502000041000000000202041a0000000004000411000000000024004b000005920000c13d0000000202000039000000000402041a000000ff0640018f000000000056004b0000027a0000613d000003a104400197000000000454019f000000000042041b0000000805400270000000000535013f000000ff00500190000002830000613d000003a20440019700000008033002100000ff000330018f000000000434019f000000000042041b0000001003400270000000000313013f000000ff00300190000004f60000613d000003810340019700000010011002100000038201100197000000000113019f000000000012041b000000000100001900000bff0001042e0000031a0020009c000005440000613d0000031b0020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0bfe0bbe0000040f0000000201000039000000000201041a0000035d03200197000003470020019800000000020000190000035e02006041000000000232019f000000000021041b000000000100001900000bff0001042e000003260020009c000005660000613d000003270020009c000005810000c13d0000000001000416000000000001004b000005810000c13d0000000a01000039000000800010043f0000033b0100004100000bff0001042e0000000001000416000000000001004b000005810000c13d0000000201000039000000000101041a000000ff0110018f000000800010043f0000033b0100004100000bff0001042e0000000001000416000000000001004b000005810000c13d0000000501000039000002c60000013d0000000001000416000000000001004b000005810000c13d0000030501000041000000000101041a0000030401100197000000800010043f0000033b0100004100000bff0001042e0000000001000416000000000001004b000005810000c13d0000000301000039000000000101041a000000800010043f0000033b0100004100000bff0001042e000000240030008c000005810000413d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d0000000404200039000000000141034f000000000101043b000a00000001001d000003460010009c000005810000213d000900240020003d0000000a0100002900000005011002100000000901100029000000000031004b000005810000213d0000000201000039000000000101041a0000034700100198000008190000c13d0000014001000039000000400010043f000000800000043f000000a00000043f000000c00000043f000000e00000043f000001000000043f000001200000043f0000000a0000006b000004f60000613d001000000000001d0000001001000029000000050110021000000009011000290000000001100367000000000101043b001200000001001d000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000400200043d000003490020009c0000013f0000213d000000000101043b000000c003200039000000400030043f000000000101041a000000f003100270000000ff0330018f00000080042000390000000000340435000000a004200039000003440010009c00000000030000390000000103002039000d00000004001d0000000000340435000000c80310027000000343033001970000006004200039000c00000004001d0000000000340435000000c003100270000000ff0330018f0000004004200039000e00000004001d000000000034043500000304031001970000000004320436000000a001100270000003010110019700000000001404350000000002000411001100000003001d000000000023004b0000036d0000613d000b00000004001d0000034a01000041000000000101041a000000400400043d000f00000004001d00000060024000390000034b030000410000000000320435000000800240003900000012030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000034c030000410000000000320435000000110200002900000060022002100000004c034000390000000000230435000000a0024000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000001c01400039000003010010009c000003010100804100000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000113019f0000034e011001c70bfe0bf90000040f0000000f0900002900000060031002700000030105300197000000200050008c000000200500803900000020045001900000000003490019000003580000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000003540000c13d0000001f05500190000003650000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003a3012001670000000002090433000000010020008c000000010110c1bf000000010010019000000a9b0000c13d0000000b0100002900000000010104330000030101100197000f00000001001d000003010010009c000008390000613d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b0000000f0110006c000007f40000413d0000000e020000290000000002020433000000ff0220018f00000e10022000c9000000000021004b0000083b0000413d0000000d010000290000000001010433000000000001004b000008410000c13d000000400200043d000f00000002001d0000035101000041000000000012043500000004012000390000000000010435000003010020009c0000030101000041000000000102401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c700000353020000410bfe0bf40000040f0000000f0a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000003aa0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000003a60000c13d0000001f07400190000003b70000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f00000000006504350000000100200190000008450000613d0000001f01400039000000600210018f0000000001a20019000000000021004b00000000020000390000000102004039000003460010009c0000013f0000213d00000001002001900000013f0000c13d000000400010043f000000200030008c000005810000413d00000000010a0433000f00000001001d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a00000354022001c7000000000021041b000000400300043d000003550030009c0000013f0000213d0000000c0100002900000000010104330000008002300039000000400020043f00000343011001970000004002300039000d00000002001d0000000000120435000000120100002900000342011001970000002002300039000b00000002001d000000000012043500000011010000290000000000130435000e00000003001d0000006001300039000c00000001001d00000000000104350000000f01000029000000000010043f0000000101000039000000200010043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d0000000e02000029000000000202043300000304022001970000000b030000290000000003030433000000a0033002100000035603300197000000000223019f0000000d030000290000000003030433000000d0033002100000035703300197000000000232019f0000000c030000290000000003030433000000000003004b00000358030000410000000003006019000000000232019f000000000101043b000000000021041b000000400100043d00000012020000290000000000210435000003010010009c000003010100804100000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000359011001c70000800d0200003900000002030000390000035a0400004100000011050000290bfe0bf40000040f0000000100200190000005810000613d00000010020000290000000102200039001000000002001d0000000a0020006c000002ee0000413d000004f60000013d0000033a010000410000000c0010043f0000000001000411000000000010043f0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b001200000001001d0000000001000414000003010010009c0000030101008041000000c0011002100000033e011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b0000001202000029000003850220009a000000000021041b0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d0200003900000002030000390000038604000041000004f20000013d000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000402043b000000ff0040008c000005810000213d000000000131034f0000012002000039000000400020043f0000008003000039000000000501034f000000005605043c0000000003630436000001200030008c0000045e0000c13d000000ff03400190000005d10000613d000000020030008c000005960000613d000000010030008c000004d70000c13d000000b003000039000000a804000039000000a00500003900000098060000390000009007000039000005d60000013d000000640030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000004402100370000000000202043b0000002403100370000000000303043b0000000401100370000000000101043b0000030504000041000000000404041a0000000005000411000000000045004b000005920000c13d0000000304000039000000000504041a000000000015004b000004830000613d000000000014041b0000000401000039000000000401041a000000000034004b000004880000613d000000000031041b0000000501000039000000000301041a000000000023004b0000029d0000c13d000004f60000013d0000000001000416000000000001004b000005810000c13d0000001401000039000000800010043f0000033b0100004100000bff0001042e000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b000000000010043f000000200000043f000000400200003900000000010000190bfe0bdf0000040f000000000101041a0000030402100197000000800020043f000000a0021002700000030102200197000000a00020043f000000c002100270000000ff0220018f000000c00020043f000000c8021002700000034302200197000000e00020043f000000f002100270000000ff0220018f000001000020043f000003440010009c00000000010000390000000101002039000001200010043f0000039a0100004100000bff0001042e000000c40030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000012002000039000000400020043f0000000402100370000000000202043b000000800020043f0000002403100370000000000303043b000000a00030043f0000004404100370000000000404043b000000c00040043f0000006405100370000000000505043b000000e00050043f0000008406100370000000000606043b000001000060043f000000a401100370000000000101043b000000ff0010008c000005810000213d0000030507000041000000000707041a0000000008000411000000000078004b000005920000c13d000000ff0110018f000000020010008c000005f40000a13d0000039801000041000000000010043f000003500100004100000c00000104300000033a010000410000000c0010043f0000000001000411000000000010043f0000000001000414000003010010009c0000030101008041000000c0011002100000033e011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000001041b0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d020000390000000203000039000003800400004100000000050004110bfe0bf40000040f0000000100200190000005810000613d000000000100001900000bff0001042e000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000401100370000000000101043b000000000010043f0000000101000039000000200010043f000000400200003900000000010000190bfe0bdf0000040f000000000101041a0000030402100197000000800020043f000000a0021002700000034202200197000000a00020043f000000d0021002700000034302200197000000c00020043f000003440010009c00000000010000390000000101002039000000e00010043f000003450100004100000bff0001042e000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d0000000404200039000000000141034f000000000101043b000b00000001001d000003460010009c000005810000213d000a00240020003d0000000b0100002900000005011002100000000a01100029000000000031004b000005810000213d0000000201000039000000000101041a001200000001001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000120200002900000040022002700000034302200197000000000021004b000006710000813d0000038401000041000000000010043f000003500100004100000c0000010430000000240030008c000005810000413d0000000002000416000000000002004b000005810000c13d0000000402100370000000000202043b000003460020009c000005810000213d0000002304200039000000000034004b000005810000813d000b00040020003d0000000b04100360000000000404043b000f00000004001d000003460040009c000005810000213d00000024042000390000000f020000290000000502200210000a00000002001d000e00000004001d0000000002420019000000000032004b000005810000213d0000000202000039000000000202041a00000347002001980000062d0000c13d0000036801000041000000000010043f000003500100004100000c00000104300000030501000041000000000501041a0000000001000411000000000051004b000005920000c13d0000000001000414000003010010009c0000030101008041000000c00110021000000306011001c70000800d020000390000000303000039000003070400004100000000060000190bfe0bf40000040f0000000100200190000005810000613d0000030501000041000000000001041b000000000100001900000bff0001042e000000240030008c000005810000413d0000000401100370000000000101043b000003040010009c000005870000a13d000000000100001900000c00000104300000037101000041000000000010043f000003500100004100000c00000104300000030502000041000000000202041a0000000003000411000000000023004b000005920000c13d000000000001004b0000066e0000c13d0000033c01000041000000000010043f0000033d0100004100000c00000104300000039b01000041000000000010043f0000033d0100004100000c0000010430000000d803000039000000d004000039000000c805000039000000c006000039000000b807000039000005d60000013d0000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000005a30000c13d000000000005004b000005b40000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000003010020009c00000301020080410000004002200210000000000112019f00000c0000010430000000000101043b0000008002400039000000400020043f000000000101041a0000006002400039000003440010009c000000000300003900000001030020390000000000320435000000d00210027000000343022001970000004005400039000000000025043500000304021001980000000003240436000000a00210027000000342022001970000000000230435000006520000c13d0000037a01000041000000000010043f000003500100004100000c0000010430000000880300003900000080040000390000007805000039000000700600003900000068070000390000000208000039000000000808041a000001c009000039000000400090043f000000000778022f000000001901043c0000000002920436000001c00020008c000005db0000c13d000000000138022f000000000248022f000000000358022f000000000468022f000000ff0570018f000001200050043f000000ff0440018f000001400040043f000000ff0330018f000001600030043f000000ff0220018f000001800020043f000000ff0110018f000001a00010043f000001c00050043f000001e00040043f000002000030043f000002200020043f000002400010043f000003690100004100000bff0001042e000000000023001a000007f40000413d0000000007230019000000000074001a000007f40000413d0000000007740019000000000075001a000007f40000413d0000000007750019000000000076001a000007f40000413d0000000007760019000000640070008c0000065b0000c13d00000010044002100000000803300210000000000343019f0000001804500210000000000343019f0000002004600210000000000343019f000000000323019f0000000202000039000000000402041a000000000001004b000007fe0000613d000000010010008c000008020000c13d0000036b0140019700000090033002100000036c03300197000008050000013d000f00000002001d001000000003001d0000033f0100004100000000001004430000000001000414000003010010009c0000030101008041000000c00110021000000340011001c70000800b020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b0000000f0010006c0000001001000029000007fa0000813d0000037b01100197000000120200002900000018022002100000037c02200197000000000321019f0000000201000039000000000031041b000002280000013d0000000f0000006b000007060000c13d0000002002000039000000800020043f000000a00000043f0000000a040000290000001f0240018f000000000004004b0000063f0000613d0000000b030000290000002003300039000000000131034f00000040036000390000000004430019000000001501043c0000000003530436000000000043004b0000063b0000c13d000000000002004b0000000f020000290000006501200210000003640110009a000003650020009c0000036601008041000003010060009c00000301060080410000004002600210000000000112019f0000000002000414000003010020009c0000030102008041000000c00220021000000000012100190000800d0200003900000001030000390000036704000041000004f30000013d001000000005001d000f00000003001d000e00000004001d000003580010009c000007b00000413d0000037901000041000000000010043f000003500100004100000c00000104300000036a01000041000000000010043f000003500100004100000c00000104300000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006660000c13d000005a70000013d0000001001000029000000000001041b00000012010000290bfe0bc80000040f000000000100001900000bff0001042e000000400100043d000003490010009c0000013f0000213d000000c002100039000000400020043f000000a00210003900000000000204350000008002100039000000000002043500000060021000390000000000020435000000400210003900000000000204350000002002100039000000000002043500000000000104350000000b0000006b000004f60000613d0000000001000410000903040010019b001200000000001d000000120100002900000005011002100000000a011000290000000001100367000000000101043b001100000001001d000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000400400043d000003490040009c0000013f0000213d000000000101043b000000c002400039000000400020043f000000000101041a000000a002400039000003440010009c000000000300003900000001030020390000000000320435000000c802100270000003430220019700000060034000390000000000230435000000c002100270000000ff0220018f00000040034000390000000000230435000000a0021002700000030102200197000000200340003900000000002304350000030402100197001000000002001d0000000000240435000f00000004001d0000008002400039000000f001100270000000ff0110018f000e00000002001d000000000012043500000b4c0000a13d0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d000000400300043d00000044013000390000001102000029000000000021043500000024013000390000001002000029000000000021043500000361010000410000000001130436000c00000001001d000000040130003900000009020000290000000000210435000003010030009c001000000003001d00000301010000410000000001034019000d0040001002180000000001000414000003010010009c0000030101008041000000c0011002100000000d011001af00000362011001c70000034b020000410bfe0bf40000040f000000010020019000000b500000613d0000001004000029000003460040009c0000000f010000290000013f0000213d000000400040043f00000000020104330000000e01000029000000000101043300000005030000390000000000340435000000ff0110018f0000000c0300002900000000001304350000000001000414000003010010009c0000030101008041000000c0011002100000000d011001af00000348011001c700000304062001970000800d020000390000000303000039000003740400004100000011050000290bfe0bf40000040f0000000100200190000005810000613d00000012020000290000000102200039001200000002001d0000000b0020006c000006860000413d000004f60000013d0000000001000410000d03040010019b0000000002000019001000000002001d00000005012002100000000e011000290000000001100367000000000101043b001200000001001d000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000101041a001103040010019b0000000001000411000000110010006b000007670000613d0000034a01000041000000000101041a000000400400043d000c00000004001d00000060024000390000034b030000410000000000320435000000800240003900000012030000290000000000320435000000000200041100000060022002100000002c0340003900000000002304350000000c024000390000034c030000410000000000320435000000110200002900000060022002100000004c034000390000000000230435000000a0024000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000001c01400039000003010010009c000003010100804100000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000113019f0000034e011001c70bfe0bf90000040f0000000c0900002900000060031002700000030105300197000000200050008c000000200500803900000020045001900000000003490019000007540000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000007500000c13d0000001f05500190000007610000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003a3012001670000000002090433000000010020008c000000010110c1bf000000010010019000000a9b0000c13d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000001041b0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d000000400300043d0000004401300039000000120200002900000000002104350000002401300039000000110200002900000000002104350000036101000041000000000013043500000004013000390000000d020000290000000000210435000003010030009c001200000003001d0000030101000041000000000103401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000362011001c70000034b020000410bfe0bf40000040f00000001002001900000081d0000613d0000001206000029000003460060009c00000010020000290000013f0000213d000000400060043f00000001022000390000000f0020006c000007090000413d000000200100003900000000011604360000000f020000290000000000210435000003630020009c000005810000213d0000000001000367000006320000013d0000001201000029000000000010043f0000000101000039000000200010043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a000003440220019700000358022001c7000000000021041b000000400100043d0000004002100039000000110300002900000000003204350000004002000039000000000221043600000012030000290000000000320435000003720010009c0000013f0000213d0000006003100039000000400030043f000003010020009c000003010200804100000040022002100000000001010433000003010010009c00000301010080410000006001100210000000000121019f0000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000306011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d00000010020000290000000003020433000000ff0230018f0000034303300197000000000101043b000000641010011a0000000004000019000000000021004b000008510000413d000000080540003a000007f40000613d000000000653022f000000ff0660018f000000f70040008c0000000006002019000000000026001a00000000022600190000000004050019000007f40000413d000007e70000013d0000037301000041000000000010043f0000001101000039000000040010043f000003520100004100000c00000104300000037f01000041000000000010043f000003500100004100000c00000104300000036d0140019700000068033002100000036e03300197000008050000013d0000036f01400197000000b8033002100000037003300197000000000131019f000000000012041b000000000100001900000bff0001042e0000034700300198000008190000c13d0000000e02000029000000ff0220018f000000020020008c0000089b0000613d000000010020008c000008a20000613d000000000002004b000004d70000c13d0003000a0000003d00000003020000390000000203000039000000000303041a0000006804300270000008a80000013d0000038701000041000000000010043f000003500100004100000c000001043000000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000008250000c13d0000030106600197000000000004004b000008370000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000005b50000013d0000035c010000410000083c0000013d0000035b01000041000000000010043f0000001201000029000000040010043f000003520100004100000c00000104300000034f01000041000000000010043f000003500100004100000c00000104300000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000084c0000c13d000005a70000013d0000000f010000290000000001010433001203420010019b00000003014002700000000101100039001100000001001d000000050010008c00000aa30000c13d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a0000037702200197000000000021041b0000000f0100002900000000010104330000034201100197000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000201041a000003440220019700000358022001c7000000000021041b0000000f0100002900000000010104330000034201100197000000400200043d0000000000120435000003010020009c000003010200804100000040012002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000359011001c70000800d0200003900000001030000390000037804000041000004f30000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000008960000c13d000008290000013d000300140000003d00000005020000390000000203000039000000000403041a0000001003400270000000b804400270000008a80000013d0003000f0000003d00000004020000390000000203000039000000000403041a00000008034002700000009004400270000d03430040019c00000a9f0000613d000200ff0030019400000a9f0000613d000000050000006b000004f60000613d000000000202041a000b00000002001d000103010010019b0000000001000410000c03040010019b001000000000001d0000001001000029000000050110021000000004011000290000000001100367000000000201043b000000400300043d001100000003001d000003880100004100000000001304350000000401300039001200000002001d0000000000210435000003010030009c0000030101000041000000000103401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c700000389020000410bfe0bf40000040f000000110a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a0019000008db0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000008d70000c13d0000001f07400190000008e80000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000b5d0000613d0000001f01400039000000600110018f0000000004a10019000000000014004b00000000010000390000000101004039000003460040009c0000013f0000213d00000001001001900000013f0000c13d000000400040043f000000200030008c000005810000413d00000000010a0433000000ff0110018f000000030010006c00000b690000413d0000038a010000410000000000140435000000040140003900000012020000290000000000210435000003010040009c0000030101000041000000000104401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000352011001c70000034b02000041001100000004001d0bfe0bf90000040f000000110a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a00190000091c0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b000009180000c13d0000001f07400190000009290000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000b6d0000613d0000001f01400039000000600110018f0000000006a10019000003460060009c0000013f0000213d000000400060043f000000200030008c000005810000413d00000000050a0433000003040050009c001100000005001d000005810000213d0000000004000411000000000045004b000009c50000613d0000034a01000041000000000101041a00000060026000390000034b0300004100000000003204350000008002600039000000120300002900000000003204350000000c026000390000034c03000041000000000032043500000060034002100000002c02600039000900000003001d000000000032043500000060035002100000004c02600039000a00000003001d0000000000320435000000a0026000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000038b0060009c0000038b01000041000000000106401900000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000131019f0000038c0110009a000f00000006001d0bfe0bf90000040f0000000f0900002900000060031002700000030105300197000000200050008c0000002005008039000000200450019000000000034900190000096d0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000009690000c13d0000001f055001900000097a0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001090433000000010010008c00000000010000390000000101006039000000000112016f000000010010019000000a9b0000613d0000034a01000041000000000101041a000000400400043d000f00000004001d00000060024000390000038d0300004100000000003204350000002c02400039000000090300002900000000003204350000000c024000390000038e0300004100000000003204350000004c024000390000000a03000029000000000032043500000080024000390000000000020435000003040110019800000000020000190000034d02006041000000000212019f0000001c01400039000003010010009c000003010100804100000040011002100000000003000414000003010030009c0000030103008041000000c003300210000000000113019f0000038f011001c70bfe0bf90000040f0000000f0900002900000060031002700000030105300197000000200050008c000000200500803900000020045001900000000003490019000009b00000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b000009ac0000c13d0000001f05500190000009bd0000613d000000000141034f0000000304500210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000003a3012001670000000002090433000000010020008c000000010110c1bf000000010010019000000a9b0000c13d000000400600043d0000001105000029000003490060009c0000013f0000213d000000c001600039000000400010043f00000080026000390000000e01000029000a00000002001d000000000012043500000060026000390000000d01000029000800000002001d000000000012043500000040026000390000000201000029000700000002001d000000000012043500000020026000390000000101000029000600000002001d00000000001204350000000000560435000000a001600039000900000001001d00000000000104350000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c70000801002000039000f00000006001d0bfe0bf90000040f0000000f030000290000000100200190000005810000613d0000000002030433000003040220019700000006030000290000000003030433000000a0033002100000035403300197000000000232019f00000007030000290000000003030433000000c0033002100000039103300197000000000232019f00000008030000290000000003030433000000c8033002100000039203300197000000000232019f0000000a030000290000000003030433000000f0033002100000039303300197000000000232019f00000009030000290000000003030433000000000003004b00000358030000410000000003006019000000000232019f000000000101043b000000000021041b0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b0000001102000029000005810000613d000000400400043d0000036101000041000000000014043500000044034000390000001201000029000a00000003001d00000000001304350000000401400039000800000001001d000000000021043500000024024000390000000c01000029000700000002001d0000000000120435000003010040009c000f00000004001d0000030101000041000000000104401900090040001002180000000001000414000003010010009c0000030101008041000000c00110021000000009011001af00000362011001c70000034b020000410bfe0bf40000040f000000010020019000000b790000613d0000000f03000029000003460030009c00000011020000290000013f0000213d000000400030043f00000361010000410000000000130435000000080100002900000000002104350000000c01000029000000070200002900000000001204350000000b010000290000000a0200002900000000001204350000000001000414000003010010009c0000030101008041000000c00110021000000009011001af00000362011001c70000038d020000410bfe0bf40000040f0000000f0a00002900000060031002700000030103300197000000200030008c00000020040000390000000004034019000000200640019000000000056a001900000a5d0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000058004b00000a590000c13d0000001f0740019000000a6a0000613d000000000661034f0000000307700210000000000805043300000000087801cf000000000878022f000000000606043b0000010007700089000000000676022f00000000067601cf000000000686019f0000000000650435000000010020019000000b860000613d0000001f01400039000000600110018f0000000001a10019000003460010009c00000011050000290000013f0000213d000000400010043f000000200030008c000005810000413d00000000020a0433000000000002004b0000000003000039000000010300c039000000000032004b000005810000c13d00000060021000390000000e03000029000000000032043500000040021000390000000d03000029000000000032043500000020021000390000000b03000029000000000032043500000012020000290000000000210435000003010010009c000003010100804100000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000394011001c70000800d02000039000000020300003900000395040000410bfe0bf40000040f0000000100200190000005810000613d00000010020000290000000102200039001000000002001d000000050020006c000008b40000413d000004f60000013d0000039001000041000000000010043f000003500100004100000c00000104300000039701000041000000000010043f000003500100004100000c00000104300000000e010000290000000001010433001000000001001d0000001201000029000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000101041a000000f001100270000000ff0110018f000000400200043d0000002003200039000000000013043500000011010000290000000000120435000003010020009c000003010200804100000040012002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f0000001002000029000003040620019700000348011001c70000800d020000390000000303000039000003740400004100000012050000290bfe0bf40000040f0000000100200190000005810000613d0000000f0100002900000000010104330000034201100197000000000010043f000000200000043f0000000001000414000003010010009c0000030101008041000000c00110021000000348011001c700008010020000390bfe0bf90000040f0000000100200190000005810000613d000000000101043b000000000001041b0000000e010000290000000001010433001200000001001d0000000f010000290000000001010433001000000001001d0000035f0100004100000000001004430000034b0100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d0000001001000029000003420110019700000012020000290000030402200197000000400400043d000000440340003900000000001304350000002401400039000000000021043500000361010000410000000000140435000000040140003900000000020004100000000000210435000003010040009c001200000004001d0000030101000041000000000104401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000362011001c70000034b020000410bfe0bf40000040f000000010020019000000b920000613d0000001201000029000003460010009c0000000e010000290000013f0000213d0000001202000029000000400020043f0000000001010433001200000001001d0000035f010000410000000000100443000003750100004100000004001004430000000001000414000003010010009c0000030101008041000000c00110021000000360011001c700008002020000390bfe0bf90000040f000000010020019000000b4b0000613d000000000101043b000000000001004b000005810000613d00000012010000290000030401100197000000400400043d0000004402400039000000010300003900000000003204350000002402400039000000110300002900000000003204350000037602000041000000000024043500000004024000390000000000120435000003010040009c001200000004001d0000030101000041000000000104401900000040011002100000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000362011001c700000375020000410bfe0bf40000040f000000010020019000000b9f0000613d0000001201000029000003460010009c0000013f0000213d0000001201000029000000400010043f000000000100001900000bff0001042e000000000001042f0000038301000041000000000010043f000003500100004100000c000001043000000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b580000c13d000008290000013d0000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b640000c13d000005a70000013d0000039601000041000000000010043f000003500100004100000c00000104300000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b740000c13d000005a70000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b810000c13d000008290000013d0000001f0530018f0000030306300198000000400200043d0000000004620019000005a70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000b8d0000c13d000005a70000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000b9a0000c13d000008290000013d00000060061002700000001f0460018f0000030305600198000000400200043d0000000003520019000008290000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b00000ba70000c13d000008290000013d0000001f02200039000003a4022001970000000001120019000000000021004b00000000020000390000000102004039000003460010009c00000bb80000213d000000010020019000000bb80000c13d000000400010043f000000000001042d0000037301000041000000000010043f0000004101000039000000040010043f000003520100004100000c00000104300000030501000041000000000101041a0000000002000411000000000012004b00000bc40000c13d000000000001042d0000039b01000041000000000010043f0000033d0100004100000c000001043000010000000000020000030502000041000000000502041a00000000020004140000030406100197000003010020009c0000030102008041000000c00120021000000306011001c70000800d0200003900000003030000390000030704000041000100000006001d0bfe0bf40000040f000000010020019000000bdc0000613d00000305010000410000000102000029000000000021041b000000000001042d000000000100001900000c0000010430000000000001042f000003010010009c00000301010080410000004001100210000003010020009c00000301020080410000006002200210000000000112019f0000000002000414000003010020009c0000030102008041000000c002200210000000000112019f00000306011001c700008010020000390bfe0bf90000040f000000010020019000000bf20000613d000000000101043b000000000001042d000000000100001900000c000001043000000bf7002104210000000102000039000000000001042d0000000002000019000000000001042d00000bfc002104230000000102000039000000000001042d0000000002000019000000000001042d00000bfe0000043200000bff0001042e00000c000001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392702000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e000000000000000000000000000000000000000ffffffffffffffffffff0000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000c63db6bc00000000000000000000000000000000000000000000000000000000e7cf5c3e00000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000fa32c22500000000000000000000000000000000000000000000000000000000fee81cf400000000000000000000000000000000000000000000000000000000e7cf5c3f00000000000000000000000000000000000000000000000000000000f04e283e00000000000000000000000000000000000000000000000000000000d845a4b200000000000000000000000000000000000000000000000000000000d845a4b300000000000000000000000000000000000000000000000000000000d9801d0200000000000000000000000000000000000000000000000000000000c63db6bd00000000000000000000000000000000000000000000000000000000d58fe1a9000000000000000000000000000000000000000000000000000000009ecd177800000000000000000000000000000000000000000000000000000000bf0e5b9400000000000000000000000000000000000000000000000000000000bf0e5b9500000000000000000000000000000000000000000000000000000000c4ae3168000000000000000000000000000000000000000000000000000000009ecd177900000000000000000000000000000000000000000000000000000000b187bd2600000000000000000000000000000000000000000000000000000000900ac86e00000000000000000000000000000000000000000000000000000000900ac86f00000000000000000000000000000000000000000000000000000000922c3dc6000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008f561acc0000000000000000000000000000000000000000000000000000000036d3d35400000000000000000000000000000000000000000000000000000000600b269a00000000000000000000000000000000000000000000000000000000715018a500000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000008765431500000000000000000000000000000000000000000000000000000000600b269b000000000000000000000000000000000000000000000000000000006b1d4b730000000000000000000000000000000000000000000000000000000054d1f13c0000000000000000000000000000000000000000000000000000000054d1f13d0000000000000000000000000000000000000000000000000000000056d49d4d0000000000000000000000000000000000000000000000000000000036d3d355000000000000000000000000000000000000000000000000000000004ccabce80000000000000000000000000000000000000000000000000000000025692961000000000000000000000000000000000000000000000000000000002e48af04000000000000000000000000000000000000000000000000000000002e48af05000000000000000000000000000000000000000000000000000000003146afb80000000000000000000000000000000000000000000000000000000025692962000000000000000000000000000000000000000000000000000000002ae9b92f000000000000000000000000000000000000000000000000000000001e7e0658000000000000000000000000000000000000000000000000000000001e7e06590000000000000000000000000000000000000000000000000000000022b46e42000000000000000000000000000000000000000000000000000000000c08f561000000000000000000000000000000000000000000000000000000001ac3ddeb00000000000000000000000000000000000000000000000000000000389a75e10000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000000000007448fbae00000000000000000000000000000000000000040000001c000000000000000002000000000000000000000000000000000000200000000c0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006f5e88180000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000000000000000ffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000080000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000ff000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff3f04ecb0522ab37ca0b278a89c6884dfdbcde83c177150fc939ab02e069068bdef0000000000000000000000007c47ea32fd27d1a74fc6e9f31ce8162e6ce070eb00000000000000000000000000000000b9f368740000000000000000000000000000000000000000000000000000000059a24eb229eed07ac44229db56c5d79700000000000000000000000000000000000000a4000000000000000000000000398c2f8d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000e3914472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000bdc8b6eb1840215a22fc1134046f595b7d42c2de0000000000000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f000000000000ffffffffffff000000000000000000000000000000000000000000ffffffffff000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000020000000000000000000000000828764c21e74c28710e19919735825aba966621c95cbd913f8ed65a2d298f48c100457d1000000000000000000000000000000000000000000000000000000008bb622df00000000000000000000000000000000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000001000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffc00000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffe02000000000000000000000000000000ffffffff000000000000000000000000d9c5497a30353b28bf488a3294eccc71a7ff8a5987d7661a375cfa45f36e6304a45f47fd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000001c00000000000000000d9115c9900000000000000000000000000000000000000000000000000000000ffffffffffffffffff0000000000ffffffffffffffffffffffffffffffffffff000000000000000000ffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffff0000000000000000000000000000ffffffffff00000000000000000000000000ffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff000000000000000000000000000000000000000000000082b4290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f4e487b7100000000000000000000000000000000000000000000000000000000873410c46aa8a6fe816a84b97786814582c2255f6e7595f576a0e7f31677a073000000000000000000000000b5ec907d0e80f9a1ca9c1942d69fb558e01140d4156e29f600000000000000000000000000000000000000000000000000000000ffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffa9fe216aa4cb184f064a3f32d75e5d26ad2e159e070218c325ae228c82fc88304a4117f900000000000000000000000000000000000000000000000000000000f9fbb6c000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffff000000000000000000000000000000000000000000000000ffffffffff000000ffffffffffffffffffffffffffffffffffffff0000000000ffffffffffffffff00000000000000000000000000000000000000ffffffffff00000000000000003d693ada00000000000000000000000000000000000000000000000000000000fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff0000000000000000000000000000000000000000000000000000000000ff0000343a7f89000000000000000000000000000000000000000000000000000000007221b37b00000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d9e87fac800000000000000000000000000000000000000000000000000000000f3388ee30000000000000000000000000000000000000000000000000000000000000000000000000000000006d7ee1d50828ca96e11890a1601f6fe61f1e5846352211e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe3ffffffffffffffffffffffffffffffffffffff5bffffffe4000000000000000000000000000000000000000033ee11ce309854a45b65368c078616abcb5c6e3d000000000000000000000000000000008988eea90000000000000000000000000000000000000000000000000000000000000084000000000000000000000000eab52f840000000000000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000ffffffffff0000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000080000000000000000000000000492fb617aa0beefaf90753cefe981e45c21bf4d879116af6c361798d8589dc218858011300000000000000000000000000000000000000000000000000000000b0f9b99500000000000000000000000000000000000000000000000000000000eb0831bd00000000000000000000000000000000000000000000000000000000e0bbc9fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000008000000000000000000000000000000000000000000000000000000000000000000000000082b4290070a08231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000800000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004400000000000000000000000042966c6800000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000001356c7f2e9bcc442f4edb13333e3eb7e37cf6a88bb1506a03910fb0fb833d6e0
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.