Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 650 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 15894646 | 702 days ago | IN | 0 ETH | 0.00168156 | ||||
Withdraw | 15615113 | 741 days ago | IN | 0 ETH | 0.00069239 | ||||
Withdraw | 15615110 | 741 days ago | IN | 0 ETH | 0.00391545 | ||||
Withdraw | 15560969 | 748 days ago | IN | 0 ETH | 0.00060757 | ||||
Withdraw | 15545572 | 750 days ago | IN | 0 ETH | 0.00071269 | ||||
Withdraw | 15510616 | 756 days ago | IN | 0 ETH | 0.00098816 | ||||
Withdraw | 15424382 | 770 days ago | IN | 0 ETH | 0.00088755 | ||||
Withdraw | 15371253 | 778 days ago | IN | 0 ETH | 0.0011099 | ||||
Deposit | 15259384 | 796 days ago | IN | 0 ETH | 0.00273244 | ||||
Withdraw | 15248667 | 797 days ago | IN | 0 ETH | 0.00109536 | ||||
Withdraw | 15204784 | 804 days ago | IN | 0 ETH | 0.00068189 | ||||
Withdraw | 15192224 | 806 days ago | IN | 0 ETH | 0.0005999 | ||||
Withdraw | 15164688 | 811 days ago | IN | 0 ETH | 0.00116531 | ||||
Withdraw | 15163419 | 811 days ago | IN | 0 ETH | 0.00125894 | ||||
Withdraw | 15138942 | 814 days ago | IN | 0 ETH | 0.00320734 | ||||
Withdraw | 15131007 | 816 days ago | IN | 0 ETH | 0.00142828 | ||||
Deposit | 15086990 | 823 days ago | IN | 0 ETH | 0.00677013 | ||||
Withdraw | 15076656 | 824 days ago | IN | 0 ETH | 0.00808319 | ||||
Deposit | 15069313 | 825 days ago | IN | 0 ETH | 0.00453764 | ||||
Withdraw | 15000941 | 837 days ago | IN | 0 ETH | 0.00286613 | ||||
Withdraw | 14965767 | 844 days ago | IN | 0 ETH | 0.00469964 | ||||
Withdraw | 14952914 | 846 days ago | IN | 0 ETH | 0.00644285 | ||||
Withdraw | 14942489 | 848 days ago | IN | 0 ETH | 0.00700971 | ||||
Withdraw | 14926144 | 850 days ago | IN | 0 ETH | 0.00513933 | ||||
Withdraw | 14919232 | 851 days ago | IN | 0 ETH | 0.00650346 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTStaking
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED // ███████╗███╗ ██╗███████╗ █████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗███╗ ██╗███████╗ // ██╔════╝████╗ ██║██╔════╝██╔══██╗██║ ██╔╝╚██╗ ██╔╝ ██╔════╝ ██╔═══██╗██╔══██╗██║ ██║████╗ ██║██╔════╝ // ███████╗██╔██╗ ██║█████╗ ███████║█████╔╝ ╚████╔╝ ██║ ███╗██║ ██║██████╔╝██║ ██║██╔██╗ ██║███████╗ // ╚════██║██║╚██╗██║██╔══╝ ██╔══██║██╔═██╗ ╚██╔╝ ██║ ██║██║ ██║██╔══██╗██║ ██║██║╚██╗██║╚════██║ // ███████║██║ ╚████║███████╗██║ ██║██║ ██╗ ██║ ╚██████╔╝╚██████╔╝██████╔╝███████╗██║██║ ╚████║███████║ // ╚══════╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝╚══════╝ pragma solidity 0.8.13; // Imports import "./Ownable.sol"; import "./IERC721.sol"; import "./IERC20.sol"; import "./ECDSA.sol"; import "./ReentrancyGuard.sol"; /** * @title The staking smart contract. */ contract NFTStaking is Ownable, ReentrancyGuard { /// @notice The staker details. struct Staker { uint256 claimedRewards; uint256 lastCheckpoint; uint256[] stakedToken1; uint256[] stakedToken2; uint256[] stakedBoosters; } // @notice The available contract types. enum ContractTypes { Token1, Token2, Booster } /// @notice The number of seconds in a day. uint256 public constant SECONDS_IN_DAY = 24 * 60 * 60; /// @notice The flag that indicates if staking is launched. bool public stakingLaunched; /// @notice The flag that indicates if deposit is paused. bool public depositPaused; /// @notice The addresses of the token contracts. address[3] public tokenAddresses; /// @notice The flag indicates if the categories have been seeded. bool[3] public tokenTypeSeeded; /// @notice The index of the first NFT smart contract. uint256 private constant TOKEN1 = 0; /// @notice The index of the second NFT smart contract. uint256 private constant TOKEN2 = 1; /// @notice The index of the booster NFT smart contract. uint256 private constant BOOSTER = 2; /// @notice The number of types of tokens available. uint256 constant private NUMBER_OF_TOKEN_TYPES = 3; /// @notice The max number of token categories. uint256 constant private MAX_NUMBER_OF_CATEGORIES_PER_TOKEN_TYPE = 5; /// @notice The numbers of categories of each token type. uint256[NUMBER_OF_TOKEN_TYPES] public numberOfCategoryPerType = [5, 5, 3]; /// @notice The yields for categories per token types. uint256[MAX_NUMBER_OF_CATEGORIES_PER_TOKEN_TYPE][NUMBER_OF_TOKEN_TYPES] public yieldsPerCategoryPerTokenType; /// @notice The categories of the first NFT smart contract tokens. bytes private _token1Categories; /// @notice The categories of the second NFT smart contract tokens. bytes private _token2Categories; /// @notice The categories of the booster NFT smart contract tokens. bytes private _boosterCategories; /// @notice The mapping of stakers. mapping(address => Staker) public stakers; /// @notice The mapping of token owners. mapping(uint256 => mapping(uint256 => address)) private _ownerOfToken; /// @notice The stake event. event Deposit(address indexed staker, address nftContract, uint256 tokensAmount); /// @notice The unstake event. event Withdraw(address indexed staker, address nftContract, uint256 tokensAmount); /// @notice The event fires during emergency funds withdrawal process. event WithdrawStuckERC721(address indexed receiver, address indexed tokenAddress, uint256 indexed tokenId); /** * @notice The smart contract constructor that initializes the contract. * @param _token1 The address of the first NFT smart contract. */ constructor( // declare a base NFT contract for staking address _token1 ) { // Set the variables. tokenAddresses[TOKEN1] = _token1; yieldsPerCategoryPerTokenType[0][0] = 100 ether; yieldsPerCategoryPerTokenType[0][1] = 120 ether; yieldsPerCategoryPerTokenType[0][2] = 140 ether; yieldsPerCategoryPerTokenType[0][3] = 150 ether; yieldsPerCategoryPerTokenType[0][4] = 200 ether; } /* * @notice Sets the addresses of the NFT collections. * @param token1 The address of the first collection. * @param token2 The address of the second collection. * @param booster The address of the booster collection. */ function setTokenAddresses(address token1, address token2, address booster) external onlyOwner { tokenAddresses[TOKEN1] = token1; tokenAddresses[TOKEN2] = token2; tokenAddresses[BOOSTER] = booster; } /* * @notice Sets the categories of a specific collection. * @param contractType The type of the collection. * @param categoryInBytes The categories as an array of bytes. */ function setCategoriesBatch(ContractTypes contractType, bytes calldata categoryInBytes) external onlyOwner { tokenTypeSeeded[uint(contractType)] = true; if (contractType == ContractTypes.Token1) { _token1Categories = categoryInBytes; } else if (contractType == ContractTypes.Token2) { _token2Categories = categoryInBytes; } else if (contractType == ContractTypes.Booster) { _boosterCategories = categoryInBytes; } } /* * @notice Sets the yields of a specific collection category. * @param contractType The type of the collection. * @param category The category. * @param yield The yield value. */ function setCategoryYield( ContractTypes contractType, uint8 category, uint256 yield ) external onlyOwner { require(category <= numberOfCategoryPerType[uint(contractType)], "Invalid category number"); yieldsPerCategoryPerTokenType[uint(contractType)][category] = yield; } /* * @notice Sets the yields of collection categories. * @param contractType The type of the collection. * @param category The category. * @param yields The yield values. */ function setCategoryYieldsBatch(ContractTypes contractType, uint256[] memory yields) external onlyOwner { require(yields.length == numberOfCategoryPerType[uint(contractType)], "Length not match"); for (uint256 i; i < yields.length; i++) { yieldsPerCategoryPerTokenType[uint(contractType)][i] = yields[i]; } } /* * @notice Returns the categories of the tokens. * @param contractType The type of the collection. * @param tokenIds The IDs of the tokens to get categories of. * @return The categories of the provided tokens. */ function getCategoriesOfTokens(ContractTypes contractType, uint256[] memory tokenIds) external view returns (uint8[] memory) { uint8[] memory categories = new uint8[](tokenIds.length); for (uint256 i; i < tokenIds.length; i++) { categories[i] = getCategoryOfToken(contractType, tokenIds[i]); } return categories; } /* * @notice Stakes the NFTs. * @param contractType The type of the collection. * @param tokenIds The IDs of the tokens to stake. */ function deposit(ContractTypes contractType, uint256[] memory tokenIds) external nonReentrant { require(uint(contractType) < tokenAddresses.length, "Not a valid contract"); require(!depositPaused, "Deposit paused"); require(stakingLaunched, "Staking is disabled"); require(tokenIds.length > 0, "No token Ids specified"); address tokenAddress = tokenAddresses[uint(contractType)]; _claimRewards(_msgSender()); Staker storage user = stakers[_msgSender()]; if (contractType == ContractTypes.Booster) { // If a user tries to stake a Booster but does not have any Collection1 NFTs staked, the stake is prohibited require(user.stakedBoosters.length + tokenIds.length <= user.stakedToken1.length * 2, "Maximum num of boosters reached"); } for (uint256 i; i < tokenIds.length; i++) { require(IERC721(tokenAddress).ownerOf(tokenIds[i]) == _msgSender(), "Not the owner"); IERC721(tokenAddress).safeTransferFrom(_msgSender(), address(this), tokenIds[i]); _ownerOfToken[uint(contractType)][tokenIds[i]] = _msgSender(); if (contractType == ContractTypes.Token1) { user.stakedToken1.push(tokenIds[i]); } else if (contractType == ContractTypes.Token2) { user.stakedToken2.push(tokenIds[i]); } else if (contractType == ContractTypes.Booster) { user.stakedBoosters.push(tokenIds[i]); } } emit Deposit(_msgSender(), tokenAddress, tokenIds.length); } /* * @notice Unstakes the NFTs. * @param contractType The type of the collection. * @param tokenIds The IDs of the tokens to unstake. */ function withdraw(ContractTypes contractType, uint256[] memory tokenIds) external nonReentrant { require(uint(contractType) < tokenAddresses.length, "Not a valid contract"); require(tokenIds.length > 0, "No token Ids specified"); address tokenAddress = tokenAddresses[uint(contractType)]; _claimRewards(_msgSender()); Staker storage user = stakers[_msgSender()]; for (uint256 i; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; require(IERC721(tokenAddress).ownerOf(tokenId) == address(this), "Invalid tokenIds provided"); require(_ownerOfToken[uint(contractType)][tokenId] == _msgSender(), "Not token owner"); _ownerOfToken[uint(contractType)][tokenId] = address(0); if (contractType == ContractTypes.Token1) { user.stakedToken1 = _moveTokenToLast(user.stakedToken1, tokenId); user.stakedToken1.pop(); } else if (contractType == ContractTypes.Token2) { user.stakedToken2 = _moveTokenToLast(user.stakedToken2, tokenId); user.stakedToken2.pop(); } else if (contractType == ContractTypes.Booster) { user.stakedBoosters = _moveTokenToLast(user.stakedBoosters, tokenId); user.stakedBoosters.pop(); } IERC721(tokenAddress).safeTransferFrom(address(this), _msgSender(), tokenId); } emit Withdraw(_msgSender(), tokenAddress, tokenIds.length); } /* * @notice Calculates the total reward of a staker. * @param staker The address of the staker. * @return The total reward of the staker. */ function getTotalRewards(address staker) external view returns (uint256) { return stakers[staker].claimedRewards + getUnclaimedRewards(staker); } /* * @notice Gets yields of tokens of a specific collection. * @param contractType The type of the collection. * @param tokenIds The IDs of the tokens to get the yields of. * @return The yields of the tokens provided. */ function getYieldsForTokens(ContractTypes contractType, uint256[] memory tokenIds) external view returns (uint256[] memory) { uint256[] memory yields = new uint256[](tokenIds.length); for (uint256 i; i < tokenIds.length; i++) { yields[i] = getTokenYield(contractType, tokenIds[i]); } return yields; } /* * @notice Gets called whenever an IERC721 tokenId token is transferred to this contract via IERC721.safeTransferFrom. */ function onERC721Received( address, address, uint256, bytes calldata ) external pure returns (bytes4) { return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } /** * @notice Pauses the deposit process. * @param _pause The deposit state value. */ function pauseDeposit(bool _pause) public onlyOwner { depositPaused = _pause; } /** * @notice Launches staking. */ function launchStaking() public onlyOwner { require(!stakingLaunched, "Staking was enabled"); stakingLaunched = true; } /** * @notice Allows the owner to withdraw ERC721 in case of an emergency. * @param contractType The type of the collection. * @param tokenIds The IDs of the tokens to withdraw. */ function emergencyWithdraw(ContractTypes contractType, uint256[] memory tokenIds) public onlyOwner { require(tokenIds.length <= 50, "50 is max per tx"); require(uint(contractType) < tokenAddresses.length, "Not a valid contract"); address tokenAddress = tokenAddresses[uint(contractType)]; pauseDeposit(true); for (uint256 i; i < tokenIds.length; i++) { address receiver = _ownerOfToken[uint(contractType)][tokenIds[i]]; if (receiver != address(0) && IERC721(tokenAddress).ownerOf(tokenIds[i]) == address(this)) { IERC721(tokenAddress).transferFrom(address(this), receiver, tokenIds[i]); emit WithdrawStuckERC721(receiver, tokenAddress, tokenIds[i]); } } } /* * @notice Gets a category of a token of a specific collection. * @param contractType The type of the collection. * @param tokenId The ID of the token to get the category of. * @return The category of the token provided. */ function getCategoryOfToken(ContractTypes contractType, uint256 tokenId) public view returns (uint8) { if (tokenTypeSeeded[uint(contractType)] == false) { return 0; } if (contractType == ContractTypes.Token1) { return uint8(_token1Categories[tokenId]); } else if (contractType == ContractTypes.Token2) { return uint8(_token2Categories[tokenId]); } else if (contractType == ContractTypes.Booster) { return uint8(_boosterCategories[tokenId]); } return 0; } /* * @notice Gets a yield of a token of a specific collection. * @param contractType The type of the collection. * @param tokenId The ID of the token to get the yield of. * @return The yield of the token provided. */ function getTokenYield(ContractTypes contractType, uint256 tokenId) public view returns (uint256) { uint8 category = getCategoryOfToken(contractType, tokenId); return yieldsPerCategoryPerTokenType[uint(contractType)][category]; } /* * @notice Calculates the yields produced by staked boosters. * @param userAddress The address of a user to calculate the booster yield for. * @return The booster yield produced for the users. */ function calculateBoostersYield(address userAddress) public view returns (uint256) { uint256 numberToken1Staked = stakers[userAddress].stakedToken1.length; uint256[] memory boosters = stakers[userAddress].stakedBoosters; // Maximum of 2 boosters can be applied to each token uint256 maximumApplicableBoosters = numberToken1Staked * 2; uint256 applicableBoosters = boosters.length < maximumApplicableBoosters ? boosters.length : maximumApplicableBoosters; uint256 totalBoosterYield; for (uint256 i; i < applicableBoosters; i++) { uint256 tokenId = boosters[i]; totalBoosterYield += getTokenYield(ContractTypes.Booster, tokenId); } return totalBoosterYield; } /* * @notice Calculates the yields produced by staked boosters. * @param userAddress The address of a user to calculate the booster yield for. * @return The booster yield produced for the users. */ function getCurrentYield(address userAddress) public view returns (uint256) { uint256 numberToken1Staked = stakers[userAddress].stakedToken1.length; uint256 numberToken2Staked = stakers[userAddress].stakedToken2.length; uint currentYield = 0; for (uint256 i; i < numberToken1Staked; i++) { currentYield += getTokenYield(ContractTypes.Token1, stakers[userAddress].stakedToken1[i]); } for (uint256 i; i < numberToken2Staked; i++) { currentYield += getTokenYield(ContractTypes.Token2, stakers[userAddress].stakedToken2[i]); } currentYield += calculateBoostersYield(userAddress); return currentYield; } /* * @notice Calculates unclaimed reward of a staker. * @param staker The address of the staker. * @return The unclaimed reward of the staker. */ function getUnclaimedRewards(address staker) public view returns (uint256) { if (stakers[staker].lastCheckpoint == 0) { return 0; } return ((block.timestamp - stakers[staker].lastCheckpoint) * getCurrentYield(staker)) / SECONDS_IN_DAY; } /* * @notice Gets tokens of a staker. * @param contractType The type of the collection. * @param staker The address of the staker. * @return The tokens of the staker. */ function getStakerTokens(ContractTypes contractType, address staker) public view returns (uint256[] memory) { uint256[] memory tokens; if (contractType == ContractTypes.Token1) { tokens = stakers[staker].stakedToken1; } else if (contractType == ContractTypes.Token2) { tokens = stakers[staker].stakedToken2; } else if (contractType == ContractTypes.Booster) { tokens = stakers[staker].stakedBoosters; } return tokens; } /** * @notice Returns the address of a token owner. * @param contractType The type of the collection. * @param tokenId The token ID to get the owner of. * @return The owner address. */ function ownerOf(ContractTypes contractType, uint256 tokenId) public view returns (address) { return _ownerOfToken[uint(contractType)][tokenId]; } /* * @notice Moves a token to the last position in an array. * @param list The array of token IDs. * @param tokenId The ID of the token to move. * @return The updated array. */ function _moveTokenToLast(uint256[] memory list, uint256 tokenId) internal pure returns (uint256[] memory) { uint256 tokenIndex = 0; uint256 lastTokenIndex = list.length - 1; uint256 length = list.length; for (uint256 i = 0; i < length; i++) { if (list[i] == tokenId) { tokenIndex = i + 1; break; } } require(tokenIndex != 0, "msg.sender is not the owner"); tokenIndex -= 1; if (tokenIndex != lastTokenIndex) { list[tokenIndex] = list[lastTokenIndex]; list[lastTokenIndex] = tokenId; } return list; } /* * @notice Transfers the reward to a staker. * @param staker The address of the staker. */ function _claimRewards(address staker) internal { stakers[staker].claimedRewards += getUnclaimedRewards(staker); stakers[staker].lastCheckpoint = block.timestamp; } }
// 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 (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: 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 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"nftContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"Deposit","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":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"nftContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawStuckERC721","type":"event"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"calculateBoostersYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getCategoriesOfTokens","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCategoryOfToken","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getCurrentYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"address","name":"staker","type":"address"}],"name":"getStakerTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getUnclaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getYieldsForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"numberOfCategoryPerType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"bytes","name":"categoryInBytes","type":"bytes"}],"name":"setCategoriesBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint8","name":"category","type":"uint8"},{"internalType":"uint256","name":"yield","type":"uint256"}],"name":"setCategoryYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256[]","name":"yields","type":"uint256[]"}],"name":"setCategoryYieldsBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token1","type":"address"},{"internalType":"address","name":"token2","type":"address"},{"internalType":"address","name":"booster","type":"address"}],"name":"setTokenAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"claimedRewards","type":"uint256"},{"internalType":"uint256","name":"lastCheckpoint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTypeSeeded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NFTStaking.ContractTypes","name":"contractType","type":"uint8"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"yieldsPerCategoryPerTokenType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040526005608081815260a091909152600360c081905262000026916007916200011d565b503480156200003457600080fd5b50604051620029f4380380620029f483398101604081905262000057916200017c565b6200006233620000cd565b60018055600380546001600160a01b0319166001600160a01b039290921691909117905568056bc75e2d63100000600a5568068155a43676e00000600b55680796e3ea3f8ab00000600c55680821ab0d4414980000600d55680ad78ebc5ac6200000600e55620001ae565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b826003810192821562000153579160200282015b8281111562000153578251829060ff1690559160200191906001019062000131565b506200016192915062000165565b5090565b5b8082111562000161576000815560010162000166565b6000602082840312156200018f57600080fd5b81516001600160a01b0381168114620001a757600080fd5b9392505050565b61283680620001be6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806378d73ed31161010f578063cc1c304a116100a2578063e1af569811610071578063e1af569814610495578063e5df8b84146104a2578063e7bc0d21146104b5578063f2fde38b146104c857600080fd5b8063cc1c304a14610449578063cff418a41461045c578063d1edbc531461046f578063d8de05d11461048257600080fd5b8063a30a2474116100de578063a30a2474146103f6578063a9b8b958146103fe578063b471f68614610411578063c75062e01461042457600080fd5b806378d73ed3146103625780638da5cb5b146103825780639168ae72146103a75780639a2e1e7e146103e357600080fd5b80634d3f9d3e1161018757806361a52a361161015657806361a52a361461032a5780636460e82c1461033457806369a69e2914610347578063715018a61461035a57600080fd5b80634d3f9d3e146102de5780635732140c146102f157806357af2255146103045780635d311c471461031757600080fd5b8063150b7a02116101c3578063150b7a02146102465780632bcf161c1461029757806340c06d72146102b8578063415855d6146102cb57600080fd5b806302befd24146101ea57806308dcdefa1461021157806312377b3e14610231575b600080fd5b6002546101fc90610100900460ff1681565b60405190151581526020015b60405180910390f35b61022461021f366004612285565b6104db565b60405161020891906122bc565b61024461023f366004612316565b610673565b005b61027e610254366004612430565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610208565b6102aa6102a53660046124a3565b61097a565b604051908152602001610208565b6102446102c63660046124c0565b6109a8565b6102446102d9366004612513565b610a9c565b6102446102ec366004612535565b610ae0565b6102aa6102ff3660046124a3565b610b49565b6101fc610312366004612580565b610c41565b610244610325366004612316565b610c6b565b6102aa6201518081565b610244610342366004612316565b610d70565b6102aa6103553660046124a3565b6112e0565b610244611351565b610375610370366004612316565b611387565b6040516102089190612599565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610208565b6103ce6103b53660046124a3565b601c602052600090815260409020805460019091015482565b60408051928352602083019190915201610208565b6102446103f1366004612316565b61143e565b6102446119f5565b6102aa61040c3660046125d4565b611a77565b61038f61041f3660046125d4565b611acc565b6104376104323660046125d4565b611b13565b60405160ff9091168152602001610208565b610224610457366004612316565b611c1f565b61024461046a3660046125fe565b611cc7565b6102aa61047d3660046124a3565b611dad565b6102aa610490366004612580565b611eb7565b6002546101fc9060ff1681565b61038f6104b0366004612580565b611ece565b6102aa6104c3366004612643565b611eee565b6102446104d63660046124a3565b611f19565b60608060008460028111156104f2576104f2612665565b03610564576001600160a01b0383166000908152601c60209081526040918290206002018054835181840281018401909452808452909183018282801561055857602002820191906000526020600020905b815481526020019060010190808311610544575b5050505050905061066a565b600184600281111561057857610578612665565b036105e8576001600160a01b0383166000908152601c6020908152604091829020600301805483518184028101840190945280845290918301828280156105585760200282019190600052602060002090815481526020019060010190808311610544575050505050905061066a565b60028460028111156105fc576105fc612665565b0361066a576001600160a01b0383166000908152601c60209081526040918290206004018054835181840281018401909452808452909183018282801561066257602002820191906000526020600020905b81548152602001906001019080831161064e575b505050505090505b90505b92915050565b6000546001600160a01b031633146106a65760405162461bcd60e51b815260040161069d9061267b565b60405180910390fd5b6032815111156106eb5760405162461bcd60e51b815260206004820152601060248201526f06a6040d2e640dac2f040e0cae440e8f60831b604482015260640161069d565b60038260028111156106ff576106ff612665565b1061071c5760405162461bcd60e51b815260040161069d906126b0565b6000600383600281111561073257610732612665565b60038110610742576107426126de565b01546001600160a01b031690506107596001610a9c565b60005b8251811015610974576000601d600086600281111561077d5761077d612665565b8152602001908152602001600020600085848151811061079f5761079f6126de565b6020908102919091018101518252810191909152604001600020546001600160a01b03169050801580159061086c5750306001600160a01b0316836001600160a01b0316636352211e8685815181106107fa576107fa6126de565b60200260200101516040518263ffffffff1660e01b815260040161082091815260200190565b602060405180830381865afa15801561083d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086191906126f4565b6001600160a01b0316145b1561096157826001600160a01b03166323b872dd3083878681518110610894576108946126de565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b50505050838281518110610918576109186126de565b6020026020010151836001600160a01b0316826001600160a01b03167ffefe036cac4ee3a4aca074a81cbcc4376e1484693289078dbec149c890101d5b60405160405180910390a45b508061096c81612727565b91505061075c565b50505050565b6000610985826112e0565b6001600160a01b0383166000908152601c602052604090205461066d9190612740565b6000546001600160a01b031633146109d25760405162461bcd60e51b815260040161069d9061267b565b600160068460028111156109e8576109e8612665565b600381106109f8576109f86126de565b602091828204019190066101000a81548160ff02191690831515021790555060006002811115610a2a57610a2a612665565b836002811115610a3c57610a3c612665565b03610a4d5761097460198383612188565b6001836002811115610a6157610a61612665565b03610a7257610974601a8383612188565b6002836002811115610a8657610a86612665565b03610a9757610974601b8383612188565b505050565b6000546001600160a01b03163314610ac65760405162461bcd60e51b815260040161069d9061267b565b600280549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610b0a5760405162461bcd60e51b815260040161069d9061267b565b600380546001600160a01b039485166001600160a01b031991821617909155600480549385169382169390931790925560058054919093169116179055565b6001600160a01b0381166000908152601c60209081526040808320600281015460049091018054835181860281018601909452808452919385939290830182828015610bb457602002820191906000526020600020905b815481526020019060010190808311610ba0575b505050505090506000826002610bca9190612758565b9050600081835110610bdc5781610bdf565b82515b90506000805b82811015610c36576000858281518110610c0157610c016126de565b60200260200101519050610c16600282611a77565b610c209084612740565b9250508080610c2e90612727565b915050610be5565b509695505050505050565b60068160038110610c5157600080fd5b60209182820401919006915054906101000a900460ff1681565b6000546001600160a01b03163314610c955760405162461bcd60e51b815260040161069d9061267b565b6007826002811115610ca957610ca9612665565b60038110610cb957610cb96126de565b0154815114610cfd5760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d040dcdee840dac2e8c6d60831b604482015260640161069d565b60005b8151811015610a9757818181518110610d1b57610d1b6126de565b6020026020010151600a846002811115610d3757610d37612665565b60038110610d4757610d476126de565b600502018260058110610d5c57610d5c6126de565b015580610d6881612727565b915050610d00565b600260015403610dc25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069d565b60026001819055506003826002811115610dde57610dde612665565b10610dfb5760405162461bcd60e51b815260040161069d906126b0565b600254610100900460ff1615610e445760405162461bcd60e51b815260206004820152600e60248201526d11195c1bdcda5d081c185d5cd95960921b604482015260640161069d565b60025460ff16610e8c5760405162461bcd60e51b815260206004820152601360248201527214dd185ada5b99c81a5cc8191a5cd8589b1959606a1b604482015260640161069d565b6000815111610ed65760405162461bcd60e51b8152602060048201526016602482015275139bc81d1bdad95b8812591cc81cdc1958da599a595960521b604482015260640161069d565b60006003836002811115610eec57610eec612665565b60038110610efc57610efc6126de565b01546001600160a01b03169050610f1233611fb4565b336000908152601c6020526040902060028481811115610f3457610f34612665565b03610fa757600280820154610f4891612758565b83516004830154610f599190612740565b1115610fa75760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d206e756d206f6620626f6f7374657273207265616368656400604482015260640161069d565b60005b835181101561128d57336001600160a01b0316836001600160a01b0316636352211e868481518110610fde57610fde6126de565b60200260200101516040518263ffffffff1660e01b815260040161100491815260200190565b602060405180830381865afa158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906126f4565b6001600160a01b03161461108b5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b604482015260640161069d565b6001600160a01b0383166342842e0e33308785815181106110ae576110ae6126de565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561110857600080fd5b505af115801561111c573d6000803e3d6000fd5b505050506111273390565b601d600087600281111561113d5761113d612665565b8152602001908152602001600020600086848151811061115f5761115f6126de565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600060028111156111ac576111ac612665565b8560028111156111be576111be612665565b036111fd57816002018482815181106111d9576111d96126de565b6020908102919091018101518254600181018455600093845291909220015561127b565b600185600281111561121157611211612665565b0361122c57816003018482815181106111d9576111d96126de565b600285600281111561124057611240612665565b0361127b578160040184828151811061125b5761125b6126de565b602090810291909101810151825460018101845560009384529190922001555b8061128581612727565b915050610faa565b508251604080516001600160a01b0385168152602081019290925233917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6291015b60405180910390a25050600180555050565b6001600160a01b0381166000908152601c6020526040812060010154810361130a57506000919050565b6201518061131783611dad565b6001600160a01b0384166000908152601c602052604090206001015461133d9042612777565b6113479190612758565b61066d919061278e565b6000546001600160a01b0316331461137b5760405162461bcd60e51b815260040161069d9061267b565b611385600061200a565b565b60606000825167ffffffffffffffff8111156113a5576113a5612300565b6040519080825280602002602001820160405280156113ce578160200160208202803683370190505b50905060005b835181101561143657611400858583815181106113f3576113f36126de565b6020026020010151611b13565b828281518110611412576114126126de565b60ff909216602092830291909101909101528061142e81612727565b9150506113d4565b509392505050565b6002600154036114905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069d565b600260018190555060038260028111156114ac576114ac612665565b106114c95760405162461bcd60e51b815260040161069d906126b0565b60008151116115135760405162461bcd60e51b8152602060048201526016602482015275139bc81d1bdad95b8812591cc81cdc1958da599a595960521b604482015260640161069d565b6000600383600281111561152957611529612665565b60038110611539576115396126de565b01546001600160a01b0316905061154f33611fb4565b336000908152601c60205260408120905b83518110156119b057600084828151811061157d5761157d6126de565b60200260200101519050306001600160a01b0316846001600160a01b0316636352211e836040518263ffffffff1660e01b81526004016115bf91815260200190565b602060405180830381865afa1580156115dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160091906126f4565b6001600160a01b0316146116565760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e4964732070726f766964656400000000000000604482015260640161069d565b33601d600088600281111561166d5761166d612665565b8152602080820192909252604090810160009081208582529092529020546001600160a01b0316146116d35760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b604482015260640161069d565b6000601d60008860028111156116eb576116eb612665565b815260208082019290925260409081016000908120858252909252812080546001600160a01b0319166001600160a01b03939093169290921790915586600281111561173957611739612665565b036117df5761179a8360020180548060200260200160405190810160405280929190818152602001828054801561178f57602002820191906000526020600020905b81548152602001906001019080831161177b575b50505050508261205a565b80516117b091600286019160209091019061220c565b50826002018054806117c4576117c46127b0565b60019003818190600052602060002001600090559055611930565b60018660028111156117f3576117f3612665565b0361187c576118528360030180548060200260200160405190810160405280929190818152602001828054801561178f576020028201919060005260206000209081548152602001906001019080831161177b5750505050508261205a565b805161186891600386019160209091019061220c565b50826003018054806117c4576117c46127b0565b600286600281111561189057611890612665565b03611930576118ef8360040180548060200260200160405190810160405280929190818152602001828054801561178f576020028201919060005260206000209081548152602001906001019080831161177b5750505050508261205a565b805161190591600486019160209091019061220c565b5082600401805480611919576119196127b0565b600190038181906000526020600020016000905590555b60408051632142170760e11b81523060048201523360248201526044810183905290516001600160a01b038616916342842e0e91606480830192600092919082900301818387803b15801561198457600080fd5b505af1158015611998573d6000803e3d6000fd5b505050505080806119a890612727565b915050611560565b508251604080516001600160a01b0385168152602081019290925233917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb91016112ce565b6000546001600160a01b03163314611a1f5760405162461bcd60e51b815260040161069d9061267b565b60025460ff1615611a685760405162461bcd60e51b815260206004820152601360248201527214dd185ada5b99c81dd85cc8195b98589b1959606a1b604482015260640161069d565b6002805460ff19166001179055565b600080611a848484611b13565b9050600a846002811115611a9a57611a9a612665565b60038110611aaa57611aaa6126de565b600502018160ff1660058110611ac257611ac26126de565b0154949350505050565b6000601d6000846002811115611ae457611ae4612665565b8152602080820192909252604090810160009081208582529092529020546001600160a01b0316905092915050565b60006006836002811115611b2957611b29612665565b60038110611b3957611b396126de565b602081049091015460ff601f9092166101000a9004161515600003611b605750600061066d565b6000836002811115611b7457611b74612665565b03611bc8576019828154611b87906127c6565b8110611b9557611b956126de565b815460011615611bb45790600052602060002090602091828204019190065b9054901a600160f81b0260f81c905061066d565b6001836002811115611bdc57611bdc612665565b03611bef57601a828154611b87906127c6565b6002836002811115611c0357611c03612665565b03611c1657601b828154611b87906127c6565b50600092915050565b60606000825167ffffffffffffffff811115611c3d57611c3d612300565b604051908082528060200260200182016040528015611c66578160200160208202803683370190505b50905060005b835181101561143657611c9885858381518110611c8b57611c8b6126de565b6020026020010151611a77565b828281518110611caa57611caa6126de565b602090810291909101015280611cbf81612727565b915050611c6c565b6000546001600160a01b03163314611cf15760405162461bcd60e51b815260040161069d9061267b565b6007836002811115611d0557611d05612665565b60038110611d1557611d156126de565b01548260ff161115611d695760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642063617465676f7279206e756d626572000000000000000000604482015260640161069d565b80600a846002811115611d7e57611d7e612665565b60038110611d8e57611d8e6126de565b600502018360ff1660058110611da657611da66126de565b0155505050565b6001600160a01b0381166000908152601c60205260408120600281015460039091015482805b83811015611e3c576001600160a01b0386166000908152601c602052604081206002018054611e1e92919084908110611e0e57611e0e6126de565b9060005260206000200154611a77565b611e289083612740565b915080611e3481612727565b915050611dd3565b5060005b82811015611e9a576001600160a01b0386166000908152601c602052604090206003018054611e7c9160019184908110611e0e57611e0e6126de565b611e869083612740565b915080611e9281612727565b915050611e40565b50611ea485610b49565b611eae9082612740565b95945050505050565b60078160038110611ec757600080fd5b0154905081565b60038160038110611ede57600080fd5b01546001600160a01b0316905081565b600a8260038110611efe57600080fd5b600502018160058110611f1057600080fd5b01549150829050565b6000546001600160a01b03163314611f435760405162461bcd60e51b815260040161069d9061267b565b6001600160a01b038116611fa85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069d565b611fb18161200a565b50565b611fbd816112e0565b6001600160a01b0382166000908152601c602052604081208054909190611fe5908490612740565b90915550506001600160a01b03166000908152601c6020526040902042600190910155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606000806001855161206d9190612777565b855190915060005b818110156120c15785878281518110612090576120906126de565b6020026020010151036120af576120a8816001612740565b93506120c1565b806120b981612727565b915050612075565b50826000036121125760405162461bcd60e51b815260206004820152601b60248201527f6d73672e73656e646572206973206e6f7420746865206f776e65720000000000604482015260640161069d565b61211d600184612777565b925081831461217e57858281518110612138576121386126de565b6020026020010151868481518110612152576121526126de565b60200260200101818152505084868381518110612171576121716126de565b6020026020010181815250505b5093949350505050565b828054612194906127c6565b90600052602060002090601f0160209004810192826121b657600085556121fc565b82601f106121cf5782800160ff198235161785556121fc565b828001600101855582156121fc579182015b828111156121fc5782358255916020019190600101906121e1565b50612208929150612247565b5090565b8280548282559060005260206000209081019282156121fc579160200282015b828111156121fc57825182559160200191906001019061222c565b5b808211156122085760008155600101612248565b80356003811061226b57600080fd5b919050565b6001600160a01b0381168114611fb157600080fd5b6000806040838503121561229857600080fd5b6122a18361225c565b915060208301356122b181612270565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156122f4578351835292840192918401916001016122d8565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561232957600080fd5b6123328361225c565b915060208084013567ffffffffffffffff8082111561235057600080fd5b818601915086601f83011261236457600080fd5b81358181111561237657612376612300565b8060051b604051601f19603f8301168101818110858211171561239b5761239b612300565b6040529182528482019250838101850191898311156123b957600080fd5b938501935b828510156123d7578435845293850193928501926123be565b8096505050505050509250929050565b60008083601f8401126123f957600080fd5b50813567ffffffffffffffff81111561241157600080fd5b60208301915083602082850101111561242957600080fd5b9250929050565b60008060008060006080868803121561244857600080fd5b853561245381612270565b9450602086013561246381612270565b935060408601359250606086013567ffffffffffffffff81111561248657600080fd5b612492888289016123e7565b969995985093965092949392505050565b6000602082840312156124b557600080fd5b813561066a81612270565b6000806000604084860312156124d557600080fd5b6124de8461225c565b9250602084013567ffffffffffffffff8111156124fa57600080fd5b612506868287016123e7565b9497909650939450505050565b60006020828403121561252557600080fd5b8135801515811461066a57600080fd5b60008060006060848603121561254a57600080fd5b833561255581612270565b9250602084013561256581612270565b9150604084013561257581612270565b809150509250925092565b60006020828403121561259257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156122f457835160ff16835292840192918401916001016125b5565b600080604083850312156125e757600080fd5b6125f08361225c565b946020939093013593505050565b60008060006060848603121561261357600080fd5b61261c8461225c565b9250602084013560ff8116811461263257600080fd5b929592945050506040919091013590565b6000806040838503121561265657600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273139bdd0818481d985b1a590818dbdb9d1c9858dd60621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561270657600080fd5b815161066a81612270565b634e487b7160e01b600052601160045260246000fd5b60006001820161273957612739612711565b5060010190565b6000821982111561275357612753612711565b500190565b600081600019048311821515161561277257612772612711565b500290565b60008282101561278957612789612711565b500390565b6000826127ab57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b600181811c908216806127da57607f821691505b6020821081036127fa57634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212206532c19d71ac81390ca909c4bf231ca95b64b59c4e648da7f11187c6c7403b0a64736f6c634300080d0033000000000000000000000000e283dddc1d93e40e3748de182ff0219cd154372e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806378d73ed31161010f578063cc1c304a116100a2578063e1af569811610071578063e1af569814610495578063e5df8b84146104a2578063e7bc0d21146104b5578063f2fde38b146104c857600080fd5b8063cc1c304a14610449578063cff418a41461045c578063d1edbc531461046f578063d8de05d11461048257600080fd5b8063a30a2474116100de578063a30a2474146103f6578063a9b8b958146103fe578063b471f68614610411578063c75062e01461042457600080fd5b806378d73ed3146103625780638da5cb5b146103825780639168ae72146103a75780639a2e1e7e146103e357600080fd5b80634d3f9d3e1161018757806361a52a361161015657806361a52a361461032a5780636460e82c1461033457806369a69e2914610347578063715018a61461035a57600080fd5b80634d3f9d3e146102de5780635732140c146102f157806357af2255146103045780635d311c471461031757600080fd5b8063150b7a02116101c3578063150b7a02146102465780632bcf161c1461029757806340c06d72146102b8578063415855d6146102cb57600080fd5b806302befd24146101ea57806308dcdefa1461021157806312377b3e14610231575b600080fd5b6002546101fc90610100900460ff1681565b60405190151581526020015b60405180910390f35b61022461021f366004612285565b6104db565b60405161020891906122bc565b61024461023f366004612316565b610673565b005b61027e610254366004612430565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610208565b6102aa6102a53660046124a3565b61097a565b604051908152602001610208565b6102446102c63660046124c0565b6109a8565b6102446102d9366004612513565b610a9c565b6102446102ec366004612535565b610ae0565b6102aa6102ff3660046124a3565b610b49565b6101fc610312366004612580565b610c41565b610244610325366004612316565b610c6b565b6102aa6201518081565b610244610342366004612316565b610d70565b6102aa6103553660046124a3565b6112e0565b610244611351565b610375610370366004612316565b611387565b6040516102089190612599565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610208565b6103ce6103b53660046124a3565b601c602052600090815260409020805460019091015482565b60408051928352602083019190915201610208565b6102446103f1366004612316565b61143e565b6102446119f5565b6102aa61040c3660046125d4565b611a77565b61038f61041f3660046125d4565b611acc565b6104376104323660046125d4565b611b13565b60405160ff9091168152602001610208565b610224610457366004612316565b611c1f565b61024461046a3660046125fe565b611cc7565b6102aa61047d3660046124a3565b611dad565b6102aa610490366004612580565b611eb7565b6002546101fc9060ff1681565b61038f6104b0366004612580565b611ece565b6102aa6104c3366004612643565b611eee565b6102446104d63660046124a3565b611f19565b60608060008460028111156104f2576104f2612665565b03610564576001600160a01b0383166000908152601c60209081526040918290206002018054835181840281018401909452808452909183018282801561055857602002820191906000526020600020905b815481526020019060010190808311610544575b5050505050905061066a565b600184600281111561057857610578612665565b036105e8576001600160a01b0383166000908152601c6020908152604091829020600301805483518184028101840190945280845290918301828280156105585760200282019190600052602060002090815481526020019060010190808311610544575050505050905061066a565b60028460028111156105fc576105fc612665565b0361066a576001600160a01b0383166000908152601c60209081526040918290206004018054835181840281018401909452808452909183018282801561066257602002820191906000526020600020905b81548152602001906001019080831161064e575b505050505090505b90505b92915050565b6000546001600160a01b031633146106a65760405162461bcd60e51b815260040161069d9061267b565b60405180910390fd5b6032815111156106eb5760405162461bcd60e51b815260206004820152601060248201526f06a6040d2e640dac2f040e0cae440e8f60831b604482015260640161069d565b60038260028111156106ff576106ff612665565b1061071c5760405162461bcd60e51b815260040161069d906126b0565b6000600383600281111561073257610732612665565b60038110610742576107426126de565b01546001600160a01b031690506107596001610a9c565b60005b8251811015610974576000601d600086600281111561077d5761077d612665565b8152602001908152602001600020600085848151811061079f5761079f6126de565b6020908102919091018101518252810191909152604001600020546001600160a01b03169050801580159061086c5750306001600160a01b0316836001600160a01b0316636352211e8685815181106107fa576107fa6126de565b60200260200101516040518263ffffffff1660e01b815260040161082091815260200190565b602060405180830381865afa15801561083d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086191906126f4565b6001600160a01b0316145b1561096157826001600160a01b03166323b872dd3083878681518110610894576108946126de565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b50505050838281518110610918576109186126de565b6020026020010151836001600160a01b0316826001600160a01b03167ffefe036cac4ee3a4aca074a81cbcc4376e1484693289078dbec149c890101d5b60405160405180910390a45b508061096c81612727565b91505061075c565b50505050565b6000610985826112e0565b6001600160a01b0383166000908152601c602052604090205461066d9190612740565b6000546001600160a01b031633146109d25760405162461bcd60e51b815260040161069d9061267b565b600160068460028111156109e8576109e8612665565b600381106109f8576109f86126de565b602091828204019190066101000a81548160ff02191690831515021790555060006002811115610a2a57610a2a612665565b836002811115610a3c57610a3c612665565b03610a4d5761097460198383612188565b6001836002811115610a6157610a61612665565b03610a7257610974601a8383612188565b6002836002811115610a8657610a86612665565b03610a9757610974601b8383612188565b505050565b6000546001600160a01b03163314610ac65760405162461bcd60e51b815260040161069d9061267b565b600280549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314610b0a5760405162461bcd60e51b815260040161069d9061267b565b600380546001600160a01b039485166001600160a01b031991821617909155600480549385169382169390931790925560058054919093169116179055565b6001600160a01b0381166000908152601c60209081526040808320600281015460049091018054835181860281018601909452808452919385939290830182828015610bb457602002820191906000526020600020905b815481526020019060010190808311610ba0575b505050505090506000826002610bca9190612758565b9050600081835110610bdc5781610bdf565b82515b90506000805b82811015610c36576000858281518110610c0157610c016126de565b60200260200101519050610c16600282611a77565b610c209084612740565b9250508080610c2e90612727565b915050610be5565b509695505050505050565b60068160038110610c5157600080fd5b60209182820401919006915054906101000a900460ff1681565b6000546001600160a01b03163314610c955760405162461bcd60e51b815260040161069d9061267b565b6007826002811115610ca957610ca9612665565b60038110610cb957610cb96126de565b0154815114610cfd5760405162461bcd60e51b815260206004820152601060248201526f098cadccee8d040dcdee840dac2e8c6d60831b604482015260640161069d565b60005b8151811015610a9757818181518110610d1b57610d1b6126de565b6020026020010151600a846002811115610d3757610d37612665565b60038110610d4757610d476126de565b600502018260058110610d5c57610d5c6126de565b015580610d6881612727565b915050610d00565b600260015403610dc25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069d565b60026001819055506003826002811115610dde57610dde612665565b10610dfb5760405162461bcd60e51b815260040161069d906126b0565b600254610100900460ff1615610e445760405162461bcd60e51b815260206004820152600e60248201526d11195c1bdcda5d081c185d5cd95960921b604482015260640161069d565b60025460ff16610e8c5760405162461bcd60e51b815260206004820152601360248201527214dd185ada5b99c81a5cc8191a5cd8589b1959606a1b604482015260640161069d565b6000815111610ed65760405162461bcd60e51b8152602060048201526016602482015275139bc81d1bdad95b8812591cc81cdc1958da599a595960521b604482015260640161069d565b60006003836002811115610eec57610eec612665565b60038110610efc57610efc6126de565b01546001600160a01b03169050610f1233611fb4565b336000908152601c6020526040902060028481811115610f3457610f34612665565b03610fa757600280820154610f4891612758565b83516004830154610f599190612740565b1115610fa75760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d206e756d206f6620626f6f7374657273207265616368656400604482015260640161069d565b60005b835181101561128d57336001600160a01b0316836001600160a01b0316636352211e868481518110610fde57610fde6126de565b60200260200101516040518263ffffffff1660e01b815260040161100491815260200190565b602060405180830381865afa158015611021573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104591906126f4565b6001600160a01b03161461108b5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b604482015260640161069d565b6001600160a01b0383166342842e0e33308785815181106110ae576110ae6126de565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561110857600080fd5b505af115801561111c573d6000803e3d6000fd5b505050506111273390565b601d600087600281111561113d5761113d612665565b8152602001908152602001600020600086848151811061115f5761115f6126de565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600060028111156111ac576111ac612665565b8560028111156111be576111be612665565b036111fd57816002018482815181106111d9576111d96126de565b6020908102919091018101518254600181018455600093845291909220015561127b565b600185600281111561121157611211612665565b0361122c57816003018482815181106111d9576111d96126de565b600285600281111561124057611240612665565b0361127b578160040184828151811061125b5761125b6126de565b602090810291909101810151825460018101845560009384529190922001555b8061128581612727565b915050610faa565b508251604080516001600160a01b0385168152602081019290925233917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6291015b60405180910390a25050600180555050565b6001600160a01b0381166000908152601c6020526040812060010154810361130a57506000919050565b6201518061131783611dad565b6001600160a01b0384166000908152601c602052604090206001015461133d9042612777565b6113479190612758565b61066d919061278e565b6000546001600160a01b0316331461137b5760405162461bcd60e51b815260040161069d9061267b565b611385600061200a565b565b60606000825167ffffffffffffffff8111156113a5576113a5612300565b6040519080825280602002602001820160405280156113ce578160200160208202803683370190505b50905060005b835181101561143657611400858583815181106113f3576113f36126de565b6020026020010151611b13565b828281518110611412576114126126de565b60ff909216602092830291909101909101528061142e81612727565b9150506113d4565b509392505050565b6002600154036114905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069d565b600260018190555060038260028111156114ac576114ac612665565b106114c95760405162461bcd60e51b815260040161069d906126b0565b60008151116115135760405162461bcd60e51b8152602060048201526016602482015275139bc81d1bdad95b8812591cc81cdc1958da599a595960521b604482015260640161069d565b6000600383600281111561152957611529612665565b60038110611539576115396126de565b01546001600160a01b0316905061154f33611fb4565b336000908152601c60205260408120905b83518110156119b057600084828151811061157d5761157d6126de565b60200260200101519050306001600160a01b0316846001600160a01b0316636352211e836040518263ffffffff1660e01b81526004016115bf91815260200190565b602060405180830381865afa1580156115dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160091906126f4565b6001600160a01b0316146116565760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e4964732070726f766964656400000000000000604482015260640161069d565b33601d600088600281111561166d5761166d612665565b8152602080820192909252604090810160009081208582529092529020546001600160a01b0316146116d35760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b604482015260640161069d565b6000601d60008860028111156116eb576116eb612665565b815260208082019290925260409081016000908120858252909252812080546001600160a01b0319166001600160a01b03939093169290921790915586600281111561173957611739612665565b036117df5761179a8360020180548060200260200160405190810160405280929190818152602001828054801561178f57602002820191906000526020600020905b81548152602001906001019080831161177b575b50505050508261205a565b80516117b091600286019160209091019061220c565b50826002018054806117c4576117c46127b0565b60019003818190600052602060002001600090559055611930565b60018660028111156117f3576117f3612665565b0361187c576118528360030180548060200260200160405190810160405280929190818152602001828054801561178f576020028201919060005260206000209081548152602001906001019080831161177b5750505050508261205a565b805161186891600386019160209091019061220c565b50826003018054806117c4576117c46127b0565b600286600281111561189057611890612665565b03611930576118ef8360040180548060200260200160405190810160405280929190818152602001828054801561178f576020028201919060005260206000209081548152602001906001019080831161177b5750505050508261205a565b805161190591600486019160209091019061220c565b5082600401805480611919576119196127b0565b600190038181906000526020600020016000905590555b60408051632142170760e11b81523060048201523360248201526044810183905290516001600160a01b038616916342842e0e91606480830192600092919082900301818387803b15801561198457600080fd5b505af1158015611998573d6000803e3d6000fd5b505050505080806119a890612727565b915050611560565b508251604080516001600160a01b0385168152602081019290925233917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb91016112ce565b6000546001600160a01b03163314611a1f5760405162461bcd60e51b815260040161069d9061267b565b60025460ff1615611a685760405162461bcd60e51b815260206004820152601360248201527214dd185ada5b99c81dd85cc8195b98589b1959606a1b604482015260640161069d565b6002805460ff19166001179055565b600080611a848484611b13565b9050600a846002811115611a9a57611a9a612665565b60038110611aaa57611aaa6126de565b600502018160ff1660058110611ac257611ac26126de565b0154949350505050565b6000601d6000846002811115611ae457611ae4612665565b8152602080820192909252604090810160009081208582529092529020546001600160a01b0316905092915050565b60006006836002811115611b2957611b29612665565b60038110611b3957611b396126de565b602081049091015460ff601f9092166101000a9004161515600003611b605750600061066d565b6000836002811115611b7457611b74612665565b03611bc8576019828154611b87906127c6565b8110611b9557611b956126de565b815460011615611bb45790600052602060002090602091828204019190065b9054901a600160f81b0260f81c905061066d565b6001836002811115611bdc57611bdc612665565b03611bef57601a828154611b87906127c6565b6002836002811115611c0357611c03612665565b03611c1657601b828154611b87906127c6565b50600092915050565b60606000825167ffffffffffffffff811115611c3d57611c3d612300565b604051908082528060200260200182016040528015611c66578160200160208202803683370190505b50905060005b835181101561143657611c9885858381518110611c8b57611c8b6126de565b6020026020010151611a77565b828281518110611caa57611caa6126de565b602090810291909101015280611cbf81612727565b915050611c6c565b6000546001600160a01b03163314611cf15760405162461bcd60e51b815260040161069d9061267b565b6007836002811115611d0557611d05612665565b60038110611d1557611d156126de565b01548260ff161115611d695760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642063617465676f7279206e756d626572000000000000000000604482015260640161069d565b80600a846002811115611d7e57611d7e612665565b60038110611d8e57611d8e6126de565b600502018360ff1660058110611da657611da66126de565b0155505050565b6001600160a01b0381166000908152601c60205260408120600281015460039091015482805b83811015611e3c576001600160a01b0386166000908152601c602052604081206002018054611e1e92919084908110611e0e57611e0e6126de565b9060005260206000200154611a77565b611e289083612740565b915080611e3481612727565b915050611dd3565b5060005b82811015611e9a576001600160a01b0386166000908152601c602052604090206003018054611e7c9160019184908110611e0e57611e0e6126de565b611e869083612740565b915080611e9281612727565b915050611e40565b50611ea485610b49565b611eae9082612740565b95945050505050565b60078160038110611ec757600080fd5b0154905081565b60038160038110611ede57600080fd5b01546001600160a01b0316905081565b600a8260038110611efe57600080fd5b600502018160058110611f1057600080fd5b01549150829050565b6000546001600160a01b03163314611f435760405162461bcd60e51b815260040161069d9061267b565b6001600160a01b038116611fa85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069d565b611fb18161200a565b50565b611fbd816112e0565b6001600160a01b0382166000908152601c602052604081208054909190611fe5908490612740565b90915550506001600160a01b03166000908152601c6020526040902042600190910155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606000806001855161206d9190612777565b855190915060005b818110156120c15785878281518110612090576120906126de565b6020026020010151036120af576120a8816001612740565b93506120c1565b806120b981612727565b915050612075565b50826000036121125760405162461bcd60e51b815260206004820152601b60248201527f6d73672e73656e646572206973206e6f7420746865206f776e65720000000000604482015260640161069d565b61211d600184612777565b925081831461217e57858281518110612138576121386126de565b6020026020010151868481518110612152576121526126de565b60200260200101818152505084868381518110612171576121716126de565b6020026020010181815250505b5093949350505050565b828054612194906127c6565b90600052602060002090601f0160209004810192826121b657600085556121fc565b82601f106121cf5782800160ff198235161785556121fc565b828001600101855582156121fc579182015b828111156121fc5782358255916020019190600101906121e1565b50612208929150612247565b5090565b8280548282559060005260206000209081019282156121fc579160200282015b828111156121fc57825182559160200191906001019061222c565b5b808211156122085760008155600101612248565b80356003811061226b57600080fd5b919050565b6001600160a01b0381168114611fb157600080fd5b6000806040838503121561229857600080fd5b6122a18361225c565b915060208301356122b181612270565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156122f4578351835292840192918401916001016122d8565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561232957600080fd5b6123328361225c565b915060208084013567ffffffffffffffff8082111561235057600080fd5b818601915086601f83011261236457600080fd5b81358181111561237657612376612300565b8060051b604051601f19603f8301168101818110858211171561239b5761239b612300565b6040529182528482019250838101850191898311156123b957600080fd5b938501935b828510156123d7578435845293850193928501926123be565b8096505050505050509250929050565b60008083601f8401126123f957600080fd5b50813567ffffffffffffffff81111561241157600080fd5b60208301915083602082850101111561242957600080fd5b9250929050565b60008060008060006080868803121561244857600080fd5b853561245381612270565b9450602086013561246381612270565b935060408601359250606086013567ffffffffffffffff81111561248657600080fd5b612492888289016123e7565b969995985093965092949392505050565b6000602082840312156124b557600080fd5b813561066a81612270565b6000806000604084860312156124d557600080fd5b6124de8461225c565b9250602084013567ffffffffffffffff8111156124fa57600080fd5b612506868287016123e7565b9497909650939450505050565b60006020828403121561252557600080fd5b8135801515811461066a57600080fd5b60008060006060848603121561254a57600080fd5b833561255581612270565b9250602084013561256581612270565b9150604084013561257581612270565b809150509250925092565b60006020828403121561259257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156122f457835160ff16835292840192918401916001016125b5565b600080604083850312156125e757600080fd5b6125f08361225c565b946020939093013593505050565b60008060006060848603121561261357600080fd5b61261c8461225c565b9250602084013560ff8116811461263257600080fd5b929592945050506040919091013590565b6000806040838503121561265657600080fd5b50508035926020909101359150565b634e487b7160e01b600052602160045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273139bdd0818481d985b1a590818dbdb9d1c9858dd60621b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561270657600080fd5b815161066a81612270565b634e487b7160e01b600052601160045260246000fd5b60006001820161273957612739612711565b5060010190565b6000821982111561275357612753612711565b500190565b600081600019048311821515161561277257612772612711565b500290565b60008282101561278957612789612711565b500390565b6000826127ab57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b600181811c908216806127da57607f821691505b6020821081036127fa57634e487b7160e01b600052602260045260246000fd5b5091905056fea26469706673582212206532c19d71ac81390ca909c4bf231ca95b64b59c4e648da7f11187c6c7403b0a64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e283dddc1d93e40e3748de182ff0219cd154372e
-----Decoded View---------------
Arg [0] : _token1 (address): 0xE283DDDc1d93E40E3748dE182Ff0219CD154372E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e283dddc1d93e40e3748de182ff0219cd154372e
Deployed Bytecode Sourcemap
2003:17037:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2615:25;;;;;;;;;;;;;;;179:14:9;;172:22;154:41;;142:2;127:18;2615:25:5;;;;;;;;17151:463;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12802:715::-;;;;;;:::i;:::-;;:::i;:::-;;12035:206;;;;;;:::i;:::-;12175:60;12035:206;;;;;;;;;;;-1:-1:-1;;;;;;4119:33:9;;;4101:52;;4089:2;4074:18;12035:206:5;3957:202:9;11182:151:5;;;;;;:::i;:::-;;:::i;:::-;;;4562:25:9;;;4550:2;4535:18;11182:151:5;4416:177:9;5812:455:5;;;;;;:::i;:::-;;:::i;12342:85::-;;;;;;:::i;:::-;;:::i;5407:213::-;;;;;;:::i;:::-;;:::i;14965:710::-;;;;;;:::i;:::-;;:::i;2801:30::-;;;;;;:::i;:::-;;:::i;6959:328::-;;;;;;:::i;:::-;;:::i;2405:53::-;;2446:12;2405:53;;8014:1464;;;;;;:::i;:::-;;:::i;16703:257::-;;;;;;:::i;:::-;;:::i;1661:101:6:-;;;:::i;7525:338:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1029:85:6:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:6;1029:85;;;-1:-1:-1;;;;;6919:32:9;;;6901:51;;6889:2;6874:18;1029:85:6;6755:203:9;4018:41:5;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;7137:25:9;;;7193:2;7178:18;;7171:34;;;;7110:18;4018:41:5;6963:248:9;9633:1389:5;;;;;;:::i;:::-;;:::i;12474:129::-;;;:::i;14510:239::-;;;;;;:::i;:::-;;:::i;17820:152::-;;;;;;:::i;:::-;;:::i;13764:508::-;;;;;;:::i;:::-;;:::i;:::-;;;7675:4:9;7663:17;;;7645:36;;7633:2;7618:18;13764:508:5;7503:184:9;11575:324:5;;;;;;:::i;:::-;;:::i;6469:295::-;;;;;;:::i;:::-;;:::i;15891:648::-;;;;;;:::i;:::-;;:::i;3418:73::-;;;;;;:::i;:::-;;:::i;2524:27::-;;;;;;;;;2696:32;;;;;;:::i;:::-;;:::i;3552:108::-;;;;;;:::i;:::-;;:::i;1911:198:6:-;;;;;;:::i;:::-;;:::i;17151:463:5:-;17241:16;;17314:20;17298:12;:36;;;;;;;;:::i;:::-;;17294:297;;-1:-1:-1;;;;;17353:15:5;;;;;;:7;:15;;;;;;;;;:28;;17344:37;;;;;;;;;;;;;;;;;17353:28;;17344:37;;17353:28;17344:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17294:297;;;17414:20;17398:12;:36;;;;;;;;:::i;:::-;;17394:197;;-1:-1:-1;;;;;17453:15:5;;;;;;:7;:15;;;;;;;;;:28;;17444:37;;;;;;;;;;;;;;;;;17453:28;;17444:37;;17453:28;17444:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17394:197;;;17514:21;17498:12;:37;;;;;;;;:::i;:::-;;17494:97;;-1:-1:-1;;;;;17554:15:5;;;;;;:7;:15;;;;;;;;;:30;;17545:39;;;;;;;;;;;;;;;;;17554:30;;17545:39;;17554:30;17545:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17494:97;17603:6;-1:-1:-1;17151:463:5;;;;;:::o;12802:715::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;;;;;;;;;12934:2:5::1;12915:8;:15;:21;;12907:50;;;::::0;-1:-1:-1;;;12907:50:5;;9084:2:9;12907:50:5::1;::::0;::::1;9066:21:9::0;9123:2;9103:18;;;9096:30;-1:-1:-1;;;9142:18:9;;;9135:46;9198:18;;12907:50:5::1;8882:340:9::0;12907:50:5::1;12992:21;12976:12;12971:18;;;;;;;;:::i;:::-;:42;12963:75;;;;-1:-1:-1::0;;;12963:75:5::1;;;;;;;:::i;:::-;13044:20;13067:14;13087:12;13082:18;;;;;;;;:::i;:::-;13067:34;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;13067:34:5::1;::::0;-1:-1:-1;13107:18:5::1;13067:34:::0;13107:12:::1;:18::i;:::-;13136:9;13131:382;13151:8;:15;13147:1;:19;13131:382;;;13181:16;13200:13;:33;13219:12;13214:18;;;;;;;;:::i;:::-;13200:33;;;;;;;;;;;:46;13234:8;13243:1;13234:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;13200:46;;;::::1;::::0;;;;;;-1:-1:-1;13200:46:5;;-1:-1:-1;;;;;13200:46:5::1;::::0;-1:-1:-1;13258:22:5;;;::::1;::::0;:85:::1;;;13338:4;-1:-1:-1::0;;;;;13284:59:5::1;13292:12;-1:-1:-1::0;;;;;13284:29:5::1;;13314:8;13323:1;13314:11;;;;;;;;:::i;:::-;;;;;;;13284:42;;;;;;;;;;;;;4562:25:9::0;;4550:2;4535:18;;4416:177;13284:42:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13284:59:5::1;;13258:85;13254:253;;;13363:12;-1:-1:-1::0;;;;;13355:34:5::1;;13398:4;13405:8;13415;13424:1;13415:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;13355:72:::1;::::0;-1:-1:-1;;;;;;13355:72:5::1;::::0;;;;;;-1:-1:-1;;;;;10222:15:9;;;13355:72:5::1;::::0;::::1;10204:34:9::0;10274:15;;;;10254:18;;;10247:43;10306:18;;;10299:34;10139:18;;13355:72:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13486:8;13495:1;13486:11;;;;;;;;:::i;:::-;;;;;;;13472:12;-1:-1:-1::0;;;;;13442:56:5::1;13462:8;-1:-1:-1::0;;;;;13442:56:5::1;;;;;;;;;;;13254:253;-1:-1:-1::0;13168:3:5;::::1;::::0;::::1;:::i;:::-;;;;13131:382;;;;12901:616;12802:715:::0;;:::o;11182:151::-;11246:7;11301:27;11321:6;11301:19;:27::i;:::-;-1:-1:-1;;;;;11268:15:5;;;;;;:7;:15;;;;;:30;:60;;;;:::i;5812:455::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;5963:4:5::1;5925:15;5946:12;5941:18;;;;;;;;:::i;:::-;5925:35;;;;;;;:::i;:::-;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;5993:20;5977:36;;;;;;;;:::i;:::-;:12;:36;;;;;;;;:::i;:::-;::::0;5973:290:::1;;6023:35;:17;6043:15:::0;;6023:35:::1;:::i;5973:290::-;6091:20;6075:12;:36;;;;;;;;:::i;:::-;::::0;6071:192:::1;;6121:35;:17;6141:15:::0;;6121:35:::1;:::i;6071:192::-;6189:21;6173:12;:37;;;;;;;;:::i;:::-;::::0;6169:94:::1;;6220:36;:18;6241:15:::0;;6220:36:::1;:::i;6169:94::-;5812:455:::0;;;:::o;12342:85::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;12400:13:5::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;12400:22:5;;::::1;::::0;;;::::1;::::0;;12342:85::o;5407:213::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;5508:14:5::1;:31:::0;;-1:-1:-1;;;;;5508:31:5;;::::1;-1:-1:-1::0;;;;;;5508:31:5;;::::1;;::::0;;;5545:22;:31;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5582:23;:33;;;;;::::1;::::0;::::1;;::::0;;5407:213::o;14965:710::-;-1:-1:-1;;;;;15083:20:5;;15039:7;15083:20;;;:7;:20;;;;;;;;:33;;;:40;15157:35;;;;15129:63;;;;;;;;;;;;;;;;;15083:40;;15039:7;;15129:63;;;;15157:35;15129:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15257:33;15293:18;15314:1;15293:22;;;;:::i;:::-;15257:58;;15321:26;15368:25;15350:8;:15;:43;:89;;15414:25;15350:89;;;15396:8;:15;15350:89;15321:118;;15446:25;15482:9;15477:163;15497:18;15493:1;:22;15477:163;;;15530:15;15548:8;15557:1;15548:11;;;;;;;;:::i;:::-;;;;;;;15530:29;;15588:45;15602:21;15625:7;15588:13;:45::i;:::-;15567:66;;;;:::i;:::-;;;15522:118;15517:3;;;;;:::i;:::-;;;;15477:163;;;-1:-1:-1;15653:17:5;14965:710;-1:-1:-1;;;;;;14965:710:5:o;2801:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6959:328::-;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;7094:23:5::1;7123:12;7118:18;;;;;;;;:::i;:::-;7094:43;;;;;;;:::i;:::-;;;7077:6;:13;:60;7069:89;;;::::0;-1:-1:-1;;;7069:89:5;;11124:2:9;7069:89:5::1;::::0;::::1;11106:21:9::0;11163:2;11143:18;;;11136:30;-1:-1:-1;;;11182:18:9;;;11175:46;11238:18;;7069:89:5::1;10922:340:9::0;7069:89:5::1;7169:9;7164:119;7184:6;:13;7180:1;:17;7164:119;;;7267:6;7274:1;7267:9;;;;;;;;:::i;:::-;;;;;;;7212:29;7247:12;7242:18;;;;;;;;:::i;:::-;7212:49;;;;;;;:::i;:::-;;;;7262:1;7212:52;;;;;;;:::i;:::-;;:64:::0;7199:3;::::1;::::0;::::1;:::i;:::-;;;;7164:119;;8014:1464:::0;1744:1:7;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:7;;11469:2:9;2317:63:7;;;11451:21:9;11508:2;11488:18;;;11481:30;11547:33;11527:18;;;11520:61;11598:18;;2317:63:7;11267:355:9;2317:63:7;1744:1;2455:7;:18;;;;8143:21:5::1;8127:12;8122:18;;;;;;;;:::i;:::-;:42;8114:75;;;;-1:-1:-1::0;;;8114:75:5::1;;;;;;;:::i;:::-;8204:13;::::0;::::1;::::0;::::1;;;8203:14;8195:41;;;::::0;-1:-1:-1;;;8195:41:5;;11829:2:9;8195:41:5::1;::::0;::::1;11811:21:9::0;11868:2;11848:18;;;11841:30;-1:-1:-1;;;11887:18:9;;;11880:44;11941:18;;8195:41:5::1;11627:338:9::0;8195:41:5::1;8250:15;::::0;::::1;;8242:47;;;::::0;-1:-1:-1;;;8242:47:5;;12172:2:9;8242:47:5::1;::::0;::::1;12154:21:9::0;12211:2;12191:18;;;12184:30;-1:-1:-1;;;12230:18:9;;;12223:49;12289:18;;8242:47:5::1;11970:343:9::0;8242:47:5::1;8321:1;8303:8;:15;:19;8295:54;;;::::0;-1:-1:-1;;;8295:54:5;;12520:2:9;8295:54:5::1;::::0;::::1;12502:21:9::0;12559:2;12539:18;;;12532:30;-1:-1:-1;;;12578:18:9;;;12571:52;12640:18;;8295:54:5::1;12318:346:9::0;8295:54:5::1;8355:20;8378:14;8398:12;8393:18;;;;;;;;:::i;:::-;8378:34;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;8378:34:5::1;::::0;-1:-1:-1;8419:27:5::1;719:10:0::0;8419:13:5::1;:27::i;:::-;719:10:0::0;8453:19:5::1;8475:21:::0;;;:7:::1;:21;::::0;;;;8523::::1;8507:12:::0;:37;;::::1;;;;;;:::i;:::-;::::0;8503:293:::1;;8725:17;::::0;;::::1;:24:::0;:28:::1;::::0;::::1;:::i;:::-;8706:15:::0;;8677:19:::1;::::0;::::1;:26:::0;:44:::1;::::0;8706:15;8677:44:::1;:::i;:::-;:76;;8669:120;;;::::0;-1:-1:-1;;;8669:120:5;;12871:2:9;8669:120:5::1;::::0;::::1;12853:21:9::0;12910:2;12890:18;;;12883:30;12949:33;12929:18;;;12922:61;13000:18;;8669:120:5::1;12669:355:9::0;8669:120:5::1;8807:9;8802:609;8822:8;:15;8818:1;:19;8802:609;;;719:10:0::0;-1:-1:-1;;;;;8860:58:5::1;8868:12;-1:-1:-1::0;;;;;8860:29:5::1;;8890:8;8899:1;8890:11;;;;;;;;:::i;:::-;;;;;;;8860:42;;;;;;;;;;;;;4562:25:9::0;;4550:2;4535:18;;4416:177;8860:42:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8860:58:5::1;;8852:84;;;::::0;-1:-1:-1;;;8852:84:5;;13231:2:9;8852:84:5::1;::::0;::::1;13213:21:9::0;13270:2;13250:18;;;13243:30;-1:-1:-1;;;13289:18:9;;;13282:43;13342:18;;8852:84:5::1;13029:337:9::0;8852:84:5::1;-1:-1:-1::0;;;;;8944:38:5;::::1;;719:10:0::0;9005:4:5::1;9012:8;9021:1;9012:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;8944:80:::1;::::0;-1:-1:-1;;;;;;8944:80:5::1;::::0;;;;;;-1:-1:-1;;;;;10222:15:9;;;8944:80:5::1;::::0;::::1;10204:34:9::0;10274:15;;;;10254:18;;;10247:43;10306:18;;;10299:34;10139:18;;8944:80:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9081:12;719:10:0::0;;640:96;9081:12:5::1;9032:13;:33;9051:12;9046:18;;;;;;;;:::i;:::-;9032:33;;;;;;;;;;;:46;9066:8;9075:1;9066:11;;;;;;;;:::i;:::-;;;;;;;9032:46;;;;;;;;;;;;:61;;;;;-1:-1:-1::0;;;;;9032:61:5::1;;;;;-1:-1:-1::0;;;;;9032:61:5::1;;;;;;9122:20;9106:36;;;;;;;;:::i;:::-;:12;:36;;;;;;;;:::i;:::-;::::0;9102:303:::1;;9154:4;:17;;9177:8;9186:1;9177:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;9154:35;;::::1;::::0;::::1;::::0;;-1:-1:-1;9154:35:5;;;;;;;::::1;::::0;9102:303:::1;;;9224:20;9208:12;:36;;;;;;;;:::i;:::-;::::0;9204:201:::1;;9256:4;:17;;9279:8;9288:1;9279:11;;;;;;;;:::i;9204:201::-;9326:21;9310:12;:37;;;;;;;;:::i;:::-;::::0;9306:99:::1;;9359:4;:19;;9384:8;9393:1;9384:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;9359:37;;::::1;::::0;::::1;::::0;;-1:-1:-1;9359:37:5;;;;;;;::::1;::::0;9306:99:::1;8839:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8802:609;;;-1:-1:-1::0;9457:15:5;;9421:52:::1;::::0;;-1:-1:-1;;;;;13563:32:9;;13545:51;;13627:2;13612:18;;13605:34;;;;719:10:0;;9421:52:5::1;::::0;13518:18:9;9421:52:5::1;;;;;;;;-1:-1:-1::0;;1701:1:7;2628:22;;-1:-1:-1;;8014:1464:5:o;16703:257::-;-1:-1:-1;;;;;16788:15:5;;16769:7;16788:15;;;:7;:15;;;;;:30;;;:35;;16784:64;;-1:-1:-1;16840:1:5;;16703:257;-1:-1:-1;16703:257:5:o;16784:64::-;2446:12;16914:23;16930:6;16914:15;:23::i;:::-;-1:-1:-1;;;;;16880:15:5;;;;;;:7;:15;;;;;:30;;;16862:48;;:15;:48;:::i;:::-;16861:76;;;;:::i;:::-;16860:95;;;;:::i;1661:101:6:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;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;7525:338:5:-;7634:14;7656:25;7696:8;:15;7684:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7684:28:5;;7656:56;;7723:9;7718:118;7738:8;:15;7734:1;:19;7718:118;;;7784:45;7803:12;7817:8;7826:1;7817:11;;;;;;;;:::i;:::-;;;;;;;7784:18;:45::i;:::-;7768:10;7779:1;7768:13;;;;;;;;:::i;:::-;:61;;;;:13;;;;;;;;;;;:61;7755:3;;;;:::i;:::-;;;;7718:118;;;-1:-1:-1;7848:10:5;7525:338;-1:-1:-1;;;7525:338:5:o;9633:1389::-;1744:1:7;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:7;;11469:2:9;2317:63:7;;;11451:21:9;11508:2;11488:18;;;11481:30;11547:33;11527:18;;;11520:61;11598:18;;2317:63:7;11267:355:9;2317:63:7;1744:1;2455:7;:18;;;;9763:21:5::1;9747:12;9742:18;;;;;;;;:::i;:::-;:42;9734:75;;;;-1:-1:-1::0;;;9734:75:5::1;;;;;;;:::i;:::-;9841:1;9823:8;:15;:19;9815:54;;;::::0;-1:-1:-1;;;9815:54:5;;12520:2:9;9815:54:5::1;::::0;::::1;12502:21:9::0;12559:2;12539:18;;;12532:30;-1:-1:-1;;;12578:18:9;;;12571:52;12640:18;;9815:54:5::1;12318:346:9::0;9815:54:5::1;9875:20;9898:14;9918:12;9913:18;;;;;;;;:::i;:::-;9898:34;;;;;;;:::i;:::-;;::::0;-1:-1:-1;;;;;9898:34:5::1;::::0;-1:-1:-1;9939:27:5::1;719:10:0::0;8419:13:5::1;:27::i;9939:::-;719:10:0::0;9973:19:5::1;9995:21:::0;;;:7:::1;:21;::::0;;;;;10023:930:::1;10043:8;:15;10039:1;:19;10023:930;;;10073:15;10091:8;10100:1;10091:11;;;;;;;;:::i;:::-;;;;;;;10073:29;;10168:4;-1:-1:-1::0;;;;;10118:55:5::1;10126:12;-1:-1:-1::0;;;;;10118:29:5::1;;10148:7;10118:38;;;;;;;;;;;;;4562:25:9::0;;4550:2;4535:18;;4416:177;10118:38:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10118:55:5::1;;10110:93;;;::::0;-1:-1:-1;;;10110:93:5;;14204:2:9;10110:93:5::1;::::0;::::1;14186:21:9::0;14243:2;14223:18;;;14216:30;14282:27;14262:18;;;14255:55;14327:18;;10110:93:5::1;14002:349:9::0;10110:93:5::1;719:10:0::0;10219:13:5::1;:33;10238:12:::0;10233:18:::1;::::0;::::1;;;;;;:::i;:::-;10219:33:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;10219:33:5;;;:42;;;;;;;;;-1:-1:-1;;;;;10219:42:5::1;:58;10211:86;;;::::0;-1:-1:-1;;;10211:86:5;;14558:2:9;10211:86:5::1;::::0;::::1;14540:21:9::0;14597:2;14577:18;;;14570:30;-1:-1:-1;;;14616:18:9;;;14609:45;14671:18;;10211:86:5::1;14356:339:9::0;10211:86:5::1;10358:1;10305:13;:33;10324:12;10319:18;;;;;;;;:::i;:::-;10305:33:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;10305:33:5;;;:42;;;;;;;;:55;;-1:-1:-1;;;;;;10305:55:5::1;-1:-1:-1::0;;;;;10305:55:5;;;::::1;::::0;;;::::1;::::0;;;10373:12:::1;:36;;;;;;;;:::i;:::-;::::0;10369:493:::1;;10441:44;10458:4;:17;;10441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10477:7;10441:16;:44::i;:::-;10421:64:::0;;::::1;::::0;:17:::1;::::0;::::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;10495:4;:17;;:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10369:493;;;10553:20;10537:12;:36;;;;;;;;:::i;:::-;::::0;10533:329:::1;;10605:44;10622:4;:17;;10605:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10641:7;10605:16;:44::i;:::-;10585:64:::0;;::::1;::::0;:17:::1;::::0;::::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;10659:4;:17;;:23;;;;;;;:::i;10533:329::-;10717:21;10701:12;:37;;;;;;;;:::i;:::-;::::0;10697:165:::1;;10772:46;10789:4;:19;;10772:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10810:7;10772:16;:46::i;:::-;10750:68:::0;;::::1;::::0;:19:::1;::::0;::::1;::::0;:68:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;10828:4;:19;;:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10697:165;10870:76;::::0;;-1:-1:-1;;;10870:76:5;;10917:4:::1;10870:76;::::0;::::1;10204:34:9::0;719:10:0;10254:18:9;;;10247:43;10306:18;;;10299:34;;;10870:76:5;;-1:-1:-1;;;;;10870:38:5;::::1;::::0;::::1;::::0;10139:18:9;;;;;-1:-1:-1;;10870:76:5;;;;;;;-1:-1:-1;10870:38:5;:76;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10065:888;10060:3;;;;;:::i;:::-;;;;10023:930;;;-1:-1:-1::0;11001:15:5;;10964:53:::1;::::0;;-1:-1:-1;;;;;13563:32:9;;13545:51;;13627:2;13612:18;;13605:34;;;;719:10:0;;10964:53:5::1;::::0;13518:18:9;10964:53:5::1;13371:274:9::0;12474:129:5;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;12531:15:5::1;::::0;::::1;;12530:16;12522:48;;;::::0;-1:-1:-1;;;12522:48:5;;15034:2:9;12522:48:5::1;::::0;::::1;15016:21:9::0;15073:2;15053:18;;;15046:30;-1:-1:-1;;;15092:18:9;;;15085:49;15151:18;;12522:48:5::1;14832:343:9::0;12522:48:5::1;12576:15;:22:::0;;-1:-1:-1;;12576:22:5::1;12594:4;12576:22;::::0;;12474:129::o;14510:239::-;14599:7;14614:14;14631:41;14650:12;14664:7;14631:18;:41::i;:::-;14614:58;;14685:29;14720:12;14715:18;;;;;;;;:::i;:::-;14685:49;;;;;;;:::i;:::-;;;;14735:8;14685:59;;;;;;;;;:::i;:::-;;;;14510:239;-1:-1:-1;;;;14510:239:5:o;17820:152::-;17903:7;17925:13;:33;17944:12;17939:18;;;;;;;;:::i;:::-;17925:33;;;;;;;;;;;;;;-1:-1:-1;17925:33:5;;;:42;;;;;;;;;-1:-1:-1;;;;;17925:42:5;;-1:-1:-1;17820:152:5;;;;:::o;13764:508::-;13858:5;13875:15;13896:12;13891:18;;;;;;;;:::i;:::-;13875:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:44;;13914:5;13875:44;13871:73;;-1:-1:-1;13936:1:5;13929:8;;13871:73;13969:20;13953:12;:36;;;;;;;;:::i;:::-;;13949:305;;14012:17;14030:7;14012:26;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14012:26:5;14006:33;;13999:40;;;;13949:305;14072:20;14056:12;:36;;;;;;;;:::i;:::-;;14052:202;;14115:17;14133:7;14115:26;;;;;:::i;14052:202::-;14175:21;14159:12;:37;;;;;;;;:::i;:::-;;14155:99;;14219:18;14238:7;14219:27;;;;;:::i;14155:99::-;-1:-1:-1;14266:1:5;13764:508;;;;:::o;11575:324::-;11681:16;11705:23;11745:8;:15;11731:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11731:30:5;;11705:56;;11772:9;11767:109;11787:8;:15;11783:1;:19;11767:109;;;11829:40;11843:12;11857:8;11866:1;11857:11;;;;;;;;:::i;:::-;;;;;;;11829:13;:40::i;:::-;11817:6;11824:1;11817:9;;;;;;;;:::i;:::-;;;;;;;;;;:52;11804:3;;;;:::i;:::-;;;;11767:109;;6469:295;1075:7:6;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;1241:23:6;1233:68;;;;-1:-1:-1;;;1233:68:6;;;;;;;:::i;:::-;6615:23:5::1;6644:12;6639:18;;;;;;;;:::i;:::-;6615:43;;;;;;;:::i;:::-;;;6603:8;:55;;;;6595:91;;;::::0;-1:-1:-1;;;6595:91:5;;15767:2:9;6595:91:5::1;::::0;::::1;15749:21:9::0;15806:2;15786:18;;;15779:30;15845:25;15825:18;;;15818:53;15888:18;;6595:91:5::1;15565:347:9::0;6595:91:5::1;6754:5;6692:29;6727:12;6722:18;;;;;;;;:::i;:::-;6692:49;;;;;;;:::i;:::-;;;;6742:8;6692:59;;;;;;;;;:::i;:::-;;:67:::0;-1:-1:-1;;;6469:295:5:o;15891:648::-;-1:-1:-1;;;;;16002:20:5;;15958:7;16002:20;;;:7;:20;;;;;:33;;;:40;16077:33;;;;:40;15958:7;;16150:149;16170:18;16166:1;:22;16150:149;;;-1:-1:-1;;;;;16255:20:5;;16233;16255;;;:7;:20;;;;;:33;;:36;;16219:73;;16233:20;16255:33;16289:1;;16255:36;;;;;;:::i;:::-;;;;;;;;;16219:13;:73::i;:::-;16203:89;;;;:::i;:::-;;-1:-1:-1;16190:3:5;;;;:::i;:::-;;;;16150:149;;;;16309:9;16304:149;16324:18;16320:1;:22;16304:149;;;-1:-1:-1;;;;;16409:20:5;;;;;;:7;:20;;;;;:33;;:36;;16373:73;;16387:20;;16443:1;;16409:36;;;;;;:::i;16373:73::-;16357:89;;;;:::i;:::-;;-1:-1:-1;16344:3:5;;;;:::i;:::-;;;;16304:149;;;;16474:35;16497:11;16474:22;:35::i;:::-;16458:51;;;;:::i;:::-;;15891:648;-1:-1:-1;;;;;15891:648:5:o;3418:73::-;;;;;;;;;;;;;;;-1:-1:-1;3418:73:5;:::o;2696:32::-;;;;;;;;;;;;;;-1:-1:-1;;;;;2696:32:5;;-1:-1:-1;2696:32:5;:::o;3552:108::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3552:108:5;;-1:-1:-1;3552:108:5:o;1911:198:6:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:6;719:10:0;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;;16119:2:9;1991:73:6::1;::::0;::::1;16101:21:9::0;16158:2;16138:18;;;16131:30;16197:34;16177:18;;;16170:62;-1:-1:-1;;;16248:18:9;;;16241:36;16294:19;;1991:73:6::1;15917:402:9::0;1991:73:6::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;18864:174:5:-;18952:27;18972:6;18952:19;:27::i;:::-;-1:-1:-1;;;;;18918:15:5;;;;;;:7;:15;;;;;:61;;:15;;;:61;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18985:15:5;;;;;:7;:15;;;;;19018;18985:30;;;;:48;18864:174::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;18170:586:5:-;18259:16;18283:18;18311:22;18350:1;18336:4;:11;:15;;;;:::i;:::-;18374:11;;18311:40;;-1:-1:-1;18357:14:5;18392:127;18416:6;18412:1;:10;18392:127;;;18452:7;18441:4;18446:1;18441:7;;;;;;;;:::i;:::-;;;;;;;:18;18437:76;;18484:5;:1;18488;18484:5;:::i;:::-;18471:18;;18499:5;;18437:76;18424:3;;;;:::i;:::-;;;;18392:127;;;;18532:10;18546:1;18532:15;18524:55;;;;-1:-1:-1;;;18524:55:5;;16526:2:9;18524:55:5;;;16508:21:9;16565:2;16545:18;;;16538:30;16604:29;16584:18;;;16577:57;16651:18;;18524:55:5;16324:351:9;18524:55:5;18586:15;18600:1;18586:15;;:::i;:::-;;;18626:14;18612:10;:28;18608:126;;18669:4;18674:14;18669:20;;;;;;;;:::i;:::-;;;;;;;18650:4;18655:10;18650:16;;;;;;;;:::i;:::-;;;;;;:39;;;;;18720:7;18697:4;18702:14;18697:20;;;;;;;;:::i;:::-;;;;;;:30;;;;;18608:126;-1:-1:-1;18747:4:5;;18170:586;-1:-1:-1;;;;18170:586:5:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;206:154:9;285:20;;334:1;324:12;;314:40;;350:1;347;340:12;314:40;206:154;;;:::o;365:131::-;-1:-1:-1;;;;;440:31:9;;430:42;;420:70;;486:1;483;476:12;501:349;586:6;594;647:2;635:9;626:7;622:23;618:32;615:52;;;663:1;660;653:12;615:52;686:40;716:9;686:40;:::i;:::-;676:50;;776:2;765:9;761:18;748:32;789:31;814:5;789:31;:::i;:::-;839:5;829:15;;;501:349;;;;;:::o;855:632::-;1026:2;1078:21;;;1148:13;;1051:18;;;1170:22;;;997:4;;1026:2;1249:15;;;;1223:2;1208:18;;;997:4;1292:169;1306:6;1303:1;1300:13;1292:169;;;1367:13;;1355:26;;1436:15;;;;1401:12;;;;1328:1;1321:9;1292:169;;;-1:-1:-1;1478:3:9;;855:632;-1:-1:-1;;;;;;855:632:9:o;1492:127::-;1553:10;1548:3;1544:20;1541:1;1534:31;1584:4;1581:1;1574:15;1608:4;1605:1;1598:15;1624:1217;1734:6;1742;1795:2;1783:9;1774:7;1770:23;1766:32;1763:52;;;1811:1;1808;1801:12;1763:52;1834:40;1864:9;1834:40;:::i;:::-;1824:50;;1893:2;1946;1935:9;1931:18;1918:32;1969:18;2010:2;2002:6;1999:14;1996:34;;;2026:1;2023;2016:12;1996:34;2064:6;2053:9;2049:22;2039:32;;2109:7;2102:4;2098:2;2094:13;2090:27;2080:55;;2131:1;2128;2121:12;2080:55;2167:2;2154:16;2189:2;2185;2182:10;2179:36;;;2195:18;;:::i;:::-;2241:2;2238:1;2234:10;2273:2;2267:9;2336:2;2332:7;2327:2;2323;2319:11;2315:25;2307:6;2303:38;2391:6;2379:10;2376:22;2371:2;2359:10;2356:18;2353:46;2350:72;;;2402:18;;:::i;:::-;2438:2;2431:22;2488:18;;;2522:15;;;;-1:-1:-1;2564:11:9;;;2560:20;;;2592:19;;;2589:39;;;2624:1;2621;2614:12;2589:39;2648:11;;;;2668:142;2684:6;2679:3;2676:15;2668:142;;;2750:17;;2738:30;;2701:12;;;;2788;;;;2668:142;;;2829:6;2819:16;;;;;;;;1624:1217;;;;;:::o;2846:347::-;2897:8;2907:6;2961:3;2954:4;2946:6;2942:17;2938:27;2928:55;;2979:1;2976;2969:12;2928:55;-1:-1:-1;3002:20:9;;3045:18;3034:30;;3031:50;;;3077:1;3074;3067:12;3031:50;3114:4;3106:6;3102:17;3090:29;;3166:3;3159:4;3150:6;3142;3138:19;3134:30;3131:39;3128:59;;;3183:1;3180;3173:12;3128:59;2846:347;;;;;:::o;3198:754::-;3295:6;3303;3311;3319;3327;3380:3;3368:9;3359:7;3355:23;3351:33;3348:53;;;3397:1;3394;3387:12;3348:53;3436:9;3423:23;3455:31;3480:5;3455:31;:::i;:::-;3505:5;-1:-1:-1;3562:2:9;3547:18;;3534:32;3575:33;3534:32;3575:33;:::i;:::-;3627:7;-1:-1:-1;3681:2:9;3666:18;;3653:32;;-1:-1:-1;3736:2:9;3721:18;;3708:32;3763:18;3752:30;;3749:50;;;3795:1;3792;3785:12;3749:50;3834:58;3884:7;3875:6;3864:9;3860:22;3834:58;:::i;:::-;3198:754;;;;-1:-1:-1;3198:754:9;;-1:-1:-1;3911:8:9;;3808:84;3198:754;-1:-1:-1;;;3198:754:9:o;4164:247::-;4223:6;4276:2;4264:9;4255:7;4251:23;4247:32;4244:52;;;4292:1;4289;4282:12;4244:52;4331:9;4318:23;4350:31;4375:5;4350:31;:::i;4598:511::-;4694:6;4702;4710;4763:2;4751:9;4742:7;4738:23;4734:32;4731:52;;;4779:1;4776;4769:12;4731:52;4802:40;4832:9;4802:40;:::i;:::-;4792:50;;4893:2;4882:9;4878:18;4865:32;4920:18;4912:6;4909:30;4906:50;;;4952:1;4949;4942:12;4906:50;4991:58;5041:7;5032:6;5021:9;5017:22;4991:58;:::i;:::-;4598:511;;5068:8;;-1:-1:-1;4965:84:9;;-1:-1:-1;;;;4598:511:9:o;5114:273::-;5170:6;5223:2;5211:9;5202:7;5198:23;5194:32;5191:52;;;5239:1;5236;5229:12;5191:52;5278:9;5265:23;5331:5;5324:13;5317:21;5310:5;5307:32;5297:60;;5353:1;5350;5343:12;5392:529;5469:6;5477;5485;5538:2;5526:9;5517:7;5513:23;5509:32;5506:52;;;5554:1;5551;5544:12;5506:52;5593:9;5580:23;5612:31;5637:5;5612:31;:::i;:::-;5662:5;-1:-1:-1;5719:2:9;5704:18;;5691:32;5732:33;5691:32;5732:33;:::i;:::-;5784:7;-1:-1:-1;5843:2:9;5828:18;;5815:32;5856:33;5815:32;5856:33;:::i;:::-;5908:7;5898:17;;;5392:529;;;;;:::o;5926:180::-;5985:6;6038:2;6026:9;6017:7;6013:23;6009:32;6006:52;;;6054:1;6051;6044:12;6006:52;-1:-1:-1;6077:23:9;;5926:180;-1:-1:-1;5926:180:9:o;6111:639::-;6278:2;6330:21;;;6400:13;;6303:18;;;6422:22;;;6249:4;;6278:2;6501:15;;;;6475:2;6460:18;;;6249:4;6544:180;6558:6;6555:1;6552:13;6544:180;;;6623:13;;6638:4;6619:24;6607:37;;6699:15;;;;6664:12;;;;6580:1;6573:9;6544:180;;7216:282;7301:6;7309;7362:2;7350:9;7341:7;7337:23;7333:32;7330:52;;;7378:1;7375;7368:12;7330:52;7401:40;7431:9;7401:40;:::i;:::-;7391:50;7488:2;7473:18;;;;7460:32;;-1:-1:-1;;;7216:282:9:o;7692:439::-;7784:6;7792;7800;7853:2;7841:9;7832:7;7828:23;7824:32;7821:52;;;7869:1;7866;7859:12;7821:52;7892:40;7922:9;7892:40;:::i;:::-;7882:50;;7982:2;7971:9;7967:18;7954:32;8026:4;8019:5;8015:16;8008:5;8005:27;7995:55;;8046:1;8043;8036:12;7995:55;7692:439;;8069:5;;-1:-1:-1;;;8121:2:9;8106:18;;;;8093:32;;7692:439::o;8136:248::-;8204:6;8212;8265:2;8253:9;8244:7;8240:23;8236:32;8233:52;;;8281:1;8278;8271:12;8233:52;-1:-1:-1;;8304:23:9;;;8374:2;8359:18;;;8346:32;;-1:-1:-1;8136:248:9:o;8389:127::-;8450:10;8445:3;8441:20;8438:1;8431:31;8481:4;8478:1;8471:15;8505:4;8502:1;8495:15;8521:356;8723:2;8705:21;;;8742:18;;;8735:30;8801:34;8796:2;8781:18;;8774:62;8868:2;8853:18;;8521:356::o;9227:344::-;9429:2;9411:21;;;9468:2;9448:18;;;9441:30;-1:-1:-1;;;9502:2:9;9487:18;;9480:50;9562:2;9547:18;;9227:344::o;9576:127::-;9637:10;9632:3;9628:20;9625:1;9618:31;9668:4;9665:1;9658:15;9692:4;9689:1;9682:15;9708:251;9778:6;9831:2;9819:9;9810:7;9806:23;9802:32;9799:52;;;9847:1;9844;9837:12;9799:52;9879:9;9873:16;9898:31;9923:5;9898:31;:::i;10344:127::-;10405:10;10400:3;10396:20;10393:1;10386:31;10436:4;10433:1;10426:15;10460:4;10457:1;10450:15;10476:135;10515:3;10536:17;;;10533:43;;10556:18;;:::i;:::-;-1:-1:-1;10603:1:9;10592:13;;10476:135::o;10616:128::-;10656:3;10687:1;10683:6;10680:1;10677:13;10674:39;;;10693:18;;:::i;:::-;-1:-1:-1;10729:9:9;;10616:128::o;10749:168::-;10789:7;10855:1;10851;10847:6;10843:14;10840:1;10837:21;10832:1;10825:9;10818:17;10814:45;10811:71;;;10862:18;;:::i;:::-;-1:-1:-1;10902:9:9;;10749:168::o;13650:125::-;13690:4;13718:1;13715;13712:8;13709:34;;;13723:18;;:::i;:::-;-1:-1:-1;13760:9:9;;13650:125::o;13780:217::-;13820:1;13846;13836:132;;13890:10;13885:3;13881:20;13878:1;13871:31;13925:4;13922:1;13915:15;13953:4;13950:1;13943:15;13836:132;-1:-1:-1;13982:9:9;;13780:217::o;14700:127::-;14761:10;14756:3;14752:20;14749:1;14742:31;14792:4;14789:1;14782:15;14816:4;14813:1;14806:15;15180:380;15259:1;15255:12;;;;15302;;;15323:61;;15377:4;15369:6;15365:17;15355:27;;15323:61;15430:2;15422:6;15419:14;15399:18;15396:38;15393:161;;15476:10;15471:3;15467:20;15464:1;15457:31;15511:4;15508:1;15501:15;15539:4;15536:1;15529:15;15393:161;;15180:380;;;:::o
Swarm Source
ipfs://6532c19d71ac81390ca909c4bf231ca95b64b59c4e648da7f11187c6c7403b0a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.