More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,234 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Ape Stake | 68798930 | 45 days ago | IN | 0 POL | 0.00135407 | ||||
Ape Stake | 68798828 | 45 days ago | IN | 0 POL | 0.0009447 | ||||
Ape Multi Claim | 66923969 | 92 days ago | IN | 0 POL | 0.0032874 | ||||
Ape Multi Claim | 66564879 | 101 days ago | IN | 0 POL | 0.00361989 | ||||
Operator Unstake | 66543201 | 102 days ago | IN | 0 POL | 0.0086106 | ||||
Operator Unstake | 66543186 | 102 days ago | IN | 0 POL | 0.0086106 | ||||
Operator Unstake | 66543158 | 102 days ago | IN | 0 POL | 0.0090677 | ||||
Operator Unstake | 66543144 | 102 days ago | IN | 0 POL | 0.0081535 | ||||
Operator Unstake | 64744767 | 148 days ago | IN | 0 POL | 0.0081547 | ||||
Operator Unstake | 64744740 | 148 days ago | IN | 0 POL | 0.0086118 | ||||
Operator Unstake | 64744557 | 148 days ago | IN | 0 POL | 0.0090689 | ||||
Operator Unstake | 64462301 | 155 days ago | IN | 0 POL | 0.0086118 | ||||
Operator Unstake | 64462287 | 155 days ago | IN | 0 POL | 0.0086118 | ||||
Operator Unstake | 64462230 | 155 days ago | IN | 0 POL | 0.0090689 | ||||
Ape Multi Claim | 63325269 | 183 days ago | IN | 0 POL | 0.00358171 | ||||
Ape Multi Claim | 62832552 | 195 days ago | IN | 0 POL | 0.00342097 | ||||
Ape Claim | 62162912 | 212 days ago | IN | 0 POL | 0.00285042 | ||||
Ape Claim | 62162175 | 212 days ago | IN | 0 POL | 0.00335437 | ||||
Ape Claim | 62162021 | 212 days ago | IN | 0 POL | 0.00285042 | ||||
Ape Claim | 62162021 | 212 days ago | IN | 0 POL | 0.00283377 | ||||
Ape Claim | 62161777 | 212 days ago | IN | 0 POL | 0.00285042 | ||||
Ape Multi Claim | 60091611 | 264 days ago | IN | 0 POL | 0.00468039 | ||||
Ape Multi Claim | 57959129 | 317 days ago | IN | 0 POL | 0.00460428 | ||||
Ape Multi Claim | 57307625 | 334 days ago | IN | 0 POL | 0.00323304 | ||||
Operator Unstake | 56065346 | 367 days ago | IN | 0 POL | 0.0086106 |
Loading...
Loading
Contract Name:
MadApeStaking
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; import "./IERC721.sol"; import "./SafeMath.sol"; import "./Address.sol"; import "./Ownable.sol"; import "./IERC20.sol"; interface IRarityChecker { function getMultiplierForTokenId(uint256 tokenId) view external returns (uint256); } contract MadApeStaking is Ownable { using Address for address; IERC20 private _rewardToken; IERC721 private _stakeToken; IRarityChecker private _rarityChecker; mapping(address => bool) internal operators; mapping(uint256 => bool) internal _isTokenStakedMapping; mapping(uint256 => address) internal _tokenStakedByMapping; mapping(address => uint256[]) internal _allTokensStakedByAddressMapping; mapping(address => mapping(uint256 => uint256)) internal _ownerStakedTokenTimeSinceLastRewardMapping; bool internal _isActive; uint256 internal _deactivationTime; uint256 internal _baseReward; uint256 internal _rewardInterval; /** * @dev Emitted when the reward token has changed. */ event RewardTokenChanged(address previousToken, address newToken); /** * @dev Emitted when the rarity checker has changed. */ event RarityCheckerChanged(address previousChecker, address newChecker); /** * @dev Emitted when the base reward has changed. */ event BaseRewardChanged(uint256 previousBaseReward, uint256 newBaseReward); /** * @dev Emitted when the reward interval has changed. */ event RewardIntervalChanged(uint256 previousRewardInterval, uint256 newRewardInterval); /** * @dev Emitted when the stake token has changed. */ event StakeTokenChanged(address previousToken, address newToken); /** * @dev Emitted when the isActive has changed. */ event IsActiveChanged(bool previousState, bool newState); /** * @dev Emitted when the token has been staked. */ event TokenIdStaked(address owner, uint256 tokenId); /** * @dev Emitted when the token has been unstaked. */ event TokenIdUnstaked(address owner, uint256 tokenId); /** * @dev Emitted when the owner of the token has changed. */ event UnstakedByOperator(address oldOwner, address newOwner, uint256 tokenId, uint256 timestamp); /** * @dev Emitted when the rewards have been claimed. */ event RewardClaimed(uint256 tokenId, uint256 rewards); /** * @dev Emitted when operator is added. */ event OperatorAdded(address operator); /** * @dev Emitted when operator is removed. */ event OperatorRemoved(address operator); constructor(address _rewardTokenAddress, address _stakeTokenAddress, address _rarityCheckerAddress){ changeRewardToken(_rewardTokenAddress); changeStakeToken(_stakeTokenAddress); changeRarityChecker(_rarityCheckerAddress); changeBaseReward(1 ether); changeRewardInterval(86400); changeIsActive(true); } // =========== MODIFIERS METHODS ========== /** * @dev Throws if called by any account other than an operator. */ modifier onlyOperator() { require(operators[_msgSender()], "MadApeStaking: caller is not an operator"); _; } // =========== MODIFIERS METHODS ========== // =========== APE METHODS ================ function apeMultiStake(uint256[] memory tokenIds) public returns (bool){ for (uint256 i = 0; i < tokenIds.length; i++) { apeStake(tokenIds[i]); } return true; } function apeStake(uint256 tokenId) public returns (bool){ require(getIsActive(), "MadApeStaking: Staking is currently not active"); require(_stakeToken.ownerOf(tokenId) == _msgSender(), "MadApeStaking: Message sender not currently the owner of this token"); require(!_isTokenStakedMapping[tokenId], "MadApeStaking: Token already staked"); _isTokenStakedMapping[tokenId] = true; _tokenStakedByMapping[tokenId] = _msgSender(); _ownerStakedTokenTimeSinceLastRewardMapping[_msgSender()][tokenId] = block.timestamp; _allTokensStakedByAddressMapping[_msgSender()].push(tokenId); emit TokenIdStaked(_msgSender(), tokenId); return true; } function apeUnstake(uint256 tokenId) public returns (bool){ require(_stakeToken.ownerOf(tokenId) == _msgSender(), "MadApeStaking: Message sender not currently the owner of this token"); return _unstake(_msgSender(), tokenId); } function apeMultiClaim(uint256[] memory tokenIds) public returns (bool){ for (uint256 i = 0; i < tokenIds.length; i++) { apeClaim(tokenIds[i]); } return true; } function apeClaim(uint256 tokenId) public returns (uint256) { require(_stakeToken.ownerOf(tokenId) == _msgSender(), "MadApeStaking: Message sender not currently the owner of this token"); uint256 reward = _claimReward(_msgSender(), tokenId); require(reward > 0, "MadApeStaking: There is no reward to be claimed"); return reward; } function apeIsStaked(uint256 tokenId) public view returns (bool) { return _isTokenStakedMapping[tokenId]; } function apeCheckBalance(uint256 tokenId) public view returns (uint256) { address owner = _tokenStakedByMapping[tokenId]; return _calculateReward(owner, tokenId); } function apeCheckBalanceOf(address owner, uint256 tokenId) public view returns (uint256) { return _calculateReward(owner, tokenId); } function apeAllStakedForWallet(address owner) public view returns (uint256[] memory){ return _allTokensStakedByAddressMapping[owner]; } // =========== APE METHODS ================ // =========== OPERATOR METHODS =========== function operatorUnstake(address oldOwner, address newOwner, uint256 tokenId) public onlyOperator { _unstake(oldOwner, tokenId); emit UnstakedByOperator(oldOwner, newOwner, tokenId, block.timestamp); } // =========== OPERATOR METHODS =========== // =========== PUBLIC METHODS ============= /** * @dev Returns accrued rewards so far. */ function getAccruedRewards(address owner, uint256 tokenId) public view returns (uint256 rewardTokens){ return _calculateReward(owner, tokenId); } /** * @dev Returns address of staker. */ function getStakerAddress(uint256 tokenId) public view returns (address){ return _tokenStakedByMapping[tokenId]; } /** * @dev Returns boolean if given address is an operator. */ function isOperator(address operator) public view returns (bool){ return operators[operator]; } // =========== PUBLIC METHODS ============= // =========== INTERNAL METHODS =========== function _unstake(address owner, uint256 tokenId) internal returns (bool){ require(_isTokenStakedMapping[tokenId], "MadApeStaking: Token not currently staked"); _claimReward(owner, tokenId); _isTokenStakedMapping[tokenId] = false; _tokenStakedByMapping[tokenId] = address(0); uint256[] storage tokens = _allTokensStakedByAddressMapping[owner]; for (uint256 i = 0; i < tokens.length; i++) { if (tokenId != tokens[i]) continue; tokens[i] = tokens[tokens.length - 1]; tokens.pop(); } _allTokensStakedByAddressMapping[owner] = tokens; emit TokenIdUnstaked(owner, tokenId); return true; } function _claimReward(address owner, uint256 tokenId) internal returns (uint256 reward){ reward = _calculateReward(owner, tokenId); _ownerStakedTokenTimeSinceLastRewardMapping[owner][tokenId] = block.timestamp; _rewardToken.transfer(owner, reward); emit RewardClaimed(tokenId, reward); } function _calculateReward(address owner, uint256 tokenId) internal view returns (uint256 rewardTokens){ if (!apeIsStaked(tokenId)) { return 0; } uint256 timeStakingSinceLastRewardInSeconds; if (!getIsActive()) { timeStakingSinceLastRewardInSeconds = SafeMath.sub(_deactivationTime, _ownerStakedTokenTimeSinceLastRewardMapping[owner][tokenId]); } else { timeStakingSinceLastRewardInSeconds = SafeMath.sub(block.timestamp, _ownerStakedTokenTimeSinceLastRewardMapping[owner][tokenId]); } uint256 daysStaking = SafeMath.div(timeStakingSinceLastRewardInSeconds, getRewardInterval()); if (daysStaking == 0) { return 0; } //Multiplier returns as a multiple of 100; 1.25 multiplier would be represented as 125. uint256 rarityMultiplier = _rarityChecker.getMultiplierForTokenId(tokenId); uint256 baseReward = getBaseReward(); uint256 baseRewardMultipliedByDays = SafeMath.mul(baseReward, daysStaking); uint256 rewardMultipliedByRarity = SafeMath.mul(baseRewardMultipliedByDays, rarityMultiplier); uint256 normalisedReward = SafeMath.div(rewardMultipliedByRarity, 100); return normalisedReward; } // =========== INTERNAL METHODS =========== // =========== GETTERS/SETTERS ============ /** * @dev Changes the rarity checker. * * Emits an {RarityCheckerChanged} event. */ function changeRarityChecker(address newRarityChecker) public onlyOwner { emit RarityCheckerChanged(getRarityChecker(), newRarityChecker); setRarityChecker(newRarityChecker); } /** * @dev Stores a new address for rarity checker. */ function setRarityChecker(address newRarityChecker) internal { _rarityChecker = IRarityChecker(newRarityChecker); } /** * @dev Returns current rarity checker. */ function getRarityChecker() public view returns (address) { return address(_rarityChecker); } /** * @dev Changes the base reward. * * Emits an {BaseRewardChanged} event. */ function changeBaseReward(uint256 newBaseReward) public onlyOwner { emit BaseRewardChanged(getBaseReward(), newBaseReward); setBaseReward(newBaseReward); } /** * @dev Stores a new value for base reward. */ function setBaseReward(uint256 newBaseReward) internal { _baseReward = newBaseReward; } /** * @dev Returns current base reward. */ function getBaseReward() public view returns (uint256) { return _baseReward; } /** * @dev Changes the reward interval. * * Emits an {RewardIntervalChanged} event. */ function changeRewardInterval(uint256 newRewardInterval) public onlyOwner { emit RewardIntervalChanged(getRewardInterval(), newRewardInterval); setRewardInterval(newRewardInterval); } /** * @dev Stores a new value for reward interval. */ function setRewardInterval(uint256 newRewardInterval) internal { _rewardInterval = newRewardInterval; } /** * @dev Returns current reward interval. */ function getRewardInterval() public view returns (uint256) { return _rewardInterval; } /** * @dev Changes the reward token. * * Emits an {RewardTokenChanged} event. */ function changeRewardToken(address newRewardToken) public onlyOwner { emit RewardTokenChanged(getRewardToken(), newRewardToken); setRewardToken(newRewardToken); } /** * @dev Stores a new address for reward token. */ function setRewardToken(address newRewardToken) internal { _rewardToken = IERC20(newRewardToken); } /** * @dev Returns current reward token. */ function getRewardToken() public view returns (address) { return address(_rewardToken); } /** * @dev Changes the stake token. * * Emits an {StakeTokenChanged} event. */ function changeStakeToken(address newStakeToken) public onlyOwner { emit StakeTokenChanged(getStakeToken(), newStakeToken); setStakeToken(newStakeToken); } /** * @dev Stores a new address for stake token. */ function setStakeToken(address newStakeToken) internal { _stakeToken = IERC721(newStakeToken); } /** * @dev Returns current stake token. */ function getStakeToken() public view returns (address) { return address(_stakeToken); } /** * @dev Changes isActive state. * * Emits an {ActiveStateChanged} event. */ function changeIsActive(bool isActive) public onlyOwner { emit IsActiveChanged(getIsActive(), isActive); setIsActive(isActive); } /** * @dev Sets isActive. */ function setIsActive(bool isActive) internal { _isActive = isActive; if (!isActive) { _deactivationTime = block.timestamp; } } /** * @dev Returns isActive. */ function getIsActive() public view returns (bool) { return _isActive; } // =========== GETTERS/SETTERS ============ // =========== ADMIN METHODS ============== /** * @dev Add address as operator. * Can only be called by the current owner. */ function setOperator(address operator) public onlyOwner { operators[operator] = true; emit OperatorAdded(operator); } /** * @dev Remove operator. * Can only be called by the current owner. */ function removeOperator(address operator) public onlyOwner { operators[operator] = false; emit OperatorRemoved(operator); } /** * @dev Method to withdraw all native currency. Only callable by owner. */ function withdraw() public onlyOwner { (bool success,) = payable(msg.sender).call{value : address(this).balance}(""); require(success); } /** * @dev Method to withdraw all tokens complying to ERC20 interface. Only callable by owner. */ function withdrawERC20(address _token) public onlyOwner { IERC20 token = IERC20(_token); require(token.balanceOf(address(this)) > 0, "SafeERC20: Balance already 0"); bytes memory data = abi.encodeWithSelector(token.transfer.selector, owner(), token.balanceOf(address(this))); bytes memory return_data = address(_token).functionCall(data, "SafeERC20: low-level call failed"); if (return_data.length > 0) { // Return data is optional to support crappy tokens like BNB and others not complying to ERC20 interface require(abi.decode(return_data, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } // =========== ADMIN METHODS ============== }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 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; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { // === Public === function transfer(address to, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); function increaseAllowance(address spender,uint256 addedValue) external returns (bool); function decreaseAllowance(address spender,uint256 subtractedValue) external returns (bool); function transferFrom(address from, address to, uint256 amount) external returns (bool); function mint(address to, uint256 value) external returns (bool); function burn(uint256 amount) external returns (bool); // === Views === function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); // === Events === event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_rewardTokenAddress","type":"address"},{"internalType":"address","name":"_stakeTokenAddress","type":"address"},{"internalType":"address","name":"_rarityCheckerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousBaseReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBaseReward","type":"uint256"}],"name":"BaseRewardChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"previousState","type":"bool"},{"indexed":false,"internalType":"bool","name":"newState","type":"bool"}],"name":"IsActiveChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorRemoved","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":"previousChecker","type":"address"},{"indexed":false,"internalType":"address","name":"newChecker","type":"address"}],"name":"RarityCheckerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousRewardInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardInterval","type":"uint256"}],"name":"RewardIntervalChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"RewardTokenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"StakeTokenChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenIdStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenIdUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"UnstakedByOperator","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"apeAllStakedForWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"apeCheckBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"apeCheckBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"apeClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"apeIsStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"apeMultiClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"apeMultiStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"apeStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"apeUnstake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBaseReward","type":"uint256"}],"name":"changeBaseReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"changeIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRarityChecker","type":"address"}],"name":"changeRarityChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardInterval","type":"uint256"}],"name":"changeRewardInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardToken","type":"address"}],"name":"changeRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newStakeToken","type":"address"}],"name":"changeStakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAccruedRewards","outputs":[{"internalType":"uint256","name":"rewardTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRarityChecker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"operatorUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200234a3803806200234a83398101604081905262000034916200052e565b6200003f3362000096565b6200004a83620000e6565b6200005582620001ae565b62000060816200026f565b62000073670de0b6b3a764000062000330565b6200008162015180620003c7565b6200008d60016200045e565b50505062000578565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620001355760405162461bcd60e51b815260206004820181905260248201526000805160206200232a83398151915260448201526064015b60405180910390fd5b7fab27a2419bd7a3bc605bff66b38aacb84061d9e20edab7f7680ce52e6fcd9256620001696001546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600180546001600160a01b0383166001600160a01b031990911617905550565b50565b6000546001600160a01b03163314620001f95760405162461bcd60e51b815260206004820181905260248201526000805160206200232a83398151915260448201526064016200012c565b7f3792de2485bcc1adb436c37819f81339378f5ec98f5b3534f7b71b70b5d31c036200022d6002546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600280546001600160a01b0383166001600160a01b031990911617905550565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820181905260248201526000805160206200232a83398151915260448201526064016200012c565b7fcf972a3f7f0e3c574c8503dd09cff2b9ad45e84e7f2145588f3649910b35dd76620002ee6003546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600380546001600160a01b0383166001600160a01b031990911617905550565b6000546001600160a01b031633146200037b5760405162461bcd60e51b815260206004820181905260248201526000805160206200232a83398151915260448201526064016200012c565b7fc472be492e18aef50a39f3dd4f6a4df469d951131f9bfef696cff0118e0aaf90620003a6600b5490565b60408051918252602082018490520160405180910390a1620001ab81600b55565b6000546001600160a01b03163314620004125760405162461bcd60e51b815260206004820181905260248201526000805160206200232a83398151915260448201526064016200012c565b7ffdfb968fcc723a2acf93a0a1e6f3f1b5b0ff4b71b0cdff62fee193f8a5be154a6200043d600c5490565b60408051918252602082018490520160405180910390a1620001ab81600c55565b6000546001600160a01b03163314620004a95760405162461bcd60e51b815260206004820181905260248201526000805160206200232a83398151915260448201526064016200012c565b7f73479bfb4be291f56bce7024253ff86f610bd9cc1daada7aa7c0c906f1c1ae32620004d760095460ff1690565b60408051911515825283151560208301520160405180910390a1620001ab816009805460ff191682151517905580620001ab5742600a5550565b80516001600160a01b03811681146200052957600080fd5b919050565b6000806000606084860312156200054457600080fd5b6200054f8462000511565b92506200055f6020850162000511565b91506200056f6040850162000511565b90509250925092565b611da280620005886000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063902827f01161010f578063c40a2b00116100a2578063e226957211610071578063e226957214610447578063f2fde38b1461045a578063f4f3b2001461046d578063fba7cc791461048057600080fd5b8063c40a2b00146103fb578063cb6b66691461040e578063ccd18c2d14610421578063d7d135ef1461043457600080fd5b8063ac8a584a116100de578063ac8a584a146103bc578063ade9cc0d146103cf578063b3ab15fb146103e0578063b98e652a146103f357600080fd5b8063902827f01461038e57806396b747b2146103965780639b04760e1461034a5780639dfb8ca6146103a957600080fd5b806361ea239211610187578063715018a611610156578063715018a6146103425780637fa825431461034a5780638889caeb1461035d5780638da5cb5b1461037d57600080fd5b806361ea2392146102c957806362a82d7d146102dc57806369940d79146103055780636d70f7ae1461031657600080fd5b80633ccfd60b116101c35780633ccfd60b14610268578063498bba0214610270578063500a15641461029157806358d18c52146102b657600080fd5b8063088ab8ce146101f55780630e0e856f1461020a5780631c8092e11461021d57806339f0a17014610230575b600080fd5b610208610203366004611965565b61048b565b005b610208610218366004611965565b610534565b61020861022b366004611982565b6105d1565b61025361023e3660046119c3565b60009081526005602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102086106a2565b61028361027e3660046119c3565b610721565b60405190815260200161025f565b6002546001600160a01b03165b6040516001600160a01b03909116815260200161025f565b6102086102c43660046119ea565b610837565b6102086102d73660046119c3565b6108b1565b61029e6102ea3660046119c3565b6000908152600660205260409020546001600160a01b031690565b6001546001600160a01b031661029e565b610253610324366004611965565b6001600160a01b031660009081526004602052604090205460ff1690565b610208610925565b610283610358366004611a07565b61095b565b61037061036b366004611965565b61096e565b60405161025f9190611a33565b6000546001600160a01b031661029e565b600c54610283565b6102086103a4366004611965565b6109da565b6102536103b7366004611a8d565b610a77565b6102086103ca366004611965565b610ac2565b6003546001600160a01b031661029e565b6102086103ee366004611965565b610b44565b600b54610283565b6102536104093660046119c3565b610bc2565b61025361041c3660046119c3565b610c66565b61025361042f366004611a8d565b610e9e565b6102086104423660046119c3565b610ee0565b6102836104553660046119c3565b610f54565b610208610468366004611965565b610f76565b61020861047b366004611965565b61100e565b60095460ff16610253565b6000546001600160a01b031633146104be5760405162461bcd60e51b81526004016104b590611b4b565b60405180910390fd5b7fab27a2419bd7a3bc605bff66b38aacb84061d9e20edab7f7680ce52e6fcd92566104f16001546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600180546001600160a01b0319166001600160a01b03831617905550565b50565b6000546001600160a01b0316331461055e5760405162461bcd60e51b81526004016104b590611b4b565b7fcf972a3f7f0e3c574c8503dd09cff2b9ad45e84e7f2145588f3649910b35dd766105916003546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600380546001600160a01b0319166001600160a01b03831617905550565b3360009081526004602052604090205460ff166106415760405162461bcd60e51b815260206004820152602860248201527f4d61644170655374616b696e673a2063616c6c6572206973206e6f7420616e2060448201526737b832b930ba37b960c11b60648201526084016104b5565b61064b838261129e565b50604080516001600160a01b038086168252841660208201529081018290524260608201527f57907c45b245caa1f87028d231ed1bc50edf9dd5b2aa80f3ea4762a4ad591ca89060800160405180910390a1505050565b6000546001600160a01b031633146106cc5760405162461bcd60e51b81526004016104b590611b4b565b604051600090339047908381818185875af1925050503d806000811461070e576040519150601f19603f3d011682016040523d82523d6000602084013e610713565b606091505b505090508061053157600080fd5b6000336002546040516331a9108f60e11b8152600481018590526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107959190611b80565b6001600160a01b0316146107bb5760405162461bcd60e51b81526004016104b590611b9d565b60006107c73384611485565b9050600081116108315760405162461bcd60e51b815260206004820152602f60248201527f4d61644170655374616b696e673a205468657265206973206e6f20726577617260448201526e19081d1bc818994818db185a5b5959608a1b60648201526084016104b5565b92915050565b6000546001600160a01b031633146108615760405162461bcd60e51b81526004016104b590611b4b565b7f73479bfb4be291f56bce7024253ff86f610bd9cc1daada7aa7c0c906f1c1ae3261088e60095460ff1690565b60408051911515825283151560208301520160405180910390a16105318161156a565b6000546001600160a01b031633146108db5760405162461bcd60e51b81526004016104b590611b4b565b7ffdfb968fcc723a2acf93a0a1e6f3f1b5b0ff4b71b0cdff62fee193f8a5be154a610905600c5490565b60408051918252602082018490520160405180910390a161053181600c55565b6000546001600160a01b0316331461094f5760405162461bcd60e51b81526004016104b590611b4b565b6109596000611584565b565b600061096783836115d4565b9392505050565b6001600160a01b0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156109ce57602002820191906000526020600020905b8154815260200190600101908083116109ba575b50505050509050919050565b6000546001600160a01b03163314610a045760405162461bcd60e51b81526004016104b590611b4b565b7f3792de2485bcc1adb436c37819f81339378f5ec98f5b3534f7b71b70b5d31c03610a376002546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600280546001600160a01b0319166001600160a01b03831617905550565b6000805b8251811015610ab957610aa6838281518110610a9957610a99611c06565b6020026020010151610c66565b5080610ab181611c32565b915050610a7b565b50600192915050565b6000546001600160a01b03163314610aec5760405162461bcd60e51b81526004016104b590611b4b565b6001600160a01b038116600081815260046020908152604091829020805460ff1916905590519182527f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d91015b60405180910390a150565b6000546001600160a01b03163314610b6e5760405162461bcd60e51b81526004016104b590611b4b565b6001600160a01b038116600081815260046020908152604091829020805460ff1916600117905590519182527fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d9101610b39565b6000336002546040516331a9108f60e11b8152600481018590526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c369190611b80565b6001600160a01b031614610c5c5760405162461bcd60e51b81526004016104b590611b9d565b610831338361129e565b6000610c7460095460ff1690565b610cd75760405162461bcd60e51b815260206004820152602e60248201527f4d61644170655374616b696e673a205374616b696e672069732063757272656e60448201526d746c79206e6f742061637469766560901b60648201526084016104b5565b336002546040516331a9108f60e11b8152600481018590526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190611b80565b6001600160a01b031614610d6f5760405162461bcd60e51b81526004016104b590611b9d565b60008281526005602052604090205460ff1615610dda5760405162461bcd60e51b815260206004820152602360248201527f4d61644170655374616b696e673a20546f6b656e20616c7265616479207374616044820152621ad95960ea1b60648201526084016104b5565b6000828152600560205260409020805460ff19166001179055610dfa3390565b600083815260066020908152604080832080546001600160a01b0319166001600160a01b03959095169490941790935533808352600882528383208684528252838320429055808352600782528383208054600181018255908452928290209092018590558251918252810184905281517f4fd04ff1eb1752764eee0cc827b9b53e4794aea6c78599d6b74778a9503a8475929181900390910190a1506001919050565b6000805b8251811015610ab957610ecd838281518110610ec057610ec0611c06565b6020026020010151610721565b5080610ed881611c32565b915050610ea2565b6000546001600160a01b03163314610f0a5760405162461bcd60e51b81526004016104b590611b4b565b7fc472be492e18aef50a39f3dd4f6a4df469d951131f9bfef696cff0118e0aaf90610f34600b5490565b60408051918252602082018490520160405180910390a161053181600b55565b6000818152600660205260408120546001600160a01b031661096781846115d4565b6000546001600160a01b03163314610fa05760405162461bcd60e51b81526004016104b590611b4b565b6001600160a01b0381166110055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b5565b61053181611584565b6000546001600160a01b031633146110385760405162461bcd60e51b81526004016104b590611b4b565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611081573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a59190611c4d565b116110f25760405162461bcd60e51b815260206004820152601c60248201527f5361666545524332303a2042616c616e636520616c726561647920300000000060448201526064016104b5565b600063a9059cbb60e01b61110e6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611152573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111769190611c4d565b6040516001600160a01b0390921660248301526044820152606401604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600061121b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250866001600160a01b03166117469092919063ffffffff16565b80519091501561129857808060200190518101906112399190611c66565b6112985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104b5565b50505050565b60008181526005602052604081205460ff1661130e5760405162461bcd60e51b815260206004820152602960248201527f4d61644170655374616b696e673a20546f6b656e206e6f742063757272656e746044820152681b1e481cdd185ad95960ba1b60648201526084016104b5565b6113188383611485565b506000828152600560209081526040808320805460ff191690556006825280832080546001600160a01b03191690556001600160a01b038616835260079091528120905b81548110156114115781818154811061137757611377611c06565b9060005260206000200154841461138d576113ff565b8154829061139d90600190611c83565b815481106113ad576113ad611c06565b90600052602060002001548282815481106113ca576113ca611c06565b9060005260206000200181905550818054806113e8576113e8611c9a565b600190038181906000526020600020016000905590555b8061140981611c32565b91505061135c565b506001600160a01b03841660009081526007602052604090208154611438919083906118eb565b50604080516001600160a01b0386168152602081018590527f4f50549a240e0e0e2a52e116a7ac318dd9b7943257c3f8c77fbe1d26ba8685b1910160405180910390a15060019392505050565b600061149183836115d4565b6001600160a01b03848116600081815260086020908152604080832088845290915290819020429055600154905163a9059cbb60e01b815260048101929092526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190611c66565b5060408051838152602081018390527f47b0878030426a9511b1cd915a0ac34bd29f33d4f846616b55847303ff8ebcbe910160405180910390a192915050565b6009805460ff1916821515179055806105315742600a5550565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526005602052604081205460ff166115f257506000610831565b600061160060095460ff1690565b61163c57600a546001600160a01b0385166000908152600860209081526040808320878452909152902054611635919061175d565b905061166e565b6001600160a01b038416600090815260086020908152604080832086845290915290205461166b90429061175d565b90505b60006116828261167d600c5490565b611769565b90508061169457600092505050610831565b6003546040516252d6f560e01b8152600481018690526000916001600160a01b0316906252d6f590602401602060405180830381865afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117009190611c4d565b9050600061170d600b5490565b9050600061171b8285611775565b905060006117298285611775565b90506000611738826064611769565b9a9950505050505050505050565b60606117558484600085611781565b949350505050565b60006109678284611c83565b60006109678284611cb0565b60006109678284611cd2565b6060824710156117e25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104b5565b6001600160a01b0385163b6118395760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104b5565b600080866001600160a01b031685876040516118559190611d1d565b60006040518083038185875af1925050503d8060008114611892576040519150601f19603f3d011682016040523d82523d6000602084013e611897565b606091505b50915091506118a78282866118b2565b979650505050505050565b606083156118c1575081610967565b8251156118d15782518084602001fd5b8160405162461bcd60e51b81526004016104b59190611d39565b82805482825590600052602060002090810192821561192b5760005260206000209182015b8281111561192b578254825591600101919060010190611910565b5061193792915061193b565b5090565b5b80821115611937576000815560010161193c565b6001600160a01b038116811461053157600080fd5b60006020828403121561197757600080fd5b813561096781611950565b60008060006060848603121561199757600080fd5b83356119a281611950565b925060208401356119b281611950565b929592945050506040919091013590565b6000602082840312156119d557600080fd5b5035919050565b801515811461053157600080fd5b6000602082840312156119fc57600080fd5b8135610967816119dc565b60008060408385031215611a1a57600080fd5b8235611a2581611950565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015611a6b57835183529284019291840191600101611a4f565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215611aa057600080fd5b823567ffffffffffffffff80821115611ab857600080fd5b818501915085601f830112611acc57600080fd5b813581811115611ade57611ade611a77565b8060051b604051601f19603f83011681018181108582111715611b0357611b03611a77565b604052918252848201925083810185019188831115611b2157600080fd5b938501935b82851015611b3f57843584529385019392850192611b26565b98975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611b9257600080fd5b815161096781611950565b60208082526043908201527f4d61644170655374616b696e673a204d6573736167652073656e646572206e6f60408201527f742063757272656e746c7920746865206f776e6572206f66207468697320746f60608201526235b2b760e91b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611c4657611c46611c1c565b5060010190565b600060208284031215611c5f57600080fd5b5051919050565b600060208284031215611c7857600080fd5b8151610967816119dc565b600082821015611c9557611c95611c1c565b500390565b634e487b7160e01b600052603160045260246000fd5b600082611ccd57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611cec57611cec611c1c565b500290565b60005b83811015611d0c578181015183820152602001611cf4565b838111156112985750506000910152565b60008251611d2f818460208701611cf1565b9190910192915050565b6020815260008251806020840152611d58816040850160208701611cf1565b601f01601f1916919091016040019291505056fea2646970667358221220b75f5889912e9013b36e295f7306da935de3f99ff87890948a6b215287b9be5764736f6c634300080a00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000031e480d9ec9fd36f5faff6c9f4875772d8b0e62100000000000000000000000042a668e82c80f38bf706fbc3f11650cd0103964e000000000000000000000000176ed991aa63b35497a5075b648fcbcbb9836c97
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063902827f01161010f578063c40a2b00116100a2578063e226957211610071578063e226957214610447578063f2fde38b1461045a578063f4f3b2001461046d578063fba7cc791461048057600080fd5b8063c40a2b00146103fb578063cb6b66691461040e578063ccd18c2d14610421578063d7d135ef1461043457600080fd5b8063ac8a584a116100de578063ac8a584a146103bc578063ade9cc0d146103cf578063b3ab15fb146103e0578063b98e652a146103f357600080fd5b8063902827f01461038e57806396b747b2146103965780639b04760e1461034a5780639dfb8ca6146103a957600080fd5b806361ea239211610187578063715018a611610156578063715018a6146103425780637fa825431461034a5780638889caeb1461035d5780638da5cb5b1461037d57600080fd5b806361ea2392146102c957806362a82d7d146102dc57806369940d79146103055780636d70f7ae1461031657600080fd5b80633ccfd60b116101c35780633ccfd60b14610268578063498bba0214610270578063500a15641461029157806358d18c52146102b657600080fd5b8063088ab8ce146101f55780630e0e856f1461020a5780631c8092e11461021d57806339f0a17014610230575b600080fd5b610208610203366004611965565b61048b565b005b610208610218366004611965565b610534565b61020861022b366004611982565b6105d1565b61025361023e3660046119c3565b60009081526005602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102086106a2565b61028361027e3660046119c3565b610721565b60405190815260200161025f565b6002546001600160a01b03165b6040516001600160a01b03909116815260200161025f565b6102086102c43660046119ea565b610837565b6102086102d73660046119c3565b6108b1565b61029e6102ea3660046119c3565b6000908152600660205260409020546001600160a01b031690565b6001546001600160a01b031661029e565b610253610324366004611965565b6001600160a01b031660009081526004602052604090205460ff1690565b610208610925565b610283610358366004611a07565b61095b565b61037061036b366004611965565b61096e565b60405161025f9190611a33565b6000546001600160a01b031661029e565b600c54610283565b6102086103a4366004611965565b6109da565b6102536103b7366004611a8d565b610a77565b6102086103ca366004611965565b610ac2565b6003546001600160a01b031661029e565b6102086103ee366004611965565b610b44565b600b54610283565b6102536104093660046119c3565b610bc2565b61025361041c3660046119c3565b610c66565b61025361042f366004611a8d565b610e9e565b6102086104423660046119c3565b610ee0565b6102836104553660046119c3565b610f54565b610208610468366004611965565b610f76565b61020861047b366004611965565b61100e565b60095460ff16610253565b6000546001600160a01b031633146104be5760405162461bcd60e51b81526004016104b590611b4b565b60405180910390fd5b7fab27a2419bd7a3bc605bff66b38aacb84061d9e20edab7f7680ce52e6fcd92566104f16001546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600180546001600160a01b0319166001600160a01b03831617905550565b50565b6000546001600160a01b0316331461055e5760405162461bcd60e51b81526004016104b590611b4b565b7fcf972a3f7f0e3c574c8503dd09cff2b9ad45e84e7f2145588f3649910b35dd766105916003546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600380546001600160a01b0319166001600160a01b03831617905550565b3360009081526004602052604090205460ff166106415760405162461bcd60e51b815260206004820152602860248201527f4d61644170655374616b696e673a2063616c6c6572206973206e6f7420616e2060448201526737b832b930ba37b960c11b60648201526084016104b5565b61064b838261129e565b50604080516001600160a01b038086168252841660208201529081018290524260608201527f57907c45b245caa1f87028d231ed1bc50edf9dd5b2aa80f3ea4762a4ad591ca89060800160405180910390a1505050565b6000546001600160a01b031633146106cc5760405162461bcd60e51b81526004016104b590611b4b565b604051600090339047908381818185875af1925050503d806000811461070e576040519150601f19603f3d011682016040523d82523d6000602084013e610713565b606091505b505090508061053157600080fd5b6000336002546040516331a9108f60e11b8152600481018590526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107959190611b80565b6001600160a01b0316146107bb5760405162461bcd60e51b81526004016104b590611b9d565b60006107c73384611485565b9050600081116108315760405162461bcd60e51b815260206004820152602f60248201527f4d61644170655374616b696e673a205468657265206973206e6f20726577617260448201526e19081d1bc818994818db185a5b5959608a1b60648201526084016104b5565b92915050565b6000546001600160a01b031633146108615760405162461bcd60e51b81526004016104b590611b4b565b7f73479bfb4be291f56bce7024253ff86f610bd9cc1daada7aa7c0c906f1c1ae3261088e60095460ff1690565b60408051911515825283151560208301520160405180910390a16105318161156a565b6000546001600160a01b031633146108db5760405162461bcd60e51b81526004016104b590611b4b565b7ffdfb968fcc723a2acf93a0a1e6f3f1b5b0ff4b71b0cdff62fee193f8a5be154a610905600c5490565b60408051918252602082018490520160405180910390a161053181600c55565b6000546001600160a01b0316331461094f5760405162461bcd60e51b81526004016104b590611b4b565b6109596000611584565b565b600061096783836115d4565b9392505050565b6001600160a01b0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156109ce57602002820191906000526020600020905b8154815260200190600101908083116109ba575b50505050509050919050565b6000546001600160a01b03163314610a045760405162461bcd60e51b81526004016104b590611b4b565b7f3792de2485bcc1adb436c37819f81339378f5ec98f5b3534f7b71b70b5d31c03610a376002546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1600280546001600160a01b0319166001600160a01b03831617905550565b6000805b8251811015610ab957610aa6838281518110610a9957610a99611c06565b6020026020010151610c66565b5080610ab181611c32565b915050610a7b565b50600192915050565b6000546001600160a01b03163314610aec5760405162461bcd60e51b81526004016104b590611b4b565b6001600160a01b038116600081815260046020908152604091829020805460ff1916905590519182527f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d91015b60405180910390a150565b6000546001600160a01b03163314610b6e5760405162461bcd60e51b81526004016104b590611b4b565b6001600160a01b038116600081815260046020908152604091829020805460ff1916600117905590519182527fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d9101610b39565b6000336002546040516331a9108f60e11b8152600481018590526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c369190611b80565b6001600160a01b031614610c5c5760405162461bcd60e51b81526004016104b590611b9d565b610831338361129e565b6000610c7460095460ff1690565b610cd75760405162461bcd60e51b815260206004820152602e60248201527f4d61644170655374616b696e673a205374616b696e672069732063757272656e60448201526d746c79206e6f742061637469766560901b60648201526084016104b5565b336002546040516331a9108f60e11b8152600481018590526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190611b80565b6001600160a01b031614610d6f5760405162461bcd60e51b81526004016104b590611b9d565b60008281526005602052604090205460ff1615610dda5760405162461bcd60e51b815260206004820152602360248201527f4d61644170655374616b696e673a20546f6b656e20616c7265616479207374616044820152621ad95960ea1b60648201526084016104b5565b6000828152600560205260409020805460ff19166001179055610dfa3390565b600083815260066020908152604080832080546001600160a01b0319166001600160a01b03959095169490941790935533808352600882528383208684528252838320429055808352600782528383208054600181018255908452928290209092018590558251918252810184905281517f4fd04ff1eb1752764eee0cc827b9b53e4794aea6c78599d6b74778a9503a8475929181900390910190a1506001919050565b6000805b8251811015610ab957610ecd838281518110610ec057610ec0611c06565b6020026020010151610721565b5080610ed881611c32565b915050610ea2565b6000546001600160a01b03163314610f0a5760405162461bcd60e51b81526004016104b590611b4b565b7fc472be492e18aef50a39f3dd4f6a4df469d951131f9bfef696cff0118e0aaf90610f34600b5490565b60408051918252602082018490520160405180910390a161053181600b55565b6000818152600660205260408120546001600160a01b031661096781846115d4565b6000546001600160a01b03163314610fa05760405162461bcd60e51b81526004016104b590611b4b565b6001600160a01b0381166110055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104b5565b61053181611584565b6000546001600160a01b031633146110385760405162461bcd60e51b81526004016104b590611b4b565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611081573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a59190611c4d565b116110f25760405162461bcd60e51b815260206004820152601c60248201527f5361666545524332303a2042616c616e636520616c726561647920300000000060448201526064016104b5565b600063a9059cbb60e01b61110e6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611152573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111769190611c4d565b6040516001600160a01b0390921660248301526044820152606401604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600061121b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250866001600160a01b03166117469092919063ffffffff16565b80519091501561129857808060200190518101906112399190611c66565b6112985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104b5565b50505050565b60008181526005602052604081205460ff1661130e5760405162461bcd60e51b815260206004820152602960248201527f4d61644170655374616b696e673a20546f6b656e206e6f742063757272656e746044820152681b1e481cdd185ad95960ba1b60648201526084016104b5565b6113188383611485565b506000828152600560209081526040808320805460ff191690556006825280832080546001600160a01b03191690556001600160a01b038616835260079091528120905b81548110156114115781818154811061137757611377611c06565b9060005260206000200154841461138d576113ff565b8154829061139d90600190611c83565b815481106113ad576113ad611c06565b90600052602060002001548282815481106113ca576113ca611c06565b9060005260206000200181905550818054806113e8576113e8611c9a565b600190038181906000526020600020016000905590555b8061140981611c32565b91505061135c565b506001600160a01b03841660009081526007602052604090208154611438919083906118eb565b50604080516001600160a01b0386168152602081018590527f4f50549a240e0e0e2a52e116a7ac318dd9b7943257c3f8c77fbe1d26ba8685b1910160405180910390a15060019392505050565b600061149183836115d4565b6001600160a01b03848116600081815260086020908152604080832088845290915290819020429055600154905163a9059cbb60e01b815260048101929092526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190611c66565b5060408051838152602081018390527f47b0878030426a9511b1cd915a0ac34bd29f33d4f846616b55847303ff8ebcbe910160405180910390a192915050565b6009805460ff1916821515179055806105315742600a5550565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526005602052604081205460ff166115f257506000610831565b600061160060095460ff1690565b61163c57600a546001600160a01b0385166000908152600860209081526040808320878452909152902054611635919061175d565b905061166e565b6001600160a01b038416600090815260086020908152604080832086845290915290205461166b90429061175d565b90505b60006116828261167d600c5490565b611769565b90508061169457600092505050610831565b6003546040516252d6f560e01b8152600481018690526000916001600160a01b0316906252d6f590602401602060405180830381865afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117009190611c4d565b9050600061170d600b5490565b9050600061171b8285611775565b905060006117298285611775565b90506000611738826064611769565b9a9950505050505050505050565b60606117558484600085611781565b949350505050565b60006109678284611c83565b60006109678284611cb0565b60006109678284611cd2565b6060824710156117e25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104b5565b6001600160a01b0385163b6118395760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104b5565b600080866001600160a01b031685876040516118559190611d1d565b60006040518083038185875af1925050503d8060008114611892576040519150601f19603f3d011682016040523d82523d6000602084013e611897565b606091505b50915091506118a78282866118b2565b979650505050505050565b606083156118c1575081610967565b8251156118d15782518084602001fd5b8160405162461bcd60e51b81526004016104b59190611d39565b82805482825590600052602060002090810192821561192b5760005260206000209182015b8281111561192b578254825591600101919060010190611910565b5061193792915061193b565b5090565b5b80821115611937576000815560010161193c565b6001600160a01b038116811461053157600080fd5b60006020828403121561197757600080fd5b813561096781611950565b60008060006060848603121561199757600080fd5b83356119a281611950565b925060208401356119b281611950565b929592945050506040919091013590565b6000602082840312156119d557600080fd5b5035919050565b801515811461053157600080fd5b6000602082840312156119fc57600080fd5b8135610967816119dc565b60008060408385031215611a1a57600080fd5b8235611a2581611950565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015611a6b57835183529284019291840191600101611a4f565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215611aa057600080fd5b823567ffffffffffffffff80821115611ab857600080fd5b818501915085601f830112611acc57600080fd5b813581811115611ade57611ade611a77565b8060051b604051601f19603f83011681018181108582111715611b0357611b03611a77565b604052918252848201925083810185019188831115611b2157600080fd5b938501935b82851015611b3f57843584529385019392850192611b26565b98975050505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611b9257600080fd5b815161096781611950565b60208082526043908201527f4d61644170655374616b696e673a204d6573736167652073656e646572206e6f60408201527f742063757272656e746c7920746865206f776e6572206f66207468697320746f60608201526235b2b760e91b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611c4657611c46611c1c565b5060010190565b600060208284031215611c5f57600080fd5b5051919050565b600060208284031215611c7857600080fd5b8151610967816119dc565b600082821015611c9557611c95611c1c565b500390565b634e487b7160e01b600052603160045260246000fd5b600082611ccd57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611cec57611cec611c1c565b500290565b60005b83811015611d0c578181015183820152602001611cf4565b838111156112985750506000910152565b60008251611d2f818460208701611cf1565b9190910192915050565b6020815260008251806020840152611d58816040850160208701611cf1565b601f01601f1916919091016040019291505056fea2646970667358221220b75f5889912e9013b36e295f7306da935de3f99ff87890948a6b215287b9be5764736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000031e480d9ec9fd36f5faff6c9f4875772d8b0e62100000000000000000000000042a668e82c80f38bf706fbc3f11650cd0103964e000000000000000000000000176ed991aa63b35497a5075b648fcbcbb9836c97
-----Decoded View---------------
Arg [0] : _rewardTokenAddress (address): 0x31E480D9Ec9FD36F5FAfF6c9F4875772d8B0e621
Arg [1] : _stakeTokenAddress (address): 0x42A668e82c80f38bf706fBC3F11650cD0103964E
Arg [2] : _rarityCheckerAddress (address): 0x176ed991Aa63B35497a5075B648fcbCbB9836c97
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000031e480d9ec9fd36f5faff6c9f4875772d8b0e621
Arg [1] : 00000000000000000000000042a668e82c80f38bf706fbc3f11650cd0103964e
Arg [2] : 000000000000000000000000176ed991aa63b35497a5075b648fcbcbb9836c97
Deployed Bytecode Sourcemap
299:14452:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11311:182;;;;;;:::i;:::-;;:::i;:::-;;9363:196;;;;;;:::i;:::-;;:::i;5821:221::-;;;;;;:::i;:::-;;:::i;5106:119::-;;;;;;:::i;:::-;5165:4;5188:30;;;:21;:30;;;;;;;;;5106:119;;;;1213:14:8;;1206:22;1188:41;;1176:2;1161:18;5106:119:5;;;;;;;;13746:157;;;:::i;4734:366::-;;;;;;:::i;:::-;;:::i;:::-;;;1386:25:8;;;1374:2;1359:18;4734:366:5;1240:177:8;12361:99:5;12441:11;;-1:-1:-1;;;;;12441:11:5;12361:99;;;-1:-1:-1;;;;;1586:32:8;;;1568:51;;1556:2;1541:18;12361:99:5;1422:203:8;12569:149:5;;;;;;:::i;:::-;;:::i;10647:203::-;;;;;;:::i;:::-;;:::i;6423:126::-;;;;;;:::i;:::-;6487:7;6512:30;;;:21;:30;;;;;;-1:-1:-1;;;;;6512:30:5;;6423:126;11737:101;11818:12;;-1:-1:-1;;;;;11818:12:5;11737:101;;6632:107;;;;;;:::i;:::-;-1:-1:-1;;;;;6713:19:5;6691:4;6713:19;;;:9;:19;;;;;;;;;6632:107;1661:101:6;;;:::i;5421:145:5:-;;;;;;:::i;:::-;;:::i;5572:147::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1029:85:6:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:6;1029:85;;11102:98:5;11178:15;;11102:98;;11947:175;;;;;;:::i;:::-;;:::i;3354:200::-;;;;;;:::i;:::-;;:::i;13503:143::-;;;;;;:::i;:::-;;:::i;9823:105::-;9906:14;;-1:-1:-1;;;;;9906:14:5;9823:105;;13267:137;;;;;;:::i;:::-;;:::i;10440:90::-;10512:11;;10440:90;;4275:247;;;;;;:::i;:::-;;:::i;3560:709::-;;;;;;:::i;:::-;;:::i;4528:200::-;;;;;;:::i;:::-;;:::i;10037:175::-;;;;;;:::i;:::-;;:::i;5231:184::-;;;;;;:::i;:::-;;:::i;1911:198:6:-;;;;;;:::i;:::-;;:::i;14023:678:5:-;;;;;;:::i;:::-;;:::i;12981:83::-;13048:9;;;;12981:83;;11311:182;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;;;;;;;;;11394:52:5::1;11413:16;11818:12:::0;;-1:-1:-1;;;;;11818:12:5;;11737:101;11413:16:::1;11394:52;::::0;;-1:-1:-1;;;;;4799:15:8;;;4781:34;;4851:15;;;4846:2;4831:18;;4824:43;4716:18;11394:52:5::1;;;;;;;11631:12:::0;:37;;-1:-1:-1;;;;;;11631:37:5;-1:-1:-1;;;;;11631:37:5;;;;;11311:182;:::o;11456:30::-:1;11311:182:::0;:::o;9363:196::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;9450:58:5::1;9471:18;9906:14:::0;;-1:-1:-1;;;;;9906:14:5;;9823:105;9471:18:::1;9450:58;::::0;;-1:-1:-1;;;;;4799:15:8;;;4781:34;;4851:15;;;4846:2;4831:18;;4824:43;4716:18;9450:58:5::1;;;;;;;9703:14:::0;:49;;-1:-1:-1;;;;;;9703:49:5;-1:-1:-1;;;;;9703:49:5;;;;;11311:182;:::o;5821:221::-;719:10:1;3166:23:5;;;;:9;:23;;;;;;;;3158:76;;;;-1:-1:-1;;;3158:76:5;;5080:2:8;3158:76:5;;;5062:21:8;5119:2;5099:18;;;5092:30;5158:34;5138:18;;;5131:62;-1:-1:-1;;;5209:18:8;;;5202:38;5257:19;;3158:76:5;4878:404:8;3158:76:5;5929:27:::1;5938:8;5948:7;5929:8;:27::i;:::-;-1:-1:-1::0;5971:64:5::1;::::0;;-1:-1:-1;;;;;5574:15:8;;;5556:34;;5626:15;;5621:2;5606:18;;5599:43;5658:18;;;5651:34;;;6019:15:5::1;5716:2:8::0;5701:18;;5694:34;5971:64:5::1;::::0;5505:3:8;5490:19;5971:64:5::1;;;;;;;5821:221:::0;;;:::o;13746:157::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;13811:59:5::1;::::0;13794:12:::1;::::0;13819:10:::1;::::0;13844:21:::1;::::0;13794:12;13811:59;13794:12;13811:59;13844:21;13819:10;13811:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13793:77;;;13888:7;13880:16;;;::::0;::::1;4734:366:::0;4785:7;719:10:1;4812:11:5;;:28;;-1:-1:-1;;;4812:28:5;;;;;1386:25:8;;;-1:-1:-1;;;;;4812:44:5;;;;:11;;;;:19;;1359:18:8;;4812:28:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4812:44:5;;4804:124;;;;-1:-1:-1;;;4804:124:5;;;;;;;:::i;:::-;4938:14;4955:35;719:10:1;4982:7:5;4955:12;:35::i;:::-;4938:52;;5017:1;5008:6;:10;5000:70;;;;-1:-1:-1;;;5000:70:5;;6883:2:8;5000:70:5;;;6865:21:8;6922:2;6902:18;;;6895:30;6961:34;6941:18;;;6934:62;-1:-1:-1;;;7012:18:8;;;7005:45;7067:19;;5000:70:5;6681:411:8;5000:70:5;5087:6;4734:366;-1:-1:-1;;4734:366:5:o;12569:149::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;12640:40:5::1;12656:13;13048:9:::0;;;;;12981:83;12656:13:::1;12640:40;::::0;;7284:14:8;;7277:22;7259:41;;7343:14;;7336:22;7331:2;7316:18;;7309:50;7232:18;12640:40:5::1;;;;;;;12690:21;12702:8;12690:11;:21::i;10647:203::-:0;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;10736:61:5::1;10758:19;11178:15:::0;;;11102:98;10758:19:::1;10736:61;::::0;;7544:25:8;;;7600:2;7585:18;;7578:34;;;7517:18;10736:61:5::1;;;;;;;10807:36;10825:17;10995:15:::0;:35;10922:115;1661:101:6;1075:7;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;5421:145:5:-;5501:7;5527:32;5544:5;5551:7;5527:16;:32::i;:::-;5520:39;5421:145;-1:-1:-1;;;5421:145:5:o;5572:147::-;-1:-1:-1;;;;;5673:39:5;;;;;;:32;:39;;;;;;;;;5666:46;;;;;;;;;;;;;;;;;5639:16;;5666:46;;;5673:39;5666:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5572:147;;;:::o;11947:175::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;12028:49:5::1;12046:15;12441:11:::0;;-1:-1:-1;;;;;12441:11:5;;12361:99;12046:15:::1;12028:49;::::0;;-1:-1:-1;;;;;4799:15:8;;;4781:34;;4851:15;;;4846:2;4831:18;;4824:43;4716:18;12028:49:5::1;;;;;;;12257:11:::0;:36;;-1:-1:-1;;;;;;12257:36:5;-1:-1:-1;;;;;12257:36:5;;;;;11311:182;:::o;3354:200::-;3420:4;;3435:92;3459:8;:15;3455:1;:19;3435:92;;;3495:21;3504:8;3513:1;3504:11;;;;;;;;:::i;:::-;;;;;;;3495:8;:21::i;:::-;-1:-1:-1;3476:3:5;;;;:::i;:::-;;;;3435:92;;;-1:-1:-1;3543:4:5;;3354:200;-1:-1:-1;;3354:200:5:o;13503:143::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;13572:19:5;::::1;13594:5;13572:19:::0;;;:9:::1;:19;::::0;;;;;;;;:27;;-1:-1:-1;;13572:27:5::1;::::0;;13614:25;;1568:51:8;;;13614:25:5::1;::::0;1541:18:8;13614:25:5::1;;;;;;;;13503:143:::0;:::o;13267:137::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;13333:19:5;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;;:26;;-1:-1:-1;;13333:26:5::1;13355:4;13333:26;::::0;;13374:23;;1568:51:8;;;13374:23:5::1;::::0;1541:18:8;13374:23:5::1;1422:203:8::0;4275:247:5;4328:4;719:10:1;4351:11:5;;:28;;-1:-1:-1;;;4351:28:5;;;;;1386:25:8;;;-1:-1:-1;;;;;4351:44:5;;;;:11;;;;:19;;1359:18:8;;4351:28:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4351:44:5;;4343:124;;;;-1:-1:-1;;;4343:124:5;;;;;;;:::i;:::-;4484:31;719:10:1;4507:7:5;4484:8;:31::i;3560:709::-;3611:4;3634:13;13048:9;;;;;12981:83;3634:13;3626:72;;;;-1:-1:-1;;;3626:72:5;;8229:2:8;3626:72:5;;;8211:21:8;8268:2;8248:18;;;8241:30;8307:34;8287:18;;;8280:62;-1:-1:-1;;;8358:18:8;;;8351:44;8412:19;;3626:72:5;8027:410:8;3626:72:5;719:10:1;3716:11:5;;:28;;-1:-1:-1;;;3716:28:5;;;;;1386:25:8;;;-1:-1:-1;;;;;3716:44:5;;;;:11;;;;:19;;1359:18:8;;3716:28:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3716:44:5;;3708:124;;;;-1:-1:-1;;;3708:124:5;;;;;;;:::i;:::-;3851:30;;;;:21;:30;;;;;;;;3850:31;3842:79;;;;-1:-1:-1;;;3842:79:5;;8644:2:8;3842:79:5;;;8626:21:8;8683:2;8663:18;;;8656:30;8722:34;8702:18;;;8695:62;-1:-1:-1;;;8773:18:8;;;8766:33;8816:19;;3842:79:5;8442:399:8;3842:79:5;3932:30;;;;:21;:30;;;;;:37;;-1:-1:-1;;3932:37:5;3965:4;3932:37;;;4012:12;719:10:1;;640:96;4012:12:5;3979:30;;;;:21;:30;;;;;;;;:45;;-1:-1:-1;;;;;;3979:45:5;-1:-1:-1;;;;;3979:45:5;;;;;;;;;;;719:10:1;4034:57:5;;;:43;:57;;;;;:66;;;;;;;;4103:15;4034:84;;4129:46;;;:32;:46;;;;;:60;;-1:-1:-1;4129:60:5;;;;;;;;;;;;;;;;;4205:36;;9020:51:8;;;9087:18;;9080:34;;;4205:36:5;;;;;;;;;;;;;-1:-1:-1;4258:4:5;;3560:709;-1:-1:-1;3560:709:5:o;4528:200::-;4594:4;;4609:92;4633:8;:15;4629:1;:19;4609:92;;;4669:21;4678:8;4687:1;4678:11;;;;;;;;:::i;:::-;;;;;;;4669:8;:21::i;:::-;-1:-1:-1;4650:3:5;;;;:::i;:::-;;;;4609:92;;10037:175;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;10118:49:5::1;10136:15;10512:11:::0;;;10440:90;10136:15:::1;10118:49;::::0;;7544:25:8;;;7600:2;7585:18;;7578:34;;;7517:18;10118:49:5::1;;;;;;;10177:28;10191:13;10345:11:::0;:27;10280:99;5231:184;5294:7;5329:30;;;:21;:30;;;;;;-1:-1:-1;;;;;5329:30:5;5376:32;5329:30;5351:7;5376:16;:32::i;1911:198:6:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:6;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:6;;9327:2:8;1991:73:6::1;::::0;::::1;9309:21:8::0;9366:2;9346:18;;;9339:30;9405:34;9385:18;;;9378:62;-1:-1:-1;;;9456:18:8;;;9449:36;9502:19;;1991:73:6::1;9125:402:8::0;1991:73:6::1;2074:28;2093:8;2074:18;:28::i;14023:678:5:-:0;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:1;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;14136:30:5::1;::::0;-1:-1:-1;;;14136:30:5;;14160:4:::1;14136:30;::::0;::::1;1568:51:8::0;14111:6:5;;14089:12:::1;::::0;-1:-1:-1;;;;;14136:15:5;::::1;::::0;::::1;::::0;1541:18:8;;14136:30:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;14128:75;;;::::0;-1:-1:-1;;;14128:75:5;;9923:2:8;14128:75:5::1;::::0;::::1;9905:21:8::0;9962:2;9942:18;;;9935:30;10001;9981:18;;;9974:58;10049:18;;14128:75:5::1;9721:352:8::0;14128:75:5::1;14214:17;-1:-1:-1::0;;;14282:7:5::1;1075::6::0;1101:6;-1:-1:-1;;;;;1101:6:6;;1029:85;14282:7:5::1;14291:30;::::0;-1:-1:-1;;;14291:30:5;;14315:4:::1;14291:30;::::0;::::1;1568:51:8::0;-1:-1:-1;;;;;14291:15:5;::::1;::::0;::::1;::::0;1541:18:8;;14291:30:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14234:88;::::0;-1:-1:-1;;;;;9038:32:8;;;14234:88:5::1;::::0;::::1;9020:51:8::0;9087:18;;;9080:34;8993:18;;14234:88:5::1;;;;;;;;;;;;;-1:-1:-1::0;;;;;14234:88:5::1;;;;;;;-1:-1:-1::0;;;;;14234:88:5::1;;;;;;;;;;;14214:108;;14332:24;14359:70;14388:4;14359:70;;;;;;;;;;;;;;;;::::0;14367:6:::1;-1:-1:-1::0;;;;;14359:28:5::1;;;:70;;;;;:::i;:::-;14443:18:::0;;14332:97;;-1:-1:-1;14443:22:5;14439:256:::1;;14617:11;14606:31;;;;;;;;;;;;:::i;:::-;14598:86;;;::::0;-1:-1:-1;;;14598:86:5;;10530:2:8;14598:86:5::1;::::0;::::1;10512:21:8::0;10569:2;10549:18;;;10542:30;10608:34;10588:18;;;10581:62;-1:-1:-1;;;10659:18:8;;;10652:40;10709:19;;14598:86:5::1;10328:406:8::0;14598:86:5::1;14079:622;;;14023:678:::0;:::o;6841:706::-;6909:4;6932:30;;;:21;:30;;;;;;;;6924:84;;;;-1:-1:-1;;;6924:84:5;;10941:2:8;6924:84:5;;;10923:21:8;10980:2;10960:18;;;10953:30;11019:34;10999:18;;;10992:62;-1:-1:-1;;;11070:18:8;;;11063:39;11119:19;;6924:84:5;10739:405:8;6924:84:5;7019:28;7032:5;7039:7;7019:12;:28::i;:::-;-1:-1:-1;7090:5:5;7057:30;;;:21;:30;;;;;;;;:38;;-1:-1:-1;;7057:38:5;;;7105:21;:30;;;;;:43;;-1:-1:-1;;;;;;7105:43:5;;;-1:-1:-1;;;;;7186:39:5;;;;:32;:39;;;;;;7235:180;7259:13;;7255:17;;7235:180;;;7308:6;7315:1;7308:9;;;;;;;;:::i;:::-;;;;;;;;;7297:7;:20;7293:34;;7319:8;;7293:34;7360:13;;7353:6;;7360:17;;7376:1;;7360:17;:::i;:::-;7353:25;;;;;;;;:::i;:::-;;;;;;;;;7341:6;7348:1;7341:9;;;;;;;;:::i;:::-;;;;;;;;:37;;;;7392:6;:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7235:180;7274:3;;;;:::i;:::-;;;;7235:180;;;-1:-1:-1;;;;;;7424:39:5;;;;;;:32;:39;;;;;:48;;;;:39;7466:6;;7424:48;:::i;:::-;-1:-1:-1;7488:31:5;;;-1:-1:-1;;;;;9038:32:8;;9020:51;;9102:2;9087:18;;9080:34;;;7488:31:5;;8993:18:8;7488:31:5;;;;;;;-1:-1:-1;7536:4:5;;6841:706;-1:-1:-1;;;6841:706:5:o;7553:323::-;7625:14;7659:32;7676:5;7683:7;7659:16;:32::i;:::-;-1:-1:-1;;;;;7701:50:5;;;;;;;:43;:50;;;;;;;;:59;;;;;;;;;;7763:15;7701:77;;7788:12;;:36;;-1:-1:-1;;;7788:36:5;;;;;9020:51:8;;;;9087:18;;;9080:34;;;7650:41:5;;-1:-1:-1;7788:12:5;;;:21;;8993:18:8;;7788:36:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7839:30:5;;;7544:25:8;;;7600:2;7585:18;;7578:34;;;7839:30:5;;7517:18:8;7839:30:5;;;;;;;7553:323;;;;:::o;12765:166::-;12820:9;:20;;-1:-1:-1;;12820:20:5;;;;;;;;12850:75;;12899:15;12879:17;:35;12765:166;:::o;2263:187:6:-;2336:16;2355:6;;-1:-1:-1;;;;;2371:17:6;;;-1:-1:-1;;;;;;2371:17:6;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2326:124;2263:187;:::o;7882:1266:5:-;7963:20;5188:30;;;:21;:30;;;;;;;;7994:60;;-1:-1:-1;8042:1:5;8035:8;;7994:60;8063:43;8121:13;13048:9;;;;;12981:83;8121:13;8116:334;;8201:17;;-1:-1:-1;;;;;8220:50:5;;;;;;:43;:50;;;;;;;;:59;;;;;;;;;8188:92;;8201:17;8188:12;:92::i;:::-;8150:130;;8116:334;;;-1:-1:-1;;;;;8379:50:5;;;;;;:43;:50;;;;;;;;:59;;;;;;;;;8349:90;;8362:15;;8349:12;:90::i;:::-;8311:128;;8116:334;8459:19;8481:70;8494:35;8531:19;11178:15;;;11102:98;8531:19;8481:12;:70::i;:::-;8459:92;-1:-1:-1;8565:16:5;8561:55;;8604:1;8597:8;;;;;;8561:55;8748:14;;:47;;-1:-1:-1;;;8748:47:5;;;;;1386:25:8;;;8721:24:5;;-1:-1:-1;;;;;8748:14:5;;:38;;1359:18:8;;8748:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8721:74;;8805:18;8826:15;10512:11;;;10440:90;8826:15;8805:36;;8851:34;8888:37;8901:10;8913:11;8888:12;:37::i;:::-;8851:74;;8935:32;8970:58;8983:26;9011:16;8970:12;:58::i;:::-;8935:93;;9038:24;9065:43;9078:24;9104:3;9065:12;:43::i;:::-;9038:70;7882:1266;-1:-1:-1;;;;;;;;;;7882:1266:5:o;3861:223:0:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;3861:223;-1:-1:-1;;;;3861:223:0:o;3108:96:7:-;3166:7;3192:5;3196:1;3192;:5;:::i;3836:96::-;3894:7;3920:5;3924:1;3920;:5;:::i;3451:96::-;3509:7;3535:5;3539:1;3535;:5;:::i;4948:499:0:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:0;;12008:2:8;5137:81:0;;;11990:21:8;12047:2;12027:18;;;12020:30;12086:34;12066:18;;;12059:62;-1:-1:-1;;;12137:18:8;;;12130:36;12183:19;;5137:81:0;11806:402:8;5137:81:0;-1:-1:-1;;;;;1465:19:0;;;5228:60;;;;-1:-1:-1;;;5228:60:0;;12415:2:8;5228:60:0;;;12397:21:8;12454:2;12434:18;;;12427:30;12493:31;12473:18;;;12466:59;12542:18;;5228:60:0;12213:353:8;5228:60:0;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:0;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:0:o;7561:692::-;7707:12;7735:7;7731:516;;;-1:-1:-1;7765:10:0;7758:17;;7731:516;7876:17;;:21;7872:365;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;-1:-1:-1;;;8202:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:8;-1:-1:-1;;;;;89:31:8;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:456::-;479:6;487;495;548:2;536:9;527:7;523:23;519:32;516:52;;;564:1;561;554:12;516:52;603:9;590:23;622:31;647:5;622:31;:::i;:::-;672:5;-1:-1:-1;729:2:8;714:18;;701:32;742:33;701:32;742:33;:::i;:::-;402:456;;794:7;;-1:-1:-1;;;848:2:8;833:18;;;;820:32;;402:456::o;863:180::-;922:6;975:2;963:9;954:7;950:23;946:32;943:52;;;991:1;988;981:12;943:52;-1:-1:-1;1014:23:8;;863:180;-1:-1:-1;863:180:8:o;1630:118::-;1716:5;1709:13;1702:21;1695:5;1692:32;1682:60;;1738:1;1735;1728:12;1753:241;1809:6;1862:2;1850:9;1841:7;1837:23;1833:32;1830:52;;;1878:1;1875;1868:12;1830:52;1917:9;1904:23;1936:28;1958:5;1936:28;:::i;1999:315::-;2067:6;2075;2128:2;2116:9;2107:7;2103:23;2099:32;2096:52;;;2144:1;2141;2134:12;2096:52;2183:9;2170:23;2202:31;2227:5;2202:31;:::i;:::-;2252:5;2304:2;2289:18;;;;2276:32;;-1:-1:-1;;;1999:315:8:o;2319:632::-;2490:2;2542:21;;;2612:13;;2515:18;;;2634:22;;;2461:4;;2490:2;2713:15;;;;2687:2;2672:18;;;2461:4;2756:169;2770:6;2767:1;2764:13;2756:169;;;2831:13;;2819:26;;2900:15;;;;2865:12;;;;2792:1;2785:9;2756:169;;;-1:-1:-1;2942:3:8;;2319:632;-1:-1:-1;;;;;;2319:632:8:o;2956:127::-;3017:10;3012:3;3008:20;3005:1;2998:31;3048:4;3045:1;3038:15;3072:4;3069:1;3062:15;3088:1115;3172:6;3203:2;3246;3234:9;3225:7;3221:23;3217:32;3214:52;;;3262:1;3259;3252:12;3214:52;3302:9;3289:23;3331:18;3372:2;3364:6;3361:14;3358:34;;;3388:1;3385;3378:12;3358:34;3426:6;3415:9;3411:22;3401:32;;3471:7;3464:4;3460:2;3456:13;3452:27;3442:55;;3493:1;3490;3483:12;3442:55;3529:2;3516:16;3551:2;3547;3544:10;3541:36;;;3557:18;;:::i;:::-;3603:2;3600:1;3596:10;3635:2;3629:9;3698:2;3694:7;3689:2;3685;3681:11;3677:25;3669:6;3665:38;3753:6;3741:10;3738:22;3733:2;3721:10;3718:18;3715:46;3712:72;;;3764:18;;:::i;:::-;3800:2;3793:22;3850:18;;;3884:15;;;;-1:-1:-1;3926:11:8;;;3922:20;;;3954:19;;;3951:39;;;3986:1;3983;3976:12;3951:39;4010:11;;;;4030:142;4046:6;4041:3;4038:15;4030:142;;;4112:17;;4100:30;;4063:12;;;;4150;;;;4030:142;;;4191:6;3088:1115;-1:-1:-1;;;;;;;;3088:1115:8:o;4208:356::-;4410:2;4392:21;;;4429:18;;;4422:30;4488:34;4483:2;4468:18;;4461:62;4555:2;4540:18;;4208:356::o;5949:251::-;6019:6;6072:2;6060:9;6051:7;6047:23;6043:32;6040:52;;;6088:1;6085;6078:12;6040:52;6120:9;6114:16;6139:31;6164:5;6139:31;:::i;6205:471::-;6407:2;6389:21;;;6446:2;6426:18;;;6419:30;6485:34;6480:2;6465:18;;6458:62;6556:34;6551:2;6536:18;;6529:62;-1:-1:-1;;;6622:3:8;6607:19;;6600:34;6666:3;6651:19;;6205:471::o;7623:127::-;7684:10;7679:3;7675:20;7672:1;7665:31;7715:4;7712:1;7705:15;7739:4;7736:1;7729:15;7755:127;7816:10;7811:3;7807:20;7804:1;7797:31;7847:4;7844:1;7837:15;7871:4;7868:1;7861:15;7887:135;7926:3;-1:-1:-1;;7947:17:8;;7944:43;;;7967:18;;:::i;:::-;-1:-1:-1;8014:1:8;8003:13;;7887:135::o;9532:184::-;9602:6;9655:2;9643:9;9634:7;9630:23;9626:32;9623:52;;;9671:1;9668;9661:12;9623:52;-1:-1:-1;9694:16:8;;9532:184;-1:-1:-1;9532:184:8:o;10078:245::-;10145:6;10198:2;10186:9;10177:7;10173:23;10169:32;10166:52;;;10214:1;10211;10204:12;10166:52;10246:9;10240:16;10265:28;10287:5;10265:28;:::i;11149:125::-;11189:4;11217:1;11214;11211:8;11208:34;;;11222:18;;:::i;:::-;-1:-1:-1;11259:9:8;;11149:125::o;11279:127::-;11340:10;11335:3;11331:20;11328:1;11321:31;11371:4;11368:1;11361:15;11395:4;11392:1;11385:15;11411:217;11451:1;11477;11467:132;;11521:10;11516:3;11512:20;11509:1;11502:31;11556:4;11553:1;11546:15;11584:4;11581:1;11574:15;11467:132;-1:-1:-1;11613:9:8;;11411:217::o;11633:168::-;11673:7;11739:1;11735;11731:6;11727:14;11724:1;11721:21;11716:1;11709:9;11702:17;11698:45;11695:71;;;11746:18;;:::i;:::-;-1:-1:-1;11786:9:8;;11633:168::o;12571:258::-;12643:1;12653:113;12667:6;12664:1;12661:13;12653:113;;;12743:11;;;12737:18;12724:11;;;12717:39;12689:2;12682:10;12653:113;;;12784:6;12781:1;12778:13;12775:48;;;-1:-1:-1;;12819:1:8;12801:16;;12794:27;12571:258::o;12834:274::-;12963:3;13001:6;12995:13;13017:53;13063:6;13058:3;13051:4;13043:6;13039:17;13017:53;:::i;:::-;13086:16;;;;;12834:274;-1:-1:-1;;12834:274:8:o;13113:383::-;13262:2;13251:9;13244:21;13225:4;13294:6;13288:13;13337:6;13332:2;13321:9;13317:18;13310:34;13353:66;13412:6;13407:2;13396:9;13392:18;13387:2;13379:6;13375:15;13353:66;:::i;:::-;13480:2;13459:15;-1:-1:-1;;13455:29:8;13440:45;;;;13487:2;13436:54;;13113:383;-1:-1:-1;;13113:383:8:o
Swarm Source
ipfs://b75f5889912e9013b36e295f7306da935de3f99ff87890948a6b215287b9be57
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.