Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DelabsAdventurePassStaking
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.16; /* /@@@ ,@&. @@@@@@@@&&@@@@@@@% .,*//*, .%@@@@@@@@@@@@ & /################# %@@@@@@@@@@, @ ##########%@@@@@&###### /@@@@@@@@@@@@( (#############@@@@@@######* %@@@@/ (##%@%##@@########%%#######( ,#########. . .######&@@@################. /########&@##( ######%@@##@@%#######(. .* (###%@@########. (################, (@@@@@@@& /#########@@%###. ##########* *@@@@@@@@@@@@@ .#####@@######### &@@@@@@@@@@@@@@, ################. &@@@@@@@@@@@@@@# (###############. #@@@@@@@@@@@@@% *####&@@@@@##### @@@@@@@@@@& ###%@@@@@@&###/ (####@@@@####( ,###########( ##########. ,###### */ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import {IDelabsAdventurePass} from "./interfaces/IDelabsAdventurePass.sol"; import {IDelabsAdventurePassStaking} from "./interfaces/IDelabsAdventurePassStaking.sol"; /** * @title Staking contract for Adventure Pass NFTs * @author Delabs Inc. */ contract DelabsAdventurePassStaking is IDelabsAdventurePassStaking, Initializable, PausableUpgradeable, OwnableUpgradeable { IDelabsAdventurePass private adventurePass; mapping(uint40 => uint16) public stakingLevels; mapping(uint256 => Position) public stakingPositions; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } // @dev Initializer as we using an upgradable contract function initialize(address adventurePassAddress) public initializer { adventurePass = IDelabsAdventurePass(adventurePassAddress); // inits __Ownable_init(); __Pausable_init(); } // -- STAKING -- // @dev Stake and lock (optional) one token function stake(uint256 tokenId, uint40 lockedPeriod) external whenNotPaused { //if( adventurePass.ownerOf(tokenId) != msg.sender ) revert SenderIsNotTokenOwner(tokenId); if( lockedPeriod > 0 && stakingLevels[lockedPeriod] <= 0 ) revert InvalidLockedPeriod(lockedPeriod); _stake(msg.sender, tokenId, lockedPeriod); } // @dev Stake and lock (optional) one or more tokens function batchStake(uint256[] calldata tokenIds, uint40 lockedPeriod) external whenNotPaused { if( lockedPeriod > 0 && stakingLevels[lockedPeriod] <= 0 ) revert InvalidLockedPeriod(lockedPeriod); uint256 tokenLen = tokenIds.length; for(uint256 i; i < tokenLen; i++) { _stake(msg.sender, tokenIds[i], lockedPeriod); } } // @dev Unstake one token function unstake(uint256 tokenId) external whenNotPaused { _unstake(msg.sender, tokenId); } // @dev Unstake one or more tokens function batchUnstake(uint256[] calldata tokenIds) external whenNotPaused { uint256 tokenLen = tokenIds.length; for(uint256 i; i < tokenLen; i++) { _unstake(msg.sender, tokenIds[i]); } } // @dev Lock a staked token function lock(uint256 tokenId, uint40 lockedPeriod) external whenNotPaused { if( lockedPeriod > 0 && stakingLevels[lockedPeriod] <= 0 ) revert InvalidLockedPeriod(lockedPeriod); _lock(msg.sender, tokenId, lockedPeriod); } // @dev Lock one or more staked token function batchLock(uint256[] calldata tokenIds, uint40 lockedPeriod) external whenNotPaused { if( lockedPeriod > 0 && stakingLevels[lockedPeriod] <= 0 ) revert InvalidLockedPeriod(lockedPeriod); uint256 tokenLen = tokenIds.length; for(uint256 i; i < tokenLen; i++) { _lock(msg.sender, tokenIds[i], lockedPeriod); } } // -- VIEWS -- // @dev Check if given token is staked function isTokenStaked(uint256 tokenId) external view returns(bool) { Position memory stakingPosition = stakingPositions[tokenId]; return stakingPosition.startTime > 0; } // @dev Check if given token is locked function isTokenLocked(uint256 tokenId) external view returns(bool) { Position memory stakingPosition = stakingPositions[tokenId]; return stakingPosition.lockedPeriod > 0; } // @dev Get staking start timestamp of given token function getTokenStakingStart(uint256 tokenId) external view returns(uint256) { Position memory stakingPosition = stakingPositions[tokenId]; return stakingPosition.startTime; } // @dev Get lock start timestamp of given token function getTokenLockStart(uint256 tokenId) external view returns(uint256) { Position memory stakingPosition = stakingPositions[tokenId]; return stakingPosition.lockStartTime; } // @dev Get staking time (in seconds) of given token function getTokenStakingTime(uint256 tokenId) external view returns(uint256) { Position memory stakingPosition = stakingPositions[tokenId]; return (stakingPosition.startTime > 0 ? (block.timestamp - stakingPosition.startTime) : 0); } // @dev Get locked period (in seconds) of given token function getTokenLockedPeriod(uint256 tokenId) external view returns(uint256) { Position memory stakingPosition = stakingPositions[tokenId]; return stakingPosition.lockedPeriod; } // @dev Get locked time left (in seconds) of given token function getTokenLockedTimeLeft(uint256 tokenId) external view returns(uint256) { Position memory stakingPosition = stakingPositions[tokenId]; if( stakingPosition.startTime > 0 && stakingPosition.lockedPeriod > 0 && (stakingPosition.lockStartTime+stakingPosition.lockedPeriod) > block.timestamp) { return (stakingPosition.lockStartTime+stakingPosition.lockedPeriod) - block.timestamp; } return 0; } // @dev Get level of given token function getTokenLevel(uint256 tokenId) external view returns(uint64) { Position memory stakingPosition = stakingPositions[tokenId]; return stakingPosition.level; } // @dev Get all staked tokenIds of given owner function getOwnerStakedTokenIds(address owner) public view returns(uint256[] memory) { unchecked { uint256[] memory stakedTokenIds = new uint256[](3433); uint256 stakedTokenBalance; uint256 arrCounter; uint256 stakedIndex; for(uint256 tokenId = 1; tokenId <= 3433; tokenId++) { Position memory stakingPosition = stakingPositions[tokenId]; if( stakingPosition.owner == owner ) { stakedTokenBalance++; stakedTokenIds[arrCounter++] = tokenId; } } if( stakedTokenBalance > 0 ) { arrCounter = 0; uint256[] memory trimmedStakedTokenIds = new uint256[](stakedTokenBalance); do { trimmedStakedTokenIds[arrCounter++] = stakedTokenIds[stakedIndex++]; } while( stakedTokenIds[stakedIndex] > 0 ); return trimmedStakedTokenIds; } else { uint256[] memory trimmedStakedTokenIds; return trimmedStakedTokenIds; } } } // @dev Get all staked positions of given owner function getOwnerStakedTokenPositions(address owner) public view returns(ReadablePosition[] memory) { unchecked { uint256[] memory stakedTokenIds = getOwnerStakedTokenIds(owner); ReadablePosition[] memory stakedTokenPositions = new ReadablePosition[](stakedTokenIds.length); for(uint256 i = 0; i < stakedTokenIds.length; i++) { stakedTokenPositions[i] = _convertToReadablePosition(stakedTokenIds[i], stakingPositions[stakedTokenIds[i]]); } return stakedTokenPositions; } } // @dev Get all staked tokenIds function getStakedTokenIds() public view returns(uint256[] memory) { unchecked { uint256[] memory stakedTokenIds = new uint256[](3433); uint256 stakedTokenBalance; uint256 arrCounter; uint256 stakedIndex; for(uint256 tokenId = 1; tokenId <= 3433; tokenId++) { Position memory stakingPosition = stakingPositions[tokenId]; if( stakingPosition.startTime > 0 ) { stakedTokenBalance++; stakedTokenIds[arrCounter++] = tokenId; } } if( stakedTokenBalance > 0 ) { arrCounter = 0; uint256[] memory trimmedStakedTokenIds = new uint256[](stakedTokenBalance); do { trimmedStakedTokenIds[arrCounter++] = stakedTokenIds[stakedIndex++]; } while( stakedTokenIds[stakedIndex] > 0 ); return trimmedStakedTokenIds; } else { uint256[] memory trimmedStakedTokenIds; return trimmedStakedTokenIds; } } } // @dev Get all staked positions function getStakedTokenPositions() public view returns(ReadablePosition[] memory) { unchecked { uint256[] memory stakedTokenIds = getStakedTokenIds(); ReadablePosition[] memory stakedTokenPositions = new ReadablePosition[](stakedTokenIds.length); for(uint256 i = 0; i < stakedTokenIds.length; i++) { stakedTokenPositions[i] = _convertToReadablePosition(stakedTokenIds[i], stakingPositions[stakedTokenIds[i]]); } return stakedTokenPositions; } } // @dev Get token position by given tokenId function getTokenPosition(uint256 tokenId) public view returns(ReadablePosition memory) { unchecked { return _convertToReadablePosition(tokenId, stakingPositions[tokenId]); } } // -- INTERNAL -- // @dev Internal stake function function _stake(address sender, uint256 tokenId, uint40 lockedPeriod) internal { Position storage stakingPosition = stakingPositions[tokenId]; if( stakingPosition.startTime > 0 ) revert TokenAlreadyStaked(tokenId); uint16 previousLevel = stakingPosition.level; stakingPosition.owner = sender; stakingPosition.startTime = uint40(block.timestamp); if( lockedPeriod > 0 ) { stakingPosition.lockStartTime = uint40(block.timestamp); stakingPosition.lockedPeriod = lockedPeriod; stakingPosition.level += stakingLevels[lockedPeriod]; } adventurePass.transferFrom(sender, address(this), tokenId); emit TokenStaked(tokenId, lockedPeriod, previousLevel, stakingPosition.level); emit MetadataUpdate(tokenId); } // @dev Internal unstake function function _unstake(address recipient, uint256 tokenId) internal { Position storage stakingPosition = stakingPositions[tokenId]; if( recipient != stakingPosition.owner ) revert SenderIsNotTokenOwner(tokenId); if( stakingPosition.startTime <= 0 ) revert TokenIsNotStaked(tokenId); if( stakingPosition.lockedPeriod > 0 && (stakingPosition.lockStartTime+stakingPosition.lockedPeriod) > block.timestamp ) revert TokenIsLocked(tokenId); stakingPosition.owner = address(0); stakingPosition.startTime = 0; stakingPosition.lockStartTime = 0; stakingPosition.lockedPeriod = 0; adventurePass.transferFrom(address(this), recipient, tokenId); emit TokenUnstaked(tokenId, stakingPosition.level); } // @dev Internal force unstake function. Only use with caution [!] function _forceUnstake(uint256 tokenId) internal { Position storage stakingPosition = stakingPositions[tokenId]; if( stakingPosition.startTime <= 0 ) revert TokenIsNotStaked(tokenId); address recipient = stakingPosition.owner; stakingPosition.owner = address(0); stakingPosition.startTime = 0; stakingPosition.lockStartTime = 0; stakingPosition.lockedPeriod = 0; adventurePass.transferFrom(address(this), recipient, tokenId); emit TokenUnstaked(tokenId, stakingPosition.level); } // @dev Internal lock function function _lock(address holder, uint256 tokenId, uint40 lockedPeriod) internal { Position storage stakingPosition = stakingPositions[tokenId]; if( holder != stakingPosition.owner ) revert SenderIsNotTokenOwner(tokenId); if( stakingPosition.startTime <= 0 ) revert TokenHasToBeStaked(tokenId); if( stakingPosition.lockedPeriod > 0 && (stakingPosition.lockStartTime+stakingPosition.lockedPeriod) > block.timestamp ) revert TokenIsLocked(tokenId); uint16 previousLevel = stakingPosition.level; stakingPosition.lockStartTime = uint40(block.timestamp); stakingPosition.lockedPeriod = lockedPeriod; stakingPosition.level += stakingLevels[lockedPeriod]; emit TokenLocked(tokenId, lockedPeriod, previousLevel, stakingPosition.level); emit MetadataUpdate(tokenId); } // @dev Converts a stakingPosition to a readable staking position function _convertToReadablePosition(uint256 tokenId, Position memory stakingPosition) internal view returns (ReadablePosition memory) { ReadablePosition memory readableStakingPosition; readableStakingPosition.tokenId = tokenId; readableStakingPosition.owner = stakingPosition.owner; readableStakingPosition.level = stakingPosition.level; readableStakingPosition.startTime = stakingPosition.startTime; readableStakingPosition.lockStartTime = stakingPosition.lockStartTime; readableStakingPosition.lockedPeriod = stakingPosition.lockedPeriod; readableStakingPosition.isTokenStaked = stakingPosition.startTime > 0; readableStakingPosition.isTokenLocked = stakingPosition.lockedPeriod > 0; readableStakingPosition.tokenStakingTime = (stakingPosition.startTime > 0 ? uint40((block.timestamp - stakingPosition.startTime)) : 0); if( stakingPosition.startTime > 0 && stakingPosition.lockedPeriod > 0 && (stakingPosition.lockStartTime+stakingPosition.lockedPeriod) > block.timestamp) { readableStakingPosition.tokenLockedTimeLeft = uint40((stakingPosition.lockStartTime+stakingPosition.lockedPeriod) - block.timestamp); } return readableStakingPosition; } // -- ADMIN -- // @dev Force unstake one or more tokens (skips contract pause and locked periods) function forceBatchUnstake(uint256[] calldata tokenIds) external onlyOwner { uint256 tokenLen = tokenIds.length; for(uint256 i; i < tokenLen; i++) { _forceUnstake(tokenIds[i]); } } // @dev Set level of given token function setTokenLevel(uint256 tokenId, uint16 level) external onlyOwner { Position storage stakingPosition = stakingPositions[tokenId]; stakingPosition.level = level; emit TokenLevelSet(tokenId, level); } // @dev Set the adventure pass contract address function setAdventurePassContract(address adventurePassAddress) external onlyOwner { adventurePass = IDelabsAdventurePass(adventurePassAddress); emit AdventurePassContractChanged(adventurePassAddress); } // @dev Set available staking levels by locked periods function setStakingLevels(uint40[] calldata lockedPeriods, uint16[] calldata levels) external onlyOwner { uint256 arrLength = lockedPeriods.length; for(uint256 i; i < arrLength; i++ ) { stakingLevels[lockedPeriods[i]] = levels[i]; } emit StakingLevelsUpdated(); } // @dev Upsert one staking level by locked period function upsertStakingLevel(uint40 lockedPeriod, uint16 level) external onlyOwner { stakingLevels[lockedPeriod] = level; emit StakingLevelsUpdated(); } // @dev Pause staking function pauseStaking() external onlyOwner { _pause(); } // @dev Unpause staking function unpauseStaking() external onlyOwner { _unpause(); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.16; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IDelabsAdventurePass is IERC721 { }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.16; interface IDelabsAdventurePassStaking { struct Position { address owner; uint40 lockedPeriod; uint40 startTime; uint40 lockStartTime; uint16 level; } struct ReadablePosition { uint256 tokenId; address owner; uint16 level; uint40 lockedPeriod; uint40 startTime; uint40 lockStartTime; uint40 tokenStakingTime; uint40 tokenLockedTimeLeft; bool isTokenStaked; bool isTokenLocked; } error SenderIsNotTokenOwner( uint256 tokenId ); error TokenAlreadyStaked( uint256 tokenId ); error TokenIsNotStaked( uint256 tokenId ); error TokenHasToBeStaked( uint256 tokenId ); error TokenIsLocked( uint256 tokenId ); error InvalidLockedPeriod( uint40 lockedPeriod ); event MetadataUpdate(uint256 tokenId); // eip-4906 event TokenStaked( uint256 tokenId, uint40 lockedPeriod, uint16 previousLevel, uint16 targetLevel ); event TokenUnstaked( uint256 tokenId, uint16 currentLevel ); event TokenLocked( uint256 tokenId, uint40 lockedPeriod, uint16 previousLevel, uint16 targetLevel ); event TokenLevelSet( uint256 tokenId, uint16 level ); event AdventurePassContractChanged( address newContract ); event StakingLevelsUpdated(); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint40","name":"lockedPeriod","type":"uint40"}],"name":"InvalidLockedPeriod","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SenderIsNotTokenOwner","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenAlreadyStaked","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenHasToBeStaked","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenIsLocked","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenIsNotStaked","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContract","type":"address"}],"name":"AdventurePassContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"StakingLevelsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"level","type":"uint16"}],"name":"TokenLevelSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"indexed":false,"internalType":"uint16","name":"previousLevel","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"targetLevel","type":"uint16"}],"name":"TokenLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"indexed":false,"internalType":"uint16","name":"previousLevel","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"targetLevel","type":"uint16"}],"name":"TokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"currentLevel","type":"uint16"}],"name":"TokenUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"}],"name":"batchLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"}],"name":"batchStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"forceBatchUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getOwnerStakedTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getOwnerStakedTokenPositions","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"internalType":"uint40","name":"startTime","type":"uint40"},{"internalType":"uint40","name":"lockStartTime","type":"uint40"},{"internalType":"uint40","name":"tokenStakingTime","type":"uint40"},{"internalType":"uint40","name":"tokenLockedTimeLeft","type":"uint40"},{"internalType":"bool","name":"isTokenStaked","type":"bool"},{"internalType":"bool","name":"isTokenLocked","type":"bool"}],"internalType":"struct IDelabsAdventurePassStaking.ReadablePosition[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakedTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakedTokenPositions","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"internalType":"uint40","name":"startTime","type":"uint40"},{"internalType":"uint40","name":"lockStartTime","type":"uint40"},{"internalType":"uint40","name":"tokenStakingTime","type":"uint40"},{"internalType":"uint40","name":"tokenLockedTimeLeft","type":"uint40"},{"internalType":"bool","name":"isTokenStaked","type":"bool"},{"internalType":"bool","name":"isTokenLocked","type":"bool"}],"internalType":"struct IDelabsAdventurePassStaking.ReadablePosition[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenLevel","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenLockStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenLockedPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenLockedTimeLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenPosition","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"internalType":"uint40","name":"startTime","type":"uint40"},{"internalType":"uint40","name":"lockStartTime","type":"uint40"},{"internalType":"uint40","name":"tokenStakingTime","type":"uint40"},{"internalType":"uint40","name":"tokenLockedTimeLeft","type":"uint40"},{"internalType":"bool","name":"isTokenStaked","type":"bool"},{"internalType":"bool","name":"isTokenLocked","type":"bool"}],"internalType":"struct IDelabsAdventurePassStaking.ReadablePosition","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenStakingStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenStakingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adventurePassAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isTokenLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isTokenStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adventurePassAddress","type":"address"}],"name":"setAdventurePassContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint40[]","name":"lockedPeriods","type":"uint40[]"},{"internalType":"uint16[]","name":"levels","type":"uint16[]"}],"name":"setStakingLevels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint16","name":"level","type":"uint16"}],"name":"setTokenLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint40","name":"","type":"uint40"}],"name":"stakingLevels","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingPositions","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"internalType":"uint40","name":"startTime","type":"uint40"},{"internalType":"uint40","name":"lockStartTime","type":"uint40"},{"internalType":"uint16","name":"level","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint40","name":"lockedPeriod","type":"uint40"},{"internalType":"uint16","name":"level","type":"uint16"}],"name":"upsertStakingLevel","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6125a680620000f46000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806393f4bcde1161011a578063d55a3dca116100ad578063f08259041161007c578063f08259041461072c578063f0a524241461073f578063f2fde38b146107c0578063f999c506146107d3578063fff30dcb146107db57600080fd5b8063d55a3dca14610661578063dad536c514610681578063edf394df14610694578063ef2b9e3a146106a957600080fd5b8063b80ed6a1116100e9578063b80ed6a11461056c578063c4d66de8146105a3578063d011645c146105b6578063d2acd13d1461064e57600080fd5b806393f4bcde146104bb5780639e000858146104c3578063a4d43e58146104d6578063affe32af146104e957600080fd5b806346e96c591161019257806378a5ae961161016157806378a5ae96146103ed578063862e16101461040e5780638da5cb5b1461048d57806393826341146104a857600080fd5b806346e96c59146103b45780634a128e93146103c75780635c975abb146103da578063715018a6146103e557600080fd5b8063276a28a3116101ce578063276a28a3146102645780632e17de78146102f957806331a73f9b1461030c578063413c7773146103ac57600080fd5b80630f069e4114610200578063158dff5f14610215578063193cd426146102285780631a8ad3911461023b575b600080fd5b61021361020e3660046120c5565b6107ee565b005b610213610223366004612103565b610860565b610213610236366004612172565b6108d9565b61024e6102493660046121c6565b61097f565b60405161025b91906122c1565b60405180910390f35b6102e9610272366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff908116948301859052600160c81b9091048116948201949094526001909101549283166060820152600160281b90920461ffff16608090920191909152151590565b604051901515815260200161025b565b610213610307366004612310565b610ace565b61036961031a366004612310565b609960205260009081526040902080546001909101546001600160a01b0382169164ffffffffff600160a01b8204811692600160c81b9092048116919081169061ffff600160281b9091041685565b604080516001600160a01b03909616865264ffffffffff94851660208701529284169285019290925291909116606083015261ffff16608082015260a00161025b565b61024e610ae3565b6102136103c2366004612172565b610b96565b6102136103d5366004612329565b610c35565b60335460ff166102e9565b610213610c82565b6104006103fb366004612310565b610c96565b60405190815260200161025b565b61040061041c366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b900483169381018490526001909101549182166060820152600160281b90910461ffff1660809091015290565b6065546040516001600160a01b03909116815260200161025b565b6102136104b636600461236b565b610d2a565b610213610d81565b6102136104d13660046121c6565b610d91565b6102136104e43660046120c5565b610ded565b6104006104f7366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff908116948301859052600160c81b9091048116948201949094526001909101549283166060820152600160281b90920461ffff1660809092019190915290565b61059061057a366004612395565b60986020526000908152604090205461ffff1681565b60405161ffff909116815260200161025b565b6102136105b13660046121c6565b610e56565b6106356105c4366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b038116825264ffffffffff600160a01b8204811694830194909452600160c81b900483169381019390935260010154908116606083015261ffff600160281b90910416608090910181905290565b60405167ffffffffffffffff909116815260200161025b565b61021361065c366004612329565b610f8a565b61067461066f366004612310565b610fd2565b60405161025b91906123b0565b61040061068f366004612310565b611056565b61069c611134565b60405161025b91906123bf565b6104006106b7366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b90048316938101939093526001015490811660608301819052600160281b90910461ffff1660809092019190915290565b61021361073a3660046123f7565b6112e2565b6102e961074d366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b900483169381018490526001909101549182166060820152600160281b90910461ffff16608090910152151590565b6102136107ce3660046121c6565b6113b6565b61021361142c565b61069c6107e93660046121c6565b61143c565b6107f66115f4565b60008164ffffffffff16118015610825575064ffffffffff811660009081526098602052604090205461ffff16155b1561085157604051630614e35560e41b815264ffffffffff821660048201526024015b60405180910390fd5b61085c33838361163a565b5050565b610868611839565b60008281526099602090815260409182902060018101805466ffff00000000001916600160281b61ffff871690810291909117909155835186815292830152917fc339f25b2fe81560417fd4ba00e7d106023d959913d4cefa6677d27a0c7c15ee91015b60405180910390a1505050565b6108e16115f4565b60008164ffffffffff16118015610910575064ffffffffff811660009081526098602052604090205461ffff16155b1561093757604051630614e35560e41b815264ffffffffff82166004820152602401610848565b8160005b81811015610978576109663386868481811061095957610959612463565b9050602002013585611893565b806109708161248f565b91505061093b565b5050505050565b6060600061098c8361143c565b90506000815167ffffffffffffffff8111156109aa576109aa6124a8565b6040519080825280602002602001820160405280156109e357816020015b6109d0612057565b8152602001906001900390816109c85790505b50905060005b8251811015610ac657610aa1838281518110610a0757610a07612463565b602002602001015160996000868581518110610a2557610a25612463565b6020908102919091018101518252818101929092526040908101600020815160a08101835281546001600160a01b0381168252600160a01b810464ffffffffff90811695830195909552600160c81b9004841692810192909252600101549182166060820152600160281b90910461ffff166080820152611a82565b828281518110610ab357610ab3612463565b60209081029190910101526001016109e9565b509392505050565b610ad66115f4565b610ae03382611bb7565b50565b60606000610aef611134565b90506000815167ffffffffffffffff811115610b0d57610b0d6124a8565b604051908082528060200260200182016040528015610b4657816020015b610b33612057565b815260200190600190039081610b2b5790505b50905060005b8251811015610b8f57610b6a838281518110610a0757610a07612463565b828281518110610b7c57610b7c612463565b6020908102919091010152600101610b4c565b5092915050565b610b9e6115f4565b60008164ffffffffff16118015610bcd575064ffffffffff811660009081526098602052604090205461ffff16155b15610bf457604051630614e35560e41b815264ffffffffff82166004820152602401610848565b8160005b8181101561097857610c2333868684818110610c1657610c16612463565b905060200201358561163a565b80610c2d8161248f565b915050610bf8565b610c3d611839565b8060005b81811015610c7c57610c6a848483818110610c5e57610c5e612463565b90506020020135611d5b565b80610c748161248f565b915050610c41565b50505050565b610c8a611839565b610c946000611e6c565b565b6000818152609960209081526040808320815160a08101835281546001600160a01b0381168252600160a01b810464ffffffffff90811695830195909552600160c81b900484169281018390526001909101549283166060820152600160281b90920461ffff166080830152610d0d576000610d23565b6040810151610d239064ffffffffff16426124be565b9392505050565b610d32611839565b64ffffffffff8216600090815260986020526040808220805461ffff191661ffff8516179055517f67ce21811d4b1b6ebd4700f856edf2be5aace8686d54c04d4a0d8660be311fa59190a15050565b610d89611839565b610c94611ebe565b610d99611839565b609780546001600160a01b0319166001600160a01b0383169081179091556040519081527f0d340f79ae9dada455c169dcfd2e4b7b9530b2abcc7eef2b829f43b09fbf72039060200160405180910390a150565b610df56115f4565b60008164ffffffffff16118015610e24575064ffffffffff811660009081526098602052604090205461ffff16155b15610e4b57604051630614e35560e41b815264ffffffffff82166004820152602401610848565b61085c338383611893565b600054610100900460ff1615808015610e765750600054600160ff909116105b80610e905750303b158015610e90575060005460ff166001145b610ef35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610848565b6000805460ff191660011790558015610f16576000805461ff0019166101001790555b609780546001600160a01b0319166001600160a01b038416179055610f39611f10565b610f41611f3f565b801561085c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b610f926115f4565b8060005b81811015610c7c57610fc033858584818110610fb457610fb4612463565b90506020020135611bb7565b80610fca8161248f565b915050610f96565b610fda612057565b600082815260996020908152604091829020825160a08101845281546001600160a01b038116825264ffffffffff600160a01b8204811694830194909452600160c81b900483169381019390935260010154908116606083015261ffff600160281b909104166080820152611050908390611a82565b92915050565b6000818152609960209081526040808320815160a08101835281546001600160a01b0381168252600160a01b810464ffffffffff90811695830195909552600160c81b900484169281018390526001909101549283166060820152600160281b90920461ffff166080830152158015906110db57506000816020015164ffffffffff16115b8015611100575042816020015182606001516110f791906124d1565b64ffffffffff16115b1561112b57428160200151826060015161111a91906124d1565b64ffffffffff16610d2391906124be565b50600092915050565b60408051610d698082526201ad40820190925260609160009190602082016201ad20803683370190505090506000808060015b610d69811161121757600081815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b900483169381018490526001909101549182166060820152600160281b90910461ffff166080820152901561120e5785516001958601958501948391889190811061120157611201612463565b6020026020010181815250505b50600101611167565b5082156112d7576000915060008367ffffffffffffffff81111561123d5761123d6124a8565b604051908082528060200260200182016040528015611266578160200160208202803683370190505b5090505b845160018301928691811061128157611281612463565b60200260200101518184806001019550815181106112a1576112a1612463565b60200260200101818152505060008583815181106112c1576112c1612463565b60200260200101511161126a5795945050505050565b506060949350505050565b6112ea611839565b8260005b818110156113855783838281811061130857611308612463565b905060200201602081019061131d91906124ef565b6098600088888581811061133357611333612463565b90506020020160208101906113489190612395565b64ffffffffff1681526020810191909152604001600020805461ffff191661ffff929092169190911790558061137d8161248f565b9150506112ee565b506040517f67ce21811d4b1b6ebd4700f856edf2be5aace8686d54c04d4a0d8660be311fa590600090a15050505050565b6113be611839565b6001600160a01b0381166114235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610848565b610ae081611e6c565b611434611839565b610c94611f6e565b60408051610d698082526201ad40820190925260609160009190602082016201ad20803683370190505090506000808060015b610d69811161152757600081815260996020908152604091829020825160a08101845281546001600160a01b03808216808452600160a01b830464ffffffffff90811696850196909652600160c81b9092048516958301959095526001909201549283166060820152600160281b90920461ffff16608083015290918916900361151e5785516001958601958501948391889190811061151157611511612463565b6020026020010181815250505b5060010161146f565b5082156115e8576000915060008367ffffffffffffffff81111561154d5761154d6124a8565b604051908082528060200260200182016040528015611576578160200160208202803683370190505b5090505b845160018301928691811061159157611591612463565b60200260200101518184806001019550815181106115b1576115b1612463565b60200260200101818152505060008583815181106115d1576115d1612463565b60200260200101511161157a579695505050505050565b50606095945050505050565b60335460ff1615610c945760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610848565b600082815260996020526040902080546001600160a01b038581169116146116785760405163b384568f60e01b815260048101849052602401610848565b8054600160c81b900464ffffffffff166116a857604051633ebe422960e01b815260048101849052602401610848565b8054600160a01b900464ffffffffff16158015906116ee57508054600182015442916116e59164ffffffffff600160a01b909204821691166124d1565b64ffffffffff16115b1561170f5760405163dc8fb34160e01b815260048101849052602401610848565b60018101805464ffffffffff42811664ffffffffff198316178084558454918616600160a01b810264ffffffffff60a01b199093169290921785556000918252609860205260409091205461ffff600160281b93849004811694918116939192600592611782928692919091041661250a565b82546101009290920a61ffff81810219909316918316021790915560018401546040805188815264ffffffffff8816602082015285841691810191909152600160281b90910490911660608201527f4e9cdeb85d411171f42e9e9d50dd5033126a7f57115cc90f5369685f90b106c991506080015b60405180910390a16040518481527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050505050565b6065546001600160a01b03163314610c945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610848565b60008281526099602052604090208054600160c81b900464ffffffffff16156118d2576040516328f0990960e11b815260048101849052602401610848565b6001810154815464ffffffffff428116600160c81b027fffff0000000000ffffffffff00000000000000000000000000000000000000009092166001600160a01b0388161791909117835561ffff600160281b90920491909116908316156119b85760018201805464ffffffffff19164264ffffffffff90811691909117808355845464ffffffffff60a01b1916600160a01b9287169283021785556000918252609860205260409091205461ffff908116929160059161199d918591600160281b9091041661250a565b92506101000a81548161ffff021916908361ffff1602179055505b6097546040516323b872dd60e01b81526001600160a01b03878116600483015230602483015260448201879052909116906323b872dd90606401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b50505060018301546040805187815264ffffffffff8716602082015261ffff80861692820192909252600160281b9092041660608201527f241b34d531d323aafa73ea9ae314ce38ead1671066f81051192a5a7264aee68791506080016117f7565b611a8a612057565b611a92612057565b83815282516001600160a01b031660208083019190915260808085015161ffff166040808501919091528501805164ffffffffff90811692850192909252606080870151831660a08601529286018051831693850193909352805182161515610100850152915181161515610120840152905116611b11576000611b27565b6040830151611b279064ffffffffff16426124be565b64ffffffffff90811660c083015260408401511615801590611b5457506000836020015164ffffffffff16115b8015611b7957504283602001518460600151611b7091906124d1565b64ffffffffff16115b15610d23574283602001518460600151611b9391906124d1565b64ffffffffff16611ba491906124be565b64ffffffffff1660e08201529392505050565b600081815260996020526040902080546001600160a01b03848116911614611bf55760405163b384568f60e01b815260048101839052602401610848565b8054600160c81b900464ffffffffff16611c255760405163072a061160e41b815260048101839052602401610848565b8054600160a01b900464ffffffffff1615801590611c6b5750805460018201544291611c629164ffffffffff600160a01b909204821691166124d1565b64ffffffffff16115b15611c8c5760405163dc8fb34160e01b815260048101839052602401610848565b805460018201805464ffffffffff191690556001600160f01b03191681556097546040516323b872dd60e01b81523060048201526001600160a01b03858116602483015260448201859052909116906323b872dd90606401600060405180830381600087803b158015611cfe57600080fd5b505af1158015611d12573d6000803e3d6000fd5b50505050600181015460408051848152600160281b90920461ffff1660208301527fbe6b1dc07b47507be3f3170440318c19f630ffff4ba02f11e90feccd38ec4fc491016108cc565b60008181526099602052604090208054600160c81b900464ffffffffff16611d995760405163072a061160e41b815260048101839052602401610848565b805460018201805464ffffffffff191690556001600160f01b0319811682556097546040516323b872dd60e01b81523060048201526001600160a01b03928316602482018190526044820186905292909116906323b872dd90606401600060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b50505050600182015460408051858152600160281b90920461ffff1660208301527fbe6b1dc07b47507be3f3170440318c19f630ffff4ba02f11e90feccd38ec4fc491016108cc565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ec6611fab565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff16611f375760405162461bcd60e51b815260040161084890612525565b610c94611ff4565b600054610100900460ff16611f665760405162461bcd60e51b815260040161084890612525565b610c94612024565b611f766115f4565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ef33390565b60335460ff16610c945760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610848565b600054610100900460ff1661201b5760405162461bcd60e51b815260040161084890612525565b610c9433611e6c565b600054610100900460ff1661204b5760405162461bcd60e51b815260040161084890612525565b6033805460ff19169055565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b803564ffffffffff811681146120c057600080fd5b919050565b600080604083850312156120d857600080fd5b823591506120e8602084016120ab565b90509250929050565b803561ffff811681146120c057600080fd5b6000806040838503121561211657600080fd5b823591506120e8602084016120f1565b60008083601f84011261213857600080fd5b50813567ffffffffffffffff81111561215057600080fd5b6020830191508360208260051b850101111561216b57600080fd5b9250929050565b60008060006040848603121561218757600080fd5b833567ffffffffffffffff81111561219e57600080fd5b6121aa86828701612126565b90945092506121bd9050602085016120ab565b90509250925092565b6000602082840312156121d857600080fd5b81356001600160a01b0381168114610d2357600080fd5b80518252602081015161220d60208401826001600160a01b03169052565b506040810151612223604084018261ffff169052565b50606081015161223c606084018264ffffffffff169052565b506080810151612255608084018264ffffffffff169052565b5060a081015161226e60a084018264ffffffffff169052565b5060c081015161228760c084018264ffffffffff169052565b5060e08101516122a060e084018264ffffffffff169052565b50610100818101511515908301526101208082015180151582850152610c7c565b6020808252825182820181905260009190848201906040850190845b81811015612304576122f08385516121ef565b9284019261014092909201916001016122dd565b50909695505050505050565b60006020828403121561232257600080fd5b5035919050565b6000806020838503121561233c57600080fd5b823567ffffffffffffffff81111561235357600080fd5b61235f85828601612126565b90969095509350505050565b6000806040838503121561237e57600080fd5b612387836120ab565b91506120e8602084016120f1565b6000602082840312156123a757600080fd5b610d23826120ab565b610140810161105082846121ef565b6020808252825182820181905260009190848201906040850190845b81811015612304578351835292840192918401916001016123db565b6000806000806040858703121561240d57600080fd5b843567ffffffffffffffff8082111561242557600080fd5b61243188838901612126565b9096509450602087013591508082111561244a57600080fd5b5061245787828801612126565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124a1576124a1612479565b5060010190565b634e487b7160e01b600052604160045260246000fd5b8181038181111561105057611050612479565b64ffffffffff818116838216019080821115610b8f57610b8f612479565b60006020828403121561250157600080fd5b610d23826120f1565b61ffff818116838216019080821115610b8f57610b8f612479565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212207dbb2b7dabbb8629d8fd39f8ad77c8ff259f33a9f770948f4ceea507780f506764736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806393f4bcde1161011a578063d55a3dca116100ad578063f08259041161007c578063f08259041461072c578063f0a524241461073f578063f2fde38b146107c0578063f999c506146107d3578063fff30dcb146107db57600080fd5b8063d55a3dca14610661578063dad536c514610681578063edf394df14610694578063ef2b9e3a146106a957600080fd5b8063b80ed6a1116100e9578063b80ed6a11461056c578063c4d66de8146105a3578063d011645c146105b6578063d2acd13d1461064e57600080fd5b806393f4bcde146104bb5780639e000858146104c3578063a4d43e58146104d6578063affe32af146104e957600080fd5b806346e96c591161019257806378a5ae961161016157806378a5ae96146103ed578063862e16101461040e5780638da5cb5b1461048d57806393826341146104a857600080fd5b806346e96c59146103b45780634a128e93146103c75780635c975abb146103da578063715018a6146103e557600080fd5b8063276a28a3116101ce578063276a28a3146102645780632e17de78146102f957806331a73f9b1461030c578063413c7773146103ac57600080fd5b80630f069e4114610200578063158dff5f14610215578063193cd426146102285780631a8ad3911461023b575b600080fd5b61021361020e3660046120c5565b6107ee565b005b610213610223366004612103565b610860565b610213610236366004612172565b6108d9565b61024e6102493660046121c6565b61097f565b60405161025b91906122c1565b60405180910390f35b6102e9610272366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff908116948301859052600160c81b9091048116948201949094526001909101549283166060820152600160281b90920461ffff16608090920191909152151590565b604051901515815260200161025b565b610213610307366004612310565b610ace565b61036961031a366004612310565b609960205260009081526040902080546001909101546001600160a01b0382169164ffffffffff600160a01b8204811692600160c81b9092048116919081169061ffff600160281b9091041685565b604080516001600160a01b03909616865264ffffffffff94851660208701529284169285019290925291909116606083015261ffff16608082015260a00161025b565b61024e610ae3565b6102136103c2366004612172565b610b96565b6102136103d5366004612329565b610c35565b60335460ff166102e9565b610213610c82565b6104006103fb366004612310565b610c96565b60405190815260200161025b565b61040061041c366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b900483169381018490526001909101549182166060820152600160281b90910461ffff1660809091015290565b6065546040516001600160a01b03909116815260200161025b565b6102136104b636600461236b565b610d2a565b610213610d81565b6102136104d13660046121c6565b610d91565b6102136104e43660046120c5565b610ded565b6104006104f7366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff908116948301859052600160c81b9091048116948201949094526001909101549283166060820152600160281b90920461ffff1660809092019190915290565b61059061057a366004612395565b60986020526000908152604090205461ffff1681565b60405161ffff909116815260200161025b565b6102136105b13660046121c6565b610e56565b6106356105c4366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b038116825264ffffffffff600160a01b8204811694830194909452600160c81b900483169381019390935260010154908116606083015261ffff600160281b90910416608090910181905290565b60405167ffffffffffffffff909116815260200161025b565b61021361065c366004612329565b610f8a565b61067461066f366004612310565b610fd2565b60405161025b91906123b0565b61040061068f366004612310565b611056565b61069c611134565b60405161025b91906123bf565b6104006106b7366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b90048316938101939093526001015490811660608301819052600160281b90910461ffff1660809092019190915290565b61021361073a3660046123f7565b6112e2565b6102e961074d366004612310565b600090815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b900483169381018490526001909101549182166060820152600160281b90910461ffff16608090910152151590565b6102136107ce3660046121c6565b6113b6565b61021361142c565b61069c6107e93660046121c6565b61143c565b6107f66115f4565b60008164ffffffffff16118015610825575064ffffffffff811660009081526098602052604090205461ffff16155b1561085157604051630614e35560e41b815264ffffffffff821660048201526024015b60405180910390fd5b61085c33838361163a565b5050565b610868611839565b60008281526099602090815260409182902060018101805466ffff00000000001916600160281b61ffff871690810291909117909155835186815292830152917fc339f25b2fe81560417fd4ba00e7d106023d959913d4cefa6677d27a0c7c15ee91015b60405180910390a1505050565b6108e16115f4565b60008164ffffffffff16118015610910575064ffffffffff811660009081526098602052604090205461ffff16155b1561093757604051630614e35560e41b815264ffffffffff82166004820152602401610848565b8160005b81811015610978576109663386868481811061095957610959612463565b9050602002013585611893565b806109708161248f565b91505061093b565b5050505050565b6060600061098c8361143c565b90506000815167ffffffffffffffff8111156109aa576109aa6124a8565b6040519080825280602002602001820160405280156109e357816020015b6109d0612057565b8152602001906001900390816109c85790505b50905060005b8251811015610ac657610aa1838281518110610a0757610a07612463565b602002602001015160996000868581518110610a2557610a25612463565b6020908102919091018101518252818101929092526040908101600020815160a08101835281546001600160a01b0381168252600160a01b810464ffffffffff90811695830195909552600160c81b9004841692810192909252600101549182166060820152600160281b90910461ffff166080820152611a82565b828281518110610ab357610ab3612463565b60209081029190910101526001016109e9565b509392505050565b610ad66115f4565b610ae03382611bb7565b50565b60606000610aef611134565b90506000815167ffffffffffffffff811115610b0d57610b0d6124a8565b604051908082528060200260200182016040528015610b4657816020015b610b33612057565b815260200190600190039081610b2b5790505b50905060005b8251811015610b8f57610b6a838281518110610a0757610a07612463565b828281518110610b7c57610b7c612463565b6020908102919091010152600101610b4c565b5092915050565b610b9e6115f4565b60008164ffffffffff16118015610bcd575064ffffffffff811660009081526098602052604090205461ffff16155b15610bf457604051630614e35560e41b815264ffffffffff82166004820152602401610848565b8160005b8181101561097857610c2333868684818110610c1657610c16612463565b905060200201358561163a565b80610c2d8161248f565b915050610bf8565b610c3d611839565b8060005b81811015610c7c57610c6a848483818110610c5e57610c5e612463565b90506020020135611d5b565b80610c748161248f565b915050610c41565b50505050565b610c8a611839565b610c946000611e6c565b565b6000818152609960209081526040808320815160a08101835281546001600160a01b0381168252600160a01b810464ffffffffff90811695830195909552600160c81b900484169281018390526001909101549283166060820152600160281b90920461ffff166080830152610d0d576000610d23565b6040810151610d239064ffffffffff16426124be565b9392505050565b610d32611839565b64ffffffffff8216600090815260986020526040808220805461ffff191661ffff8516179055517f67ce21811d4b1b6ebd4700f856edf2be5aace8686d54c04d4a0d8660be311fa59190a15050565b610d89611839565b610c94611ebe565b610d99611839565b609780546001600160a01b0319166001600160a01b0383169081179091556040519081527f0d340f79ae9dada455c169dcfd2e4b7b9530b2abcc7eef2b829f43b09fbf72039060200160405180910390a150565b610df56115f4565b60008164ffffffffff16118015610e24575064ffffffffff811660009081526098602052604090205461ffff16155b15610e4b57604051630614e35560e41b815264ffffffffff82166004820152602401610848565b61085c338383611893565b600054610100900460ff1615808015610e765750600054600160ff909116105b80610e905750303b158015610e90575060005460ff166001145b610ef35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610848565b6000805460ff191660011790558015610f16576000805461ff0019166101001790555b609780546001600160a01b0319166001600160a01b038416179055610f39611f10565b610f41611f3f565b801561085c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b610f926115f4565b8060005b81811015610c7c57610fc033858584818110610fb457610fb4612463565b90506020020135611bb7565b80610fca8161248f565b915050610f96565b610fda612057565b600082815260996020908152604091829020825160a08101845281546001600160a01b038116825264ffffffffff600160a01b8204811694830194909452600160c81b900483169381019390935260010154908116606083015261ffff600160281b909104166080820152611050908390611a82565b92915050565b6000818152609960209081526040808320815160a08101835281546001600160a01b0381168252600160a01b810464ffffffffff90811695830195909552600160c81b900484169281018390526001909101549283166060820152600160281b90920461ffff166080830152158015906110db57506000816020015164ffffffffff16115b8015611100575042816020015182606001516110f791906124d1565b64ffffffffff16115b1561112b57428160200151826060015161111a91906124d1565b64ffffffffff16610d2391906124be565b50600092915050565b60408051610d698082526201ad40820190925260609160009190602082016201ad20803683370190505090506000808060015b610d69811161121757600081815260996020908152604091829020825160a08101845281546001600160a01b0381168252600160a01b810464ffffffffff90811694830194909452600160c81b900483169381018490526001909101549182166060820152600160281b90910461ffff166080820152901561120e5785516001958601958501948391889190811061120157611201612463565b6020026020010181815250505b50600101611167565b5082156112d7576000915060008367ffffffffffffffff81111561123d5761123d6124a8565b604051908082528060200260200182016040528015611266578160200160208202803683370190505b5090505b845160018301928691811061128157611281612463565b60200260200101518184806001019550815181106112a1576112a1612463565b60200260200101818152505060008583815181106112c1576112c1612463565b60200260200101511161126a5795945050505050565b506060949350505050565b6112ea611839565b8260005b818110156113855783838281811061130857611308612463565b905060200201602081019061131d91906124ef565b6098600088888581811061133357611333612463565b90506020020160208101906113489190612395565b64ffffffffff1681526020810191909152604001600020805461ffff191661ffff929092169190911790558061137d8161248f565b9150506112ee565b506040517f67ce21811d4b1b6ebd4700f856edf2be5aace8686d54c04d4a0d8660be311fa590600090a15050505050565b6113be611839565b6001600160a01b0381166114235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610848565b610ae081611e6c565b611434611839565b610c94611f6e565b60408051610d698082526201ad40820190925260609160009190602082016201ad20803683370190505090506000808060015b610d69811161152757600081815260996020908152604091829020825160a08101845281546001600160a01b03808216808452600160a01b830464ffffffffff90811696850196909652600160c81b9092048516958301959095526001909201549283166060820152600160281b90920461ffff16608083015290918916900361151e5785516001958601958501948391889190811061151157611511612463565b6020026020010181815250505b5060010161146f565b5082156115e8576000915060008367ffffffffffffffff81111561154d5761154d6124a8565b604051908082528060200260200182016040528015611576578160200160208202803683370190505b5090505b845160018301928691811061159157611591612463565b60200260200101518184806001019550815181106115b1576115b1612463565b60200260200101818152505060008583815181106115d1576115d1612463565b60200260200101511161157a579695505050505050565b50606095945050505050565b60335460ff1615610c945760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610848565b600082815260996020526040902080546001600160a01b038581169116146116785760405163b384568f60e01b815260048101849052602401610848565b8054600160c81b900464ffffffffff166116a857604051633ebe422960e01b815260048101849052602401610848565b8054600160a01b900464ffffffffff16158015906116ee57508054600182015442916116e59164ffffffffff600160a01b909204821691166124d1565b64ffffffffff16115b1561170f5760405163dc8fb34160e01b815260048101849052602401610848565b60018101805464ffffffffff42811664ffffffffff198316178084558454918616600160a01b810264ffffffffff60a01b199093169290921785556000918252609860205260409091205461ffff600160281b93849004811694918116939192600592611782928692919091041661250a565b82546101009290920a61ffff81810219909316918316021790915560018401546040805188815264ffffffffff8816602082015285841691810191909152600160281b90910490911660608201527f4e9cdeb85d411171f42e9e9d50dd5033126a7f57115cc90f5369685f90b106c991506080015b60405180910390a16040518481527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050505050565b6065546001600160a01b03163314610c945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610848565b60008281526099602052604090208054600160c81b900464ffffffffff16156118d2576040516328f0990960e11b815260048101849052602401610848565b6001810154815464ffffffffff428116600160c81b027fffff0000000000ffffffffff00000000000000000000000000000000000000009092166001600160a01b0388161791909117835561ffff600160281b90920491909116908316156119b85760018201805464ffffffffff19164264ffffffffff90811691909117808355845464ffffffffff60a01b1916600160a01b9287169283021785556000918252609860205260409091205461ffff908116929160059161199d918591600160281b9091041661250a565b92506101000a81548161ffff021916908361ffff1602179055505b6097546040516323b872dd60e01b81526001600160a01b03878116600483015230602483015260448201879052909116906323b872dd90606401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b50505060018301546040805187815264ffffffffff8716602082015261ffff80861692820192909252600160281b9092041660608201527f241b34d531d323aafa73ea9ae314ce38ead1671066f81051192a5a7264aee68791506080016117f7565b611a8a612057565b611a92612057565b83815282516001600160a01b031660208083019190915260808085015161ffff166040808501919091528501805164ffffffffff90811692850192909252606080870151831660a08601529286018051831693850193909352805182161515610100850152915181161515610120840152905116611b11576000611b27565b6040830151611b279064ffffffffff16426124be565b64ffffffffff90811660c083015260408401511615801590611b5457506000836020015164ffffffffff16115b8015611b7957504283602001518460600151611b7091906124d1565b64ffffffffff16115b15610d23574283602001518460600151611b9391906124d1565b64ffffffffff16611ba491906124be565b64ffffffffff1660e08201529392505050565b600081815260996020526040902080546001600160a01b03848116911614611bf55760405163b384568f60e01b815260048101839052602401610848565b8054600160c81b900464ffffffffff16611c255760405163072a061160e41b815260048101839052602401610848565b8054600160a01b900464ffffffffff1615801590611c6b5750805460018201544291611c629164ffffffffff600160a01b909204821691166124d1565b64ffffffffff16115b15611c8c5760405163dc8fb34160e01b815260048101839052602401610848565b805460018201805464ffffffffff191690556001600160f01b03191681556097546040516323b872dd60e01b81523060048201526001600160a01b03858116602483015260448201859052909116906323b872dd90606401600060405180830381600087803b158015611cfe57600080fd5b505af1158015611d12573d6000803e3d6000fd5b50505050600181015460408051848152600160281b90920461ffff1660208301527fbe6b1dc07b47507be3f3170440318c19f630ffff4ba02f11e90feccd38ec4fc491016108cc565b60008181526099602052604090208054600160c81b900464ffffffffff16611d995760405163072a061160e41b815260048101839052602401610848565b805460018201805464ffffffffff191690556001600160f01b0319811682556097546040516323b872dd60e01b81523060048201526001600160a01b03928316602482018190526044820186905292909116906323b872dd90606401600060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b50505050600182015460408051858152600160281b90920461ffff1660208301527fbe6b1dc07b47507be3f3170440318c19f630ffff4ba02f11e90feccd38ec4fc491016108cc565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ec6611fab565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff16611f375760405162461bcd60e51b815260040161084890612525565b610c94611ff4565b600054610100900460ff16611f665760405162461bcd60e51b815260040161084890612525565b610c94612024565b611f766115f4565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ef33390565b60335460ff16610c945760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610848565b600054610100900460ff1661201b5760405162461bcd60e51b815260040161084890612525565b610c9433611e6c565b600054610100900460ff1661204b5760405162461bcd60e51b815260040161084890612525565b6033805460ff19169055565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b803564ffffffffff811681146120c057600080fd5b919050565b600080604083850312156120d857600080fd5b823591506120e8602084016120ab565b90509250929050565b803561ffff811681146120c057600080fd5b6000806040838503121561211657600080fd5b823591506120e8602084016120f1565b60008083601f84011261213857600080fd5b50813567ffffffffffffffff81111561215057600080fd5b6020830191508360208260051b850101111561216b57600080fd5b9250929050565b60008060006040848603121561218757600080fd5b833567ffffffffffffffff81111561219e57600080fd5b6121aa86828701612126565b90945092506121bd9050602085016120ab565b90509250925092565b6000602082840312156121d857600080fd5b81356001600160a01b0381168114610d2357600080fd5b80518252602081015161220d60208401826001600160a01b03169052565b506040810151612223604084018261ffff169052565b50606081015161223c606084018264ffffffffff169052565b506080810151612255608084018264ffffffffff169052565b5060a081015161226e60a084018264ffffffffff169052565b5060c081015161228760c084018264ffffffffff169052565b5060e08101516122a060e084018264ffffffffff169052565b50610100818101511515908301526101208082015180151582850152610c7c565b6020808252825182820181905260009190848201906040850190845b81811015612304576122f08385516121ef565b9284019261014092909201916001016122dd565b50909695505050505050565b60006020828403121561232257600080fd5b5035919050565b6000806020838503121561233c57600080fd5b823567ffffffffffffffff81111561235357600080fd5b61235f85828601612126565b90969095509350505050565b6000806040838503121561237e57600080fd5b612387836120ab565b91506120e8602084016120f1565b6000602082840312156123a757600080fd5b610d23826120ab565b610140810161105082846121ef565b6020808252825182820181905260009190848201906040850190845b81811015612304578351835292840192918401916001016123db565b6000806000806040858703121561240d57600080fd5b843567ffffffffffffffff8082111561242557600080fd5b61243188838901612126565b9096509450602087013591508082111561244a57600080fd5b5061245787828801612126565b95989497509550505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124a1576124a1612479565b5060010190565b634e487b7160e01b600052604160045260246000fd5b8181038181111561105057611050612479565b64ffffffffff818116838216019080821115610b8f57610b8f612479565b60006020828403121561250157600080fd5b610d23826120f1565b61ffff818116838216019080821115610b8f57610b8f612479565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea26469706673582212207dbb2b7dabbb8629d8fd39f8ad77c8ff259f33a9f770948f4ceea507780f506764736f6c63430008100033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.