More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,570 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20039104 | 233 days ago | IN | 0 ETH | 0.00091442 | ||||
Withdraw | 20039086 | 233 days ago | IN | 0 ETH | 0.00124685 | ||||
Withdraw | 20039058 | 233 days ago | IN | 0 ETH | 0.00121575 | ||||
Deposit | 18311420 | 475 days ago | IN | 0 ETH | 0.00032143 | ||||
Withdraw | 18181386 | 493 days ago | IN | 0 ETH | 0.00087955 | ||||
Withdraw | 18181384 | 493 days ago | IN | 0 ETH | 0.00116593 | ||||
Withdraw | 18181377 | 493 days ago | IN | 0 ETH | 0.00109003 | ||||
Withdraw | 18181374 | 493 days ago | IN | 0 ETH | 0.00109985 | ||||
Withdraw | 18094579 | 505 days ago | IN | 0 ETH | 0.00172325 | ||||
Withdraw | 18094577 | 505 days ago | IN | 0 ETH | 0.00176476 | ||||
Withdraw | 18094574 | 505 days ago | IN | 0 ETH | 0.00330539 | ||||
Withdraw | 17603678 | 574 days ago | IN | 0 ETH | 0.00118781 | ||||
Withdraw | 17603650 | 574 days ago | IN | 0 ETH | 0.00088138 | ||||
Withdraw | 17479422 | 591 days ago | IN | 0 ETH | 0.00667052 | ||||
Withdraw | 16970792 | 663 days ago | IN | 0 ETH | 0.00855573 | ||||
Deposit | 16889987 | 675 days ago | IN | 0 ETH | 0.00275756 | ||||
Withdraw | 16773720 | 691 days ago | IN | 0 ETH | 0.00145478 | ||||
Deposit | 16686802 | 703 days ago | IN | 0 ETH | 0.00591445 | ||||
Withdraw | 16675992 | 705 days ago | IN | 0 ETH | 0.00451646 | ||||
Withdraw | 16579940 | 718 days ago | IN | 0 ETH | 0.0078323 | ||||
Withdraw | 16579937 | 718 days ago | IN | 0 ETH | 0.00599855 | ||||
Withdraw | 16579787 | 718 days ago | IN | 0 ETH | 0.00898881 | ||||
Withdraw | 16395122 | 744 days ago | IN | 0 ETH | 0.00217451 | ||||
Deposit | 16286878 | 759 days ago | IN | 0 ETH | 0.00229375 | ||||
Deposit | 16286831 | 759 days ago | IN | 0 ETH | 0.003497 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
WastedWorld
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-02 */ /** *Submitted for verification at Etherscan.io on 2022-02-27 */ // SPDX-License-Identifier: MIT 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); } } /** * @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); } /** * @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; } } /** * @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; } } /** * @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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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)); } } /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, 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); } /** * @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; } /** * @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); } } contract WastedWorld is Ownable, ReentrancyGuard { uint256 public constant SECONDS_IN_DAY = 24 * 60 * 60; uint256 public constant ACCELERATED_YIELD_DAYS = 2; uint256 public constant ACCELERATED_YIELD_MULTIPLIER = 2; uint256 public acceleratedYield; address public signerAddress; address[] public authorisedLog; bool public stakingLaunched; bool public depositPaused; struct Staker { uint256 currentYield; uint256 accumulatedAmount; uint256 lastCheckpoint; } mapping(address => bool) isWWNftContract; mapping(address => mapping(address => uint256[])) stakedTokensForAddress; mapping(address => uint256) public _baseRates; mapping(address => Staker) private _stakers; mapping(address => mapping(uint256 => address)) private _ownerOfToken; mapping(address => mapping(uint256 => uint256)) private _tokensMultiplier; mapping(address => bool) private _authorised; event Deposit(address indexed staker,address contractAddress,uint256 tokensAmount); event Withdraw(address indexed staker,address contractAddress,uint256 tokensAmount); event AutoDeposit(address indexed contractAddress,uint256 tokenId,address indexed owner); event WithdrawStuckERC721(address indexed receiver, address indexed tokenAddress, uint256 indexed tokenId); constructor( address _pre, address _signer ) { _baseRates[_pre] = 4200 ether; isWWNftContract[_pre] = true; signerAddress = _signer; } modifier authorised() { require(_authorised[_msgSender()], "The token contract is not authorised"); _; } function deposit( address contractAddress, uint256[] memory tokenIds, uint256[] memory tokenTraits, bytes calldata signature ) public nonReentrant { require(!depositPaused, "Deposit paused"); require(stakingLaunched, "Staking is not launched yet"); require( contractAddress != address(0) && isWWNftContract[contractAddress], "Unknown contract" ); if (tokenTraits.length > 0) { require(_validateSignature( signature, contractAddress, tokenIds, tokenTraits ), "Invalid data provided"); _setTokensValues(contractAddress, tokenIds, tokenTraits); } Staker storage user = _stakers[_msgSender()]; uint256 newYield = user.currentYield; for (uint256 i; i < tokenIds.length; i++) { require(IERC721(contractAddress).ownerOf(tokenIds[i]) == _msgSender(), "Not the owner"); IERC721(contractAddress).safeTransferFrom(_msgSender(), address(this), tokenIds[i]); _ownerOfToken[contractAddress][tokenIds[i]] = _msgSender(); newYield += getTokenYield(contractAddress, tokenIds[i]); stakedTokensForAddress[_msgSender()][contractAddress].push(tokenIds[i]); } accumulate(_msgSender()); user.currentYield = newYield; emit Deposit(_msgSender(), contractAddress, tokenIds.length); } function withdraw( address contractAddress, uint256[] memory tokenIds ) public nonReentrant { require( contractAddress != address(0) && isWWNftContract[contractAddress], "Unknown contract" ); Staker storage user = _stakers[_msgSender()]; uint256 newYield = user.currentYield; for (uint256 i; i < tokenIds.length; i++) { require(IERC721(contractAddress).ownerOf(tokenIds[i]) == address(this), "Not the owner"); _ownerOfToken[contractAddress][tokenIds[i]] = address(0); if (user.currentYield != 0) { uint256 tokenYield = getTokenYield(contractAddress, tokenIds[i]); newYield -= tokenYield; } stakedTokensForAddress[_msgSender()][contractAddress] = _moveTokenInTheList(stakedTokensForAddress[_msgSender()][contractAddress], tokenIds[i]); stakedTokensForAddress[_msgSender()][contractAddress].pop(); IERC721(contractAddress).safeTransferFrom(address(this), _msgSender(), tokenIds[i]); } accumulate(_msgSender()); user.currentYield = newYield; emit Withdraw(_msgSender(), contractAddress, tokenIds.length); } function registerDeposit(address owner, address contractAddress, uint256 tokenId) public authorised { require( contractAddress != address(0) && isWWNftContract[contractAddress], "Unknown contract" ); require(IERC721(contractAddress).ownerOf(tokenId) == address(this), "!Owner"); require(ownerOf(contractAddress, tokenId) == address(0), "Already deposited"); _ownerOfToken[contractAddress][tokenId] = owner; Staker storage user = _stakers[owner]; uint256 newYield = user.currentYield; newYield += getTokenYield(contractAddress, tokenId); stakedTokensForAddress[owner][contractAddress].push(tokenId); accumulate(owner); user.currentYield = newYield; emit AutoDeposit(contractAddress, tokenId, _msgSender()); } function getAccumulatedAmount(address staker) external view returns (uint256) { return _stakers[staker].accumulatedAmount + getCurrentReward(staker); } function getTokenYield(address contractAddress, uint256 tokenId) public view returns (uint256) { uint256 tokenYield = _tokensMultiplier[contractAddress][tokenId]; if (tokenYield == 0) { tokenYield = _baseRates[contractAddress]; } return tokenYield; } function getStakerYield(address staker) public view returns (uint256) { return _stakers[staker].currentYield; } function getStakerTokens(address staker, address contractAddress) public view returns (uint256[] memory) { return (stakedTokensForAddress[staker][contractAddress]); } function isMultiplierSet(address contractAddress, uint256 tokenId) public view returns (bool) { return _tokensMultiplier[contractAddress][tokenId] > 0; } function _moveTokenInTheList(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; } function _validateSignature( bytes calldata signature, address contractAddress, uint256[] memory tokenIds, uint256[] memory tokenTraits ) internal view returns (bool) { bytes32 dataHash = keccak256(abi.encodePacked(contractAddress, tokenIds, tokenTraits)); bytes32 message = ECDSA.toEthSignedMessageHash(dataHash); address receivedAddress = ECDSA.recover(message, signature); return (receivedAddress != address(0) && receivedAddress == signerAddress); } function _setTokensValues( address contractAddress, uint256[] memory tokenIds, uint256[] memory tokenTraits ) internal { require(tokenIds.length == tokenTraits.length, "Wrong arrays provided"); for (uint256 i; i < tokenIds.length; i++) { if (tokenTraits[i] != 0 && tokenTraits[i] <= 8000 ether) { _tokensMultiplier[contractAddress][tokenIds[i]] = tokenTraits[i]; } } } function getCurrentReward(address staker) public view returns (uint256) { Staker memory user = _stakers[staker]; if (user.lastCheckpoint == 0) { return 0; } if (user.lastCheckpoint < acceleratedYield && block.timestamp < acceleratedYield) { return (block.timestamp - user.lastCheckpoint) * user.currentYield / SECONDS_IN_DAY * ACCELERATED_YIELD_MULTIPLIER; } if (user.lastCheckpoint < acceleratedYield && block.timestamp > acceleratedYield) { uint256 currentReward; currentReward += (acceleratedYield - user.lastCheckpoint) * user.currentYield / SECONDS_IN_DAY * ACCELERATED_YIELD_MULTIPLIER; currentReward += (block.timestamp - acceleratedYield) * user.currentYield / SECONDS_IN_DAY; return currentReward; } return (block.timestamp - user.lastCheckpoint) * user.currentYield / SECONDS_IN_DAY; } function accumulate(address staker) internal { _stakers[staker].accumulatedAmount += getCurrentReward(staker); _stakers[staker].lastCheckpoint = block.timestamp; } /** * @dev Returns token owner address (returns address(0) if token is not inside the gateway) */ function ownerOf(address contractAddress, uint256 tokenId) public view returns (address) { return _ownerOfToken[contractAddress][tokenId]; } function addNFTContract(address _contract, uint256 _baseReward) public onlyOwner { _baseRates[_contract] = _baseReward; isWWNftContract[_contract] = true; } /** * @dev Admin function to authorise the contract address */ function authorise(address toAuth) public onlyOwner { _authorised[toAuth] = true; authorisedLog.push(toAuth); } /** * @dev Function allows admin add unauthorised address. */ function unauthorise(address addressToUnAuth) public onlyOwner { _authorised[addressToUnAuth] = false; } /** * @dev Function allows admin withdraw ERC721 in case of emergency. */ function emergencyWithdraw(address tokenAddress, uint256[] memory tokenIds) public onlyOwner { require(tokenIds.length <= 50, "50 is max per tx"); pauseDeposit(true); for (uint256 i; i < tokenIds.length; i++) { address receiver = _ownerOfToken[tokenAddress][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]); } } } /** * @dev Function allows to pause deposits if needed. Withdraw remains active. */ function pauseDeposit(bool _pause) public onlyOwner { depositPaused = _pause; } /** * @dev Function allows to pause deposits if needed. Withdraw remains active. */ function updateSignerAddress(address _signer) public onlyOwner { signerAddress = _signer; } function launchStaking() public onlyOwner { require(!stakingLaunched, "Staking has been launched already"); stakingLaunched = true; acceleratedYield = block.timestamp + (SECONDS_IN_DAY * ACCELERATED_YIELD_DAYS); } function updateBaseYield(address _contract, uint256 _yield) public onlyOwner { _baseRates[_contract] = _yield; } function onERC721Received(address, address, uint256, bytes calldata) external pure returns(bytes4){ return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_pre","type":"address"},{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"AutoDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"contractAddress","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":"contractAddress","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":"ACCELERATED_YIELD_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ACCELERATED_YIELD_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_baseRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceleratedYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_baseReward","type":"uint256"}],"name":"addNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAuth","type":"address"}],"name":"authorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorisedLog","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenTraits","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAccumulatedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getCurrentReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getStakerTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakerYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isMultiplierSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchStaking","outputs":[],"stateMutability":"nonpayable","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":"address","name":"contractAddress","type":"address"},{"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"registerDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingLaunched","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":"address","name":"addressToUnAuth","type":"address"}],"name":"unauthorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_yield","type":"uint256"}],"name":"updateBaseYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"updateSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002bb638038062002bb6833981016040819052620000349162000113565b6200004862000042620000a2565b620000a6565b60018080556001600160a01b03928316600090815260086020908152604080832068e3aeb5737240a00000905560069091529020805460ff19169091179055600380546001600160a01b031916919092161790556200014a565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200010e57600080fd5b919050565b6000806040838503121562000126578182fd5b6200013183620000f6565b91506200014160208401620000f6565b90509250929050565b612a5c806200015a6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806366e6c8af1161010f578063a30a2474116100a2578063dce9f7aa11610071578063dce9f7aa146103cc578063dfeaa74c146103df578063e1af5698146103f2578063f2fde38b146103fa576101e5565b8063a30a24741461039e578063c1c1ef9814610342578063c68e5161146103a6578063c82bc61d146103b9576101e5565b806380833d78116100de57806380833d781461035d5780638293744b146103705780638da5cb5b146103835780638fa2a9f01461038b576101e5565b806366e6c8af14610327578063715018a61461033a5780637486560d146103425780637af617751461034a576101e5565b806323101e271161018757806352a664d91161015657806352a664d9146102f15780635b7633d01461030457806361499ab91461030c57806361a52a361461031f576101e5565b806323101e27146102a3578063415855d6146102b65780634bee21d4146102cb5780634d307e3f146102de576101e5565b80630c37dd0d116101c35780630c37dd0d14610230578063150b7a02146102505780631ae73557146102705780631f29d2dc14610283576101e5565b806302befd24146101ea578063041296671461020857806309828c9f14610228575b600080fd5b6101f261040d565b6040516101ff9190612532565b60405180910390f35b61021b6102163660046121a5565b61041b565b6040516101ff9190612953565b61021b610454565b61024361023e3660046121dd565b61045a565b6040516101ff91906124ee565b61026361025e366004612255565b6104d3565b6040516101ff919061255b565b6101f261027e3660046123a1565b6104fd565b6102966102913660046123a1565b610527565b6040516101ff919061249d565b61021b6102b13660046121a5565b61054f565b6102c96102c43660046123cc565b610561565b005b61021b6102d93660046121a5565b6105c3565b61021b6102ec3660046121a5565b6105de565b6102c96102ff366004612215565b610756565b6102966109b3565b61021b61031a3660046123a1565b6109c2565b61021b610a09565b6102c96103353660046121a5565b610a10565b6102c9610ab5565b61021b610b00565b6102c9610358366004612314565b610b05565b6102c961036b3660046121a5565b610f69565b6102c961037e3660046122c6565b610fc9565b610296611486565b6102c96103993660046121a5565b611495565b6102c96114f6565b6102c96103b43660046123a1565b611582565b6102966103c73660046123ec565b6115dd565b6102c96103da3660046123a1565b611607565b6102c96103ed3660046122c6565b611678565b6101f2611922565b6102c96104083660046121a5565b61192b565b600554610100900460ff1681565b6000610426826105de565b6001600160a01b03831660009081526009602052604090206001015461044c919061295c565b90505b919050565b60025481565b6001600160a01b0380831660009081526007602090815260408083209385168352928152908290208054835181840281018401909452808452606093928301828280156104c657602002820191906000526020600020905b8154815260200190600101908083116104b2575b5050505050905092915050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6001600160a01b03919091166000908152600b602090815260408083209383529290522054151590565b6001600160a01b039182166000908152600a6020908152604080832093835292905220541690565b60086020526000908152604090205481565b61056961199c565b6001600160a01b031661057a611486565b6001600160a01b0316146105a95760405162461bcd60e51b81526004016105a09061282d565b60405180910390fd5b600580549115156101000261ff0019909216919091179055565b6001600160a01b031660009081526009602052604090205490565b6001600160a01b03811660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820181905261062957600091505061044f565b600254816040015110801561063f575060025442105b156106835780516040820151600291620151809161065d90426129b3565b6106679190612994565b6106719190612974565b61067b9190612994565b91505061044f565b6002548160400151108015610699575060025442115b15610724576000600262015180836000015184604001516002546106bd91906129b3565b6106c79190612994565b6106d19190612974565b6106db9190612994565b6106e5908261295c565b825160025491925062015180916106fc90426129b3565b6107069190612994565b6107109190612974565b61071a908261295c565b925061044f915050565b8051604082015162015180919061073b90426129b3565b6107459190612994565b61074f9190612974565b9392505050565b600c600061076261199c565b6001600160a01b0316815260208101919091526040016000205460ff1661079b5760405162461bcd60e51b81526004016105a0906127a7565b6001600160a01b038216158015906107cb57506001600160a01b03821660009081526006602052604090205460ff165b6107e75760405162461bcd60e51b81526004016105a090612862565b6040516331a9108f60e11b815230906001600160a01b03841690636352211e90610815908590600401612953565b60206040518083038186803b15801561082d57600080fd5b505afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086591906121c1565b6001600160a01b03161461088b5760405162461bcd60e51b81526004016105a0906125a7565b60006108978383610527565b6001600160a01b0316146108bd5760405162461bcd60e51b81526004016105a0906125fe565b6001600160a01b038281166000908152600a60209081526040808320858452825280832080546001600160a01b03191694881694851790559282526009905220805461090984846109c2565b610913908261295c565b6001600160a01b03808716600090815260076020908152604080832093891683529281529181208054600181018255908252919020018490559050610957856119a0565b80825561096261199c565b6001600160a01b0316846001600160a01b03167f436e7d6cb7f19c3131fe911670b5df727897621eb40f5feeca9b1a47baf2a5dc856040516109a49190612953565b60405180910390a35050505050565b6003546001600160a01b031681565b6001600160a01b0382166000908152600b602090815260408083208484529091528120548061074f575050506001600160a01b031660009081526008602052604090205490565b6201518081565b610a1861199c565b6001600160a01b0316610a29611486565b6001600160a01b031614610a4f5760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b03166000818152600c60205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319169091179055565b610abd61199c565b6001600160a01b0316610ace611486565b6001600160a01b031614610af45760405162461bcd60e51b81526004016105a09061282d565b610afe60006119f9565b565b600281565b60026001541415610b285760405162461bcd60e51b81526004016105a0906128b6565b6002600155600554610100900460ff1615610b555760405162461bcd60e51b81526004016105a090612750565b60055460ff16610b775760405162461bcd60e51b81526004016105a0906126f2565b6001600160a01b03851615801590610ba757506001600160a01b03851660009081526006602052604090205460ff165b610bc35760405162461bcd60e51b81526004016105a090612862565b825115610bfe57610bd78282878787611a49565b610bf35760405162461bcd60e51b81526004016105a0906128ed565b610bfe858585611afc565b600060096000610c0c61199c565b6001600160a01b03168152602081019190915260400160009081208054909250905b8651811015610efd57610c3f61199c565b6001600160a01b0316886001600160a01b0316636352211e898481518110610c7757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610c9b9190612953565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb91906121c1565b6001600160a01b031614610d115760405162461bcd60e51b81526004016105a090612729565b876001600160a01b03166342842e0e610d2861199c565b308a8581518110610d4957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610d6f939291906124b1565b600060405180830381600087803b158015610d8957600080fd5b505af1158015610d9d573d6000803e3d6000fd5b50505050610da961199c565b6001600160a01b0389166000908152600a6020526040812089519091908a9085908110610de657634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610e5188888381518110610e4457634e487b7160e01b600052603260045260246000fd5b60200260200101516109c2565b610e5b908361295c565b915060076000610e6961199c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020878281518110610ecc57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845291909220015580610ef5816129ca565b915050610c2e565b50610f0e610f0961199c565b6119a0565b808255610f1961199c565b6001600160a01b03167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62888851604051610f549291906124d5565b60405180910390a25050600180555050505050565b610f7161199c565b6001600160a01b0316610f82611486565b6001600160a01b031614610fa85760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b60026001541415610fec5760405162461bcd60e51b81526004016105a0906128b6565b60026001556001600160a01b0382161580159061102157506001600160a01b03821660009081526006602052604090205460ff165b61103d5760405162461bcd60e51b81526004016105a090612862565b60006009600061104b61199c565b6001600160a01b03168152602081019190915260400160009081208054909250905b835181101561142257306001600160a01b0316856001600160a01b0316636352211e8684815181106110af57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016110d39190612953565b60206040518083038186803b1580156110eb57600080fd5b505afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906121c1565b6001600160a01b0316146111495760405162461bcd60e51b81526004016105a090612729565b6001600160a01b0385166000908152600a602052604081208551829087908590811061118557634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600001546000146112015760006111f186868481518110610e4457634e487b7160e01b600052603260045260246000fd5b90506111fd81846129b3565b9250505b6112cf6007600061121061199c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000876001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561129d57602002820191906000526020600020905b815481526020019060010190808311611289575b50505050508583815181106112c257634e487b7160e01b600052603260045260246000fd5b6020026020010151611c39565b600760006112db61199c565b6001600160a01b03908116825260208083019390935260409182016000908120918a168152908352208251611316939192919091019061206d565b506007600061132361199c565b6001600160a01b0390811682526020808301939093526040918201600090812091891681529252902080548061136957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055846001600160a01b03166342842e0e3061139761199c565b8785815181106113b757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016113dd939291906124b1565b600060405180830381600087803b1580156113f757600080fd5b505af115801561140b573d6000803e3d6000fd5b50505050808061141a906129ca565b91505061106d565b5061142e610f0961199c565b80825561143961199c565b6001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8585516040516114749291906124d5565b60405180910390a25050600180555050565b6000546001600160a01b031690565b61149d61199c565b6001600160a01b03166114ae611486565b6001600160a01b0316146114d45760405162461bcd60e51b81526004016105a09061282d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6114fe61199c565b6001600160a01b031661150f611486565b6001600160a01b0316146115355760405162461bcd60e51b81526004016105a09061282d565b60055460ff16156115585760405162461bcd60e51b81526004016105a09061266f565b6005805460ff19166001179055611573600262015180612994565b61157d904261295c565b600255565b61158a61199c565b6001600160a01b031661159b611486565b6001600160a01b0316146115c15760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b03909116600090815260086020526040902055565b600481815481106115ed57600080fd5b6000918252602090912001546001600160a01b0316905081565b61160f61199c565b6001600160a01b0316611620611486565b6001600160a01b0316146116465760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b039091166000908152600860209081526040808320939093556006905220805460ff19166001179055565b61168061199c565b6001600160a01b0316611691611486565b6001600160a01b0316146116b75760405162461bcd60e51b81526004016105a09061282d565b6032815111156116d95760405162461bcd60e51b81526004016105a09061288c565b6116e36001610561565b60005b815181101561191d576001600160a01b0383166000908152600a602052604081208351829085908590811061172b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600020546001600160a01b0316905080158015906118135750306001600160a01b0316846001600160a01b0316636352211e85858151811061179457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016117b89190612953565b60206040518083038186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180891906121c1565b6001600160a01b0316145b1561190a57836001600160a01b03166323b872dd308386868151811061184957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b815260040161186f939291906124b1565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b505050508282815181106118c157634e487b7160e01b600052603260045260246000fd5b6020026020010151846001600160a01b0316826001600160a01b03167ffefe036cac4ee3a4aca074a81cbcc4376e1484693289078dbec149c890101d5b60405160405180910390a45b5080611915816129ca565b9150506116e6565b505050565b60055460ff1681565b61193361199c565b6001600160a01b0316611944611486565b6001600160a01b03161461196a5760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b0381166119905760405162461bcd60e51b81526004016105a090612629565b611999816119f9565b50565b3390565b6119a9816105de565b6001600160a01b038216600090815260096020526040812060010180549091906119d490849061295c565b90915550506001600160a01b0316600090815260096020526040902042600290910155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080848484604051602001611a6193929190612436565b6040516020818303038152906040528051906020012090506000611a8482611d6d565b90506000611ac8828a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d9d92505050565b90506001600160a01b03811615801590611aef57506003546001600160a01b038281169116145b9998505050505050505050565b8051825114611b1d5760405162461bcd60e51b81526004016105a090612778565b60005b8251811015611c3357818181518110611b4957634e487b7160e01b600052603260045260246000fd5b6020026020010151600014158015611b9257506901b1ae4d6e2ef5000000828281518110611b8757634e487b7160e01b600052603260045260246000fd5b602002602001015111155b15611c2157818181518110611bb757634e487b7160e01b600052603260045260246000fd5b6020026020010151600b6000866001600160a01b03166001600160a01b031681526020019081526020016000206000858481518110611c0657634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001908152602001600020819055505b80611c2b816129ca565b915050611b20565b50505050565b606060008060018551611c4c91906129b3565b855190915060005b81811015611caf5785878281518110611c7d57634e487b7160e01b600052603260045260246000fd5b60200260200101511415611c9d57611c9681600161295c565b9350611caf565b80611ca7816129ca565b915050611c54565b5082611ccd5760405162461bcd60e51b81526004016105a09061291c565b611cd86001846129b3565b9250818314611d6357858281518110611d0157634e487b7160e01b600052603260045260246000fd5b6020026020010151868481518110611d2957634e487b7160e01b600052603260045260246000fd5b60200260200101818152505084868381518110611d5657634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b5093949350505050565b600081604051602001611d80919061246c565b604051602081830303815290604052805190602001209050919050565b6000806000611dac8585611dc1565b91509150611db981611e31565b509392505050565b600080825160411415611df85760208301516040840151606085015160001a611dec87828585611f5e565b94509450505050611e2a565b825160401415611e225760208301516040840151611e1786838361203e565b935093505050611e2a565b506000905060025b9250929050565b6000816004811115611e5357634e487b7160e01b600052602160045260246000fd5b1415611e5e57611999565b6001816004811115611e8057634e487b7160e01b600052602160045260246000fd5b1415611e9e5760405162461bcd60e51b81526004016105a090612570565b6002816004811115611ec057634e487b7160e01b600052602160045260246000fd5b1415611ede5760405162461bcd60e51b81526004016105a0906125c7565b6003816004811115611f0057634e487b7160e01b600052602160045260246000fd5b1415611f1e5760405162461bcd60e51b81526004016105a0906126b0565b6004816004811115611f4057634e487b7160e01b600052602160045260246000fd5b14156119995760405162461bcd60e51b81526004016105a0906127eb565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611f955750600090506003612035565b8460ff16601b14158015611fad57508460ff16601c14155b15611fbe5750600090506004612035565b600060018787878760405160008152602001604052604051611fe3949392919061253d565b6020604051602081039080840390855afa158015612005573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661202e57600060019250925050612035565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161205f87828885611f5e565b935093505050935093915050565b8280548282559060005260206000209081019282156120a8579160200282015b828111156120a857825182559160200191906001019061208d565b506120b49291506120b8565b5090565b5b808211156120b457600081556001016120b9565b600082601f8301126120dd578081fd5b8135602067ffffffffffffffff808311156120fa576120fa6129fb565b81830260405183828201018181108482111715612119576121196129fb565b60405284815283810192508684018288018501891015612137578687fd5b8692505b8583101561215957803584529284019260019290920191840161213b565b50979650505050505050565b60008083601f840112612176578182fd5b50813567ffffffffffffffff81111561218d578182fd5b602083019150836020828501011115611e2a57600080fd5b6000602082840312156121b6578081fd5b813561074f81612a11565b6000602082840312156121d2578081fd5b815161074f81612a11565b600080604083850312156121ef578081fd5b82356121fa81612a11565b9150602083013561220a81612a11565b809150509250929050565b600080600060608486031215612229578081fd5b833561223481612a11565b9250602084013561224481612a11565b929592945050506040919091013590565b60008060008060006080868803121561226c578081fd5b853561227781612a11565b9450602086013561228781612a11565b935060408601359250606086013567ffffffffffffffff8111156122a9578182fd5b6122b588828901612165565b969995985093965092949392505050565b600080604083850312156122d8578182fd5b82356122e381612a11565b9150602083013567ffffffffffffffff8111156122fe578182fd5b61230a858286016120cd565b9150509250929050565b60008060008060006080868803121561232b578081fd5b853561233681612a11565b9450602086013567ffffffffffffffff80821115612352578283fd5b61235e89838a016120cd565b95506040880135915080821115612373578283fd5b61237f89838a016120cd565b94506060880135915080821115612394578283fd5b506122b588828901612165565b600080604083850312156123b3578182fd5b82356123be81612a11565b946020939093013593505050565b6000602082840312156123dd578081fd5b8135801515811461074f578182fd5b6000602082840312156123fd578081fd5b5035919050565b600081516020808401835b8381101561242b5781518752958201959082019060010161240f565b509495945050505050565b60006bffffffffffffffffffffffff198560601b16825261246361245d6014840186612404565b84612404565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156125265783518352928401929184019160010161250a565b50909695505050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526006908201526510a7bbb732b960d11b604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b602080825260119082015270105b1c9958591e4819195c1bdcda5d1959607a1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f5374616b696e6720686173206265656e206c61756e6368656420616c726561646040820152607960f81b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252601b908201527f5374616b696e67206973206e6f74206c61756e63686564207965740000000000604082015260600190565b6020808252600d908201526c2737ba103a34329037bbb732b960991b604082015260600190565b6020808252600e908201526d11195c1bdcda5d081c185d5cd95960921b604082015260600190565b60208082526015908201527415dc9bdb99c8185c9c985e5cc81c1c9bdd9a591959605a1b604082015260600190565b60208082526024908201527f54686520746f6b656e20636f6e7472616374206973206e6f7420617574686f726040820152631a5cd95960e21b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f155b9adb9bdddb8818dbdb9d1c9858dd60821b604082015260600190565b60208082526010908201526f06a6040d2e640dac2f040e0cae440e8f60831b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260159082015274125b9d985b1a590819185d18481c1c9bdd9a591959605a1b604082015260600190565b6020808252601b908201527f6d73672e73656e646572206973206e6f7420746865206f776e65720000000000604082015260600190565b90815260200190565b6000821982111561296f5761296f6129e5565b500190565b60008261298f57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156129ae576129ae6129e5565b500290565b6000828210156129c5576129c56129e5565b500390565b60006000198214156129de576129de6129e5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461199957600080fdfea2646970667358221220e4b7936020d0a6411cbc668375dd1efcd2a18da27e0af14cfd44211d465e560664736f6c63430008000033000000000000000000000000757f0e9e8a4f84650ae94caab516a00fd7fb29610000000000000000000000006831e66fa0c5b029c6a8501cda601fe944e21652
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806366e6c8af1161010f578063a30a2474116100a2578063dce9f7aa11610071578063dce9f7aa146103cc578063dfeaa74c146103df578063e1af5698146103f2578063f2fde38b146103fa576101e5565b8063a30a24741461039e578063c1c1ef9814610342578063c68e5161146103a6578063c82bc61d146103b9576101e5565b806380833d78116100de57806380833d781461035d5780638293744b146103705780638da5cb5b146103835780638fa2a9f01461038b576101e5565b806366e6c8af14610327578063715018a61461033a5780637486560d146103425780637af617751461034a576101e5565b806323101e271161018757806352a664d91161015657806352a664d9146102f15780635b7633d01461030457806361499ab91461030c57806361a52a361461031f576101e5565b806323101e27146102a3578063415855d6146102b65780634bee21d4146102cb5780634d307e3f146102de576101e5565b80630c37dd0d116101c35780630c37dd0d14610230578063150b7a02146102505780631ae73557146102705780631f29d2dc14610283576101e5565b806302befd24146101ea578063041296671461020857806309828c9f14610228575b600080fd5b6101f261040d565b6040516101ff9190612532565b60405180910390f35b61021b6102163660046121a5565b61041b565b6040516101ff9190612953565b61021b610454565b61024361023e3660046121dd565b61045a565b6040516101ff91906124ee565b61026361025e366004612255565b6104d3565b6040516101ff919061255b565b6101f261027e3660046123a1565b6104fd565b6102966102913660046123a1565b610527565b6040516101ff919061249d565b61021b6102b13660046121a5565b61054f565b6102c96102c43660046123cc565b610561565b005b61021b6102d93660046121a5565b6105c3565b61021b6102ec3660046121a5565b6105de565b6102c96102ff366004612215565b610756565b6102966109b3565b61021b61031a3660046123a1565b6109c2565b61021b610a09565b6102c96103353660046121a5565b610a10565b6102c9610ab5565b61021b610b00565b6102c9610358366004612314565b610b05565b6102c961036b3660046121a5565b610f69565b6102c961037e3660046122c6565b610fc9565b610296611486565b6102c96103993660046121a5565b611495565b6102c96114f6565b6102c96103b43660046123a1565b611582565b6102966103c73660046123ec565b6115dd565b6102c96103da3660046123a1565b611607565b6102c96103ed3660046122c6565b611678565b6101f2611922565b6102c96104083660046121a5565b61192b565b600554610100900460ff1681565b6000610426826105de565b6001600160a01b03831660009081526009602052604090206001015461044c919061295c565b90505b919050565b60025481565b6001600160a01b0380831660009081526007602090815260408083209385168352928152908290208054835181840281018401909452808452606093928301828280156104c657602002820191906000526020600020905b8154815260200190600101908083116104b2575b5050505050905092915050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6001600160a01b03919091166000908152600b602090815260408083209383529290522054151590565b6001600160a01b039182166000908152600a6020908152604080832093835292905220541690565b60086020526000908152604090205481565b61056961199c565b6001600160a01b031661057a611486565b6001600160a01b0316146105a95760405162461bcd60e51b81526004016105a09061282d565b60405180910390fd5b600580549115156101000261ff0019909216919091179055565b6001600160a01b031660009081526009602052604090205490565b6001600160a01b03811660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820181905261062957600091505061044f565b600254816040015110801561063f575060025442105b156106835780516040820151600291620151809161065d90426129b3565b6106679190612994565b6106719190612974565b61067b9190612994565b91505061044f565b6002548160400151108015610699575060025442115b15610724576000600262015180836000015184604001516002546106bd91906129b3565b6106c79190612994565b6106d19190612974565b6106db9190612994565b6106e5908261295c565b825160025491925062015180916106fc90426129b3565b6107069190612994565b6107109190612974565b61071a908261295c565b925061044f915050565b8051604082015162015180919061073b90426129b3565b6107459190612994565b61074f9190612974565b9392505050565b600c600061076261199c565b6001600160a01b0316815260208101919091526040016000205460ff1661079b5760405162461bcd60e51b81526004016105a0906127a7565b6001600160a01b038216158015906107cb57506001600160a01b03821660009081526006602052604090205460ff165b6107e75760405162461bcd60e51b81526004016105a090612862565b6040516331a9108f60e11b815230906001600160a01b03841690636352211e90610815908590600401612953565b60206040518083038186803b15801561082d57600080fd5b505afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086591906121c1565b6001600160a01b03161461088b5760405162461bcd60e51b81526004016105a0906125a7565b60006108978383610527565b6001600160a01b0316146108bd5760405162461bcd60e51b81526004016105a0906125fe565b6001600160a01b038281166000908152600a60209081526040808320858452825280832080546001600160a01b03191694881694851790559282526009905220805461090984846109c2565b610913908261295c565b6001600160a01b03808716600090815260076020908152604080832093891683529281529181208054600181018255908252919020018490559050610957856119a0565b80825561096261199c565b6001600160a01b0316846001600160a01b03167f436e7d6cb7f19c3131fe911670b5df727897621eb40f5feeca9b1a47baf2a5dc856040516109a49190612953565b60405180910390a35050505050565b6003546001600160a01b031681565b6001600160a01b0382166000908152600b602090815260408083208484529091528120548061074f575050506001600160a01b031660009081526008602052604090205490565b6201518081565b610a1861199c565b6001600160a01b0316610a29611486565b6001600160a01b031614610a4f5760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b03166000818152600c60205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319169091179055565b610abd61199c565b6001600160a01b0316610ace611486565b6001600160a01b031614610af45760405162461bcd60e51b81526004016105a09061282d565b610afe60006119f9565b565b600281565b60026001541415610b285760405162461bcd60e51b81526004016105a0906128b6565b6002600155600554610100900460ff1615610b555760405162461bcd60e51b81526004016105a090612750565b60055460ff16610b775760405162461bcd60e51b81526004016105a0906126f2565b6001600160a01b03851615801590610ba757506001600160a01b03851660009081526006602052604090205460ff165b610bc35760405162461bcd60e51b81526004016105a090612862565b825115610bfe57610bd78282878787611a49565b610bf35760405162461bcd60e51b81526004016105a0906128ed565b610bfe858585611afc565b600060096000610c0c61199c565b6001600160a01b03168152602081019190915260400160009081208054909250905b8651811015610efd57610c3f61199c565b6001600160a01b0316886001600160a01b0316636352211e898481518110610c7757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610c9b9190612953565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb91906121c1565b6001600160a01b031614610d115760405162461bcd60e51b81526004016105a090612729565b876001600160a01b03166342842e0e610d2861199c565b308a8581518110610d4957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610d6f939291906124b1565b600060405180830381600087803b158015610d8957600080fd5b505af1158015610d9d573d6000803e3d6000fd5b50505050610da961199c565b6001600160a01b0389166000908152600a6020526040812089519091908a9085908110610de657634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610e5188888381518110610e4457634e487b7160e01b600052603260045260246000fd5b60200260200101516109c2565b610e5b908361295c565b915060076000610e6961199c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000896001600160a01b03166001600160a01b03168152602001908152602001600020878281518110610ecc57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518254600181018455600093845291909220015580610ef5816129ca565b915050610c2e565b50610f0e610f0961199c565b6119a0565b808255610f1961199c565b6001600160a01b03167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62888851604051610f549291906124d5565b60405180910390a25050600180555050505050565b610f7161199c565b6001600160a01b0316610f82611486565b6001600160a01b031614610fa85760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b60026001541415610fec5760405162461bcd60e51b81526004016105a0906128b6565b60026001556001600160a01b0382161580159061102157506001600160a01b03821660009081526006602052604090205460ff165b61103d5760405162461bcd60e51b81526004016105a090612862565b60006009600061104b61199c565b6001600160a01b03168152602081019190915260400160009081208054909250905b835181101561142257306001600160a01b0316856001600160a01b0316636352211e8684815181106110af57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016110d39190612953565b60206040518083038186803b1580156110eb57600080fd5b505afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112391906121c1565b6001600160a01b0316146111495760405162461bcd60e51b81526004016105a090612729565b6001600160a01b0385166000908152600a602052604081208551829087908590811061118557634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082600001546000146112015760006111f186868481518110610e4457634e487b7160e01b600052603260045260246000fd5b90506111fd81846129b3565b9250505b6112cf6007600061121061199c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000876001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561129d57602002820191906000526020600020905b815481526020019060010190808311611289575b50505050508583815181106112c257634e487b7160e01b600052603260045260246000fd5b6020026020010151611c39565b600760006112db61199c565b6001600160a01b03908116825260208083019390935260409182016000908120918a168152908352208251611316939192919091019061206d565b506007600061132361199c565b6001600160a01b0390811682526020808301939093526040918201600090812091891681529252902080548061136957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055846001600160a01b03166342842e0e3061139761199c565b8785815181106113b757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016113dd939291906124b1565b600060405180830381600087803b1580156113f757600080fd5b505af115801561140b573d6000803e3d6000fd5b50505050808061141a906129ca565b91505061106d565b5061142e610f0961199c565b80825561143961199c565b6001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb8585516040516114749291906124d5565b60405180910390a25050600180555050565b6000546001600160a01b031690565b61149d61199c565b6001600160a01b03166114ae611486565b6001600160a01b0316146114d45760405162461bcd60e51b81526004016105a09061282d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6114fe61199c565b6001600160a01b031661150f611486565b6001600160a01b0316146115355760405162461bcd60e51b81526004016105a09061282d565b60055460ff16156115585760405162461bcd60e51b81526004016105a09061266f565b6005805460ff19166001179055611573600262015180612994565b61157d904261295c565b600255565b61158a61199c565b6001600160a01b031661159b611486565b6001600160a01b0316146115c15760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b03909116600090815260086020526040902055565b600481815481106115ed57600080fd5b6000918252602090912001546001600160a01b0316905081565b61160f61199c565b6001600160a01b0316611620611486565b6001600160a01b0316146116465760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b039091166000908152600860209081526040808320939093556006905220805460ff19166001179055565b61168061199c565b6001600160a01b0316611691611486565b6001600160a01b0316146116b75760405162461bcd60e51b81526004016105a09061282d565b6032815111156116d95760405162461bcd60e51b81526004016105a09061288c565b6116e36001610561565b60005b815181101561191d576001600160a01b0383166000908152600a602052604081208351829085908590811061172b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600020546001600160a01b0316905080158015906118135750306001600160a01b0316846001600160a01b0316636352211e85858151811061179457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016117b89190612953565b60206040518083038186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180891906121c1565b6001600160a01b0316145b1561190a57836001600160a01b03166323b872dd308386868151811061184957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b815260040161186f939291906124b1565b600060405180830381600087803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b505050508282815181106118c157634e487b7160e01b600052603260045260246000fd5b6020026020010151846001600160a01b0316826001600160a01b03167ffefe036cac4ee3a4aca074a81cbcc4376e1484693289078dbec149c890101d5b60405160405180910390a45b5080611915816129ca565b9150506116e6565b505050565b60055460ff1681565b61193361199c565b6001600160a01b0316611944611486565b6001600160a01b03161461196a5760405162461bcd60e51b81526004016105a09061282d565b6001600160a01b0381166119905760405162461bcd60e51b81526004016105a090612629565b611999816119f9565b50565b3390565b6119a9816105de565b6001600160a01b038216600090815260096020526040812060010180549091906119d490849061295c565b90915550506001600160a01b0316600090815260096020526040902042600290910155565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080848484604051602001611a6193929190612436565b6040516020818303038152906040528051906020012090506000611a8482611d6d565b90506000611ac8828a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d9d92505050565b90506001600160a01b03811615801590611aef57506003546001600160a01b038281169116145b9998505050505050505050565b8051825114611b1d5760405162461bcd60e51b81526004016105a090612778565b60005b8251811015611c3357818181518110611b4957634e487b7160e01b600052603260045260246000fd5b6020026020010151600014158015611b9257506901b1ae4d6e2ef5000000828281518110611b8757634e487b7160e01b600052603260045260246000fd5b602002602001015111155b15611c2157818181518110611bb757634e487b7160e01b600052603260045260246000fd5b6020026020010151600b6000866001600160a01b03166001600160a01b031681526020019081526020016000206000858481518110611c0657634e487b7160e01b600052603260045260246000fd5b60200260200101518152602001908152602001600020819055505b80611c2b816129ca565b915050611b20565b50505050565b606060008060018551611c4c91906129b3565b855190915060005b81811015611caf5785878281518110611c7d57634e487b7160e01b600052603260045260246000fd5b60200260200101511415611c9d57611c9681600161295c565b9350611caf565b80611ca7816129ca565b915050611c54565b5082611ccd5760405162461bcd60e51b81526004016105a09061291c565b611cd86001846129b3565b9250818314611d6357858281518110611d0157634e487b7160e01b600052603260045260246000fd5b6020026020010151868481518110611d2957634e487b7160e01b600052603260045260246000fd5b60200260200101818152505084868381518110611d5657634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b5093949350505050565b600081604051602001611d80919061246c565b604051602081830303815290604052805190602001209050919050565b6000806000611dac8585611dc1565b91509150611db981611e31565b509392505050565b600080825160411415611df85760208301516040840151606085015160001a611dec87828585611f5e565b94509450505050611e2a565b825160401415611e225760208301516040840151611e1786838361203e565b935093505050611e2a565b506000905060025b9250929050565b6000816004811115611e5357634e487b7160e01b600052602160045260246000fd5b1415611e5e57611999565b6001816004811115611e8057634e487b7160e01b600052602160045260246000fd5b1415611e9e5760405162461bcd60e51b81526004016105a090612570565b6002816004811115611ec057634e487b7160e01b600052602160045260246000fd5b1415611ede5760405162461bcd60e51b81526004016105a0906125c7565b6003816004811115611f0057634e487b7160e01b600052602160045260246000fd5b1415611f1e5760405162461bcd60e51b81526004016105a0906126b0565b6004816004811115611f4057634e487b7160e01b600052602160045260246000fd5b14156119995760405162461bcd60e51b81526004016105a0906127eb565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611f955750600090506003612035565b8460ff16601b14158015611fad57508460ff16601c14155b15611fbe5750600090506004612035565b600060018787878760405160008152602001604052604051611fe3949392919061253d565b6020604051602081039080840390855afa158015612005573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661202e57600060019250925050612035565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161205f87828885611f5e565b935093505050935093915050565b8280548282559060005260206000209081019282156120a8579160200282015b828111156120a857825182559160200191906001019061208d565b506120b49291506120b8565b5090565b5b808211156120b457600081556001016120b9565b600082601f8301126120dd578081fd5b8135602067ffffffffffffffff808311156120fa576120fa6129fb565b81830260405183828201018181108482111715612119576121196129fb565b60405284815283810192508684018288018501891015612137578687fd5b8692505b8583101561215957803584529284019260019290920191840161213b565b50979650505050505050565b60008083601f840112612176578182fd5b50813567ffffffffffffffff81111561218d578182fd5b602083019150836020828501011115611e2a57600080fd5b6000602082840312156121b6578081fd5b813561074f81612a11565b6000602082840312156121d2578081fd5b815161074f81612a11565b600080604083850312156121ef578081fd5b82356121fa81612a11565b9150602083013561220a81612a11565b809150509250929050565b600080600060608486031215612229578081fd5b833561223481612a11565b9250602084013561224481612a11565b929592945050506040919091013590565b60008060008060006080868803121561226c578081fd5b853561227781612a11565b9450602086013561228781612a11565b935060408601359250606086013567ffffffffffffffff8111156122a9578182fd5b6122b588828901612165565b969995985093965092949392505050565b600080604083850312156122d8578182fd5b82356122e381612a11565b9150602083013567ffffffffffffffff8111156122fe578182fd5b61230a858286016120cd565b9150509250929050565b60008060008060006080868803121561232b578081fd5b853561233681612a11565b9450602086013567ffffffffffffffff80821115612352578283fd5b61235e89838a016120cd565b95506040880135915080821115612373578283fd5b61237f89838a016120cd565b94506060880135915080821115612394578283fd5b506122b588828901612165565b600080604083850312156123b3578182fd5b82356123be81612a11565b946020939093013593505050565b6000602082840312156123dd578081fd5b8135801515811461074f578182fd5b6000602082840312156123fd578081fd5b5035919050565b600081516020808401835b8381101561242b5781518752958201959082019060010161240f565b509495945050505050565b60006bffffffffffffffffffffffff198560601b16825261246361245d6014840186612404565b84612404565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156125265783518352928401929184019160010161250a565b50909695505050505050565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526006908201526510a7bbb732b960d11b604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b602080825260119082015270105b1c9958591e4819195c1bdcda5d1959607a1b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526021908201527f5374616b696e6720686173206265656e206c61756e6368656420616c726561646040820152607960f81b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252601b908201527f5374616b696e67206973206e6f74206c61756e63686564207965740000000000604082015260600190565b6020808252600d908201526c2737ba103a34329037bbb732b960991b604082015260600190565b6020808252600e908201526d11195c1bdcda5d081c185d5cd95960921b604082015260600190565b60208082526015908201527415dc9bdb99c8185c9c985e5cc81c1c9bdd9a591959605a1b604082015260600190565b60208082526024908201527f54686520746f6b656e20636f6e7472616374206973206e6f7420617574686f726040820152631a5cd95960e21b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f155b9adb9bdddb8818dbdb9d1c9858dd60821b604082015260600190565b60208082526010908201526f06a6040d2e640dac2f040e0cae440e8f60831b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260159082015274125b9d985b1a590819185d18481c1c9bdd9a591959605a1b604082015260600190565b6020808252601b908201527f6d73672e73656e646572206973206e6f7420746865206f776e65720000000000604082015260600190565b90815260200190565b6000821982111561296f5761296f6129e5565b500190565b60008261298f57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156129ae576129ae6129e5565b500290565b6000828210156129c5576129c56129e5565b500390565b60006000198214156129de576129de6129e5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461199957600080fdfea2646970667358221220e4b7936020d0a6411cbc668375dd1efcd2a18da27e0af14cfd44211d465e560664736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000757f0e9e8a4f84650ae94caab516a00fd7fb29610000000000000000000000006831e66fa0c5b029c6a8501cda601fe944e21652
-----Decoded View---------------
Arg [0] : _pre (address): 0x757F0e9E8a4F84650ae94caAB516a00fD7Fb2961
Arg [1] : _signer (address): 0x6831E66Fa0c5B029C6A8501cDa601fE944e21652
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000757f0e9e8a4f84650ae94caab516a00fd7fb2961
Arg [1] : 0000000000000000000000006831e66fa0c5b029c6a8501cda601fe944e21652
Deployed Bytecode Sourcemap
23187:10520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23547:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27952:157;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23411:31::-;;;:::i;28507:172::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33520:184::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28684:159::-;;;;;;:::i;:::-;;:::i;31464:146::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23807:45::-;;;;;;:::i;:::-;;:::i;32883:85::-;;;;;;:::i;:::-;;:::i;:::-;;28385:117;;;;;;:::i;:::-;;:::i;30337:840::-;;;;;;:::i;:::-;;:::i;27171:776::-;;;;;;:::i;:::-;;:::i;23448:28::-;;;:::i;28114:266::-;;;;;;:::i;:::-;;:::i;23240:53::-;;;:::i;31855:121::-;;;;;;:::i;:::-;;:::i;22445:94::-;;;:::i;23297:50::-;;;:::i;24760:1296::-;;;;;;:::i;:::-;;:::i;32049:110::-;;;;;;:::i;:::-;;:::i;26061:1105::-;;;;;;:::i;:::-;;:::i;21854:78::-;;;:::i;33063:97::-;;;;;;:::i;:::-;;:::i;33165:227::-;;;:::i;33397:118::-;;;;;;:::i;:::-;;:::i;23480:30::-;;;;;;:::i;:::-;;:::i;31615:166::-;;;;;;:::i;:::-;;:::i;32244:544::-;;;;;;:::i;:::-;;:::i;23516:27::-;;;:::i;22679:186::-;;;;;;:::i;:::-;;:::i;23547:25::-;;;;;;;;;:::o;27952:157::-;28021:7;28080:24;28097:6;28080:16;:24::i;:::-;-1:-1:-1;;;;;28043:16:0;;;;;;:8;:16;;;;;:34;;;:61;;;;:::i;:::-;28036:68;;27952:157;;;;:::o;23411:31::-;;;;:::o;28507:172::-;-1:-1:-1;;;;;28626:30:0;;;;;;;:22;:30;;;;;;;;:47;;;;;;;;;;;;28618:56;;;;;;;;;;;;;;;;;28594:16;;28618:56;;;28626:47;28618:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28507:172;;;;:::o;33520:184::-;33638:60;33520:184;;;;;;;:::o;28684:159::-;-1:-1:-1;;;;;28791:34:0;;;;28772:4;28791:34;;;:17;:34;;;;;;;;:43;;;;;;;;:47;;;28684:159::o;31464:146::-;-1:-1:-1;;;;;31566:30:0;;;31544:7;31566:30;;;:13;:30;;;;;;;;:39;;;;;;;;;;31464:146::o;23807:45::-;;;;;;;;;;;;;:::o;32883:85::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;;;;;;;;;32941:13:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;32941:22:0;;::::1;::::0;;;::::1;::::0;;32883:85::o;28385:117::-;-1:-1:-1;;;;;28468:16:0;28446:7;28468:16;;;:8;:16;;;;;:29;;28385:117::o;30337:840::-;-1:-1:-1;;;;;30436:16:0;;30400:7;30436:16;;;:8;:16;;;;;;;;30415:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30458:43;;30497:1;30490:8;;;;;30458:43;30532:16;;30510:4;:19;;;:38;:76;;;;;30570:16;;30552:15;:34;30510:76;30506:208;;;30642:17;;30619:19;;;;23406:1;;23281:12;;30601:37;;:15;:37;:::i;:::-;30600:59;;;;:::i;:::-;:76;;;;:::i;:::-;:107;;;;:::i;:::-;30593:114;;;;;30506:208;30745:16;;30723:4;:19;;;:38;:76;;;;;30783:16;;30765:15;:34;30723:76;30719:365;;;30806:21;23406:1;23281:12;30892:4;:17;;;30869:4;:19;;;30850:16;;:38;;;;:::i;:::-;30849:60;;;;:::i;:::-;:77;;;;:::i;:::-;:108;;;;:::i;:::-;30832:125;;;;:::i;:::-;31018:17;;30998:16;;30832:125;;-1:-1:-1;23281:12:0;;30980:34;;:15;:34;:::i;:::-;30979:56;;;;:::i;:::-;:73;;;;:::i;:::-;30962:90;;;;:::i;:::-;;-1:-1:-1;31057:20:0;;-1:-1:-1;;31057:20:0;30719:365;31138:17;;31115:19;;;;23281:12;;31138:17;31097:37;;:15;:37;:::i;:::-;31096:59;;;;:::i;:::-;:76;;;;:::i;:::-;31089:83;30337:840;-1:-1:-1;;;30337:840:0:o;27171:776::-;24678:11;:25;24690:12;:10;:12::i;:::-;-1:-1:-1;;;;;24678:25:0;;;;;;;;;;;;-1:-1:-1;24678:25:0;;;;24670:74;;;;-1:-1:-1;;;24670:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27289:29:0;::::1;::::0;;::::1;::::0;:68:::1;;-1:-1:-1::0;;;;;;27325:32:0;::::1;;::::0;;;:15:::1;:32;::::0;;;;;::::1;;27289:68;27277:109;;;;-1:-1:-1::0;;;27277:109:0::1;;;;;;;:::i;:::-;27400:41;::::0;-1:-1:-1;;;27400:41:0;;27453:4:::1;::::0;-1:-1:-1;;;;;27400:32:0;::::1;::::0;::::1;::::0;:41:::1;::::0;27433:7;;27400:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27400:58:0::1;;27392:77;;;;-1:-1:-1::0;;;27392:77:0::1;;;;;;;:::i;:::-;27528:1;27483:33;27491:15:::0;27508:7;27483::::1;:33::i;:::-;-1:-1:-1::0;;;;;27483:47:0::1;;27475:77;;;;-1:-1:-1::0;;;27475:77:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27560:30:0;;::::1;;::::0;;;:13:::1;:30;::::0;;;;;;;:39;;;;;;;;:47;;-1:-1:-1;;;;;;27560:47:0::1;::::0;;::::1;::::0;;::::1;::::0;;27637:15;;;:8:::1;:15:::0;;;27677:17;;27714:39:::1;27560:30:::0;:39;27714:13:::1;:39::i;:::-;27702:51;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;27759:29:0;;::::1;;::::0;;;:22:::1;:29;::::0;;;;;;;:46;;::::1;::::0;;;;;;;;:60;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;27702:51;-1:-1:-1;27827:17:0::1;27782:5:::0;27827:10:::1;:17::i;:::-;27850:28:::0;;;27929:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;27891:51:0::1;27903:15;-1:-1:-1::0;;;;;27891:51:0::1;;27920:7;27891:51;;;;;;:::i;:::-;;;;;;;;24749:1;;27171:776:::0;;;:::o;23448:28::-;;;-1:-1:-1;;;;;23448:28:0;;:::o;28114:266::-;-1:-1:-1;;;;;28236:34:0;;28200:7;28236:34;;;:17;:34;;;;;;;;:43;;;;;;;;;28289:15;28285:66;;-1:-1:-1;;;;;;;;28321:27:0;;;;;:10;:27;;;;;;;28114:266::o;23240:53::-;23281:12;23240:53;:::o;31855:121::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31913:19:0::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;31913:26:0::1;31935:4;31913:26:::0;;::::1;::::0;;;31945:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;31945:26:0::1;::::0;;::::1;::::0;;31855:121::o;22445:94::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;22504:30:::1;22531:1;22504:18;:30::i;:::-;22445:94::o:0;23297:50::-;23346:1;23297:50;:::o;24760:1296::-;4883:1;5430:7;;:19;;5422:63;;;;-1:-1:-1;;;5422:63:0;;;;;;;:::i;:::-;4883:1;5551:7;:18;24940:13:::1;::::0;::::1;::::0;::::1;;;24939:14;24931:41;;;;-1:-1:-1::0;;;24931:41:0::1;;;;;;;:::i;:::-;24986:15;::::0;::::1;;24978:55;;;;-1:-1:-1::0;;;24978:55:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25051:29:0;::::1;::::0;;::::1;::::0;:68:::1;;-1:-1:-1::0;;;;;;25087:32:0;::::1;;::::0;;;:15:::1;:32;::::0;;;;;::::1;;25051:68;25039:109;;;;-1:-1:-1::0;;;25039:109:0::1;;;;;;;:::i;:::-;25160:18:::0;;:22;25156:229:::1;;25197:94;25222:9;;25238:15;25260:8;25275:11;25197:18;:94::i;:::-;25189:128;;;;-1:-1:-1::0;;;25189:128:0::1;;;;;;;:::i;:::-;25322:56;25339:15;25356:8;25366:11;25322:16;:56::i;:::-;25392:19;25414:8;:22;25423:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;25414:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;25414:22:0;;;25461:17;;25414:22;;-1:-1:-1;25461:17:0;25486:432:::1;25506:8;:15;25502:1;:19;25486:432;;;25590:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;25541:61:0::1;25549:15;-1:-1:-1::0;;;;;25541:32:0::1;;25574:8;25583:1;25574:11;;;;;;-1:-1:-1::0;;;25574:11:0::1;;;;;;;;;;;;;;;25541:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25541:61:0::1;;25533:87;;;;-1:-1:-1::0;;;25533:87:0::1;;;;;;;:::i;:::-;25633:15;-1:-1:-1::0;;;;;25625:41:0::1;;25667:12;:10;:12::i;:::-;25689:4;25696:8;25705:1;25696:11;;;;;;-1:-1:-1::0;;;25696:11:0::1;;;;;;;;;;;;;;;25625:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25761:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;25715:30:0;::::1;;::::0;;;:13:::1;:30;::::0;;;;25746:11;;25715:30;;;25746:8;;25755:1;;25746:11;::::1;;;-1:-1:-1::0;;;25746:11:0::1;;;;;;;;;;;;;;;25715:43;;;;;;;;;;;;:58;;;;;-1:-1:-1::0;;;;;25715:58:0::1;;;;;-1:-1:-1::0;;;;;25715:58:0::1;;;;;;25792:43;25806:15;25823:8;25832:1;25823:11;;;;;;-1:-1:-1::0;;;25823:11:0::1;;;;;;;;;;;;;;;25792:13;:43::i;:::-;25780:55;::::0;;::::1;:::i;:::-;;;25840:22;:36;25863:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;25840:36:0::1;-1:-1:-1::0;;;;;25840:36:0::1;;;;;;;;;;;;:53;25877:15;-1:-1:-1::0;;;;;25840:53:0::1;-1:-1:-1::0;;;;;25840:53:0::1;;;;;;;;;;;;25899:8;25908:1;25899:11;;;;;;-1:-1:-1::0;;;25899:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;25840:71;;::::1;::::0;::::1;::::0;;-1:-1:-1;25840:71:0;;;;;;;::::1;::::0;25523:3;::::1;::::0;::::1;:::i;:::-;;;;25486:432;;;;25925:24;25936:12;:10;:12::i;:::-;25925:10;:24::i;:::-;25955:28:::0;;;26004:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;25996:55:0::1;;26018:15;26035:8;:15;25996:55;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;4842:1:0;5706:22;;-1:-1:-1;;;;;24760:1296:0:o;32049:110::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32118:28:0::1;32149:5;32118:28:::0;;;:11:::1;:28;::::0;;;;:36;;-1:-1:-1;;32118:36:0::1;::::0;;32049:110::o;26061:1105::-;4883:1;5430:7;;:19;;5422:63;;;;-1:-1:-1;;;5422:63:0;;;;;;;:::i;:::-;4883:1;5551:7;:18;-1:-1:-1;;;;;26181:29:0;::::1;::::0;;::::1;::::0;:68:::1;;-1:-1:-1::0;;;;;;26217:32:0;::::1;;::::0;;;:15:::1;:32;::::0;;;;;::::1;;26181:68;26169:109;;;;-1:-1:-1::0;;;26169:109:0::1;;;;;;;:::i;:::-;26284:19;26306:8;:22;26315:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;26306:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26306:22:0;;;26353:17;;26306:22;;-1:-1:-1;26353:17:0;26378:649:::1;26398:8;:15;26394:1;:19;26378:649;;;26490:4;-1:-1:-1::0;;;;;26433:62:0::1;26441:15;-1:-1:-1::0;;;;;26433:32:0::1;;26466:8;26475:1;26466:11;;;;;;-1:-1:-1::0;;;26466:11:0::1;;;;;;;;;;;;;;;26433:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26433:62:0::1;;26425:88;;;;-1:-1:-1::0;;;26425:88:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26520:30:0;::::1;26574:1;26520:30:::0;;;:13:::1;:30;::::0;;;;26551:11;;26574:1;;26551:8;;26560:1;;26551:11;::::1;;;-1:-1:-1::0;;;26551:11:0::1;;;;;;;;;;;;;;;26520:43;;;;;;;;;;;;:56;;;;;-1:-1:-1::0;;;;;26520:56:0::1;;;;;-1:-1:-1::0;;;;;26520:56:0::1;;;;;;26587:4;:17;;;26608:1;26587:22;26583:134;;26618:18;26639:43;26653:15;26670:8;26679:1;26670:11;;;;;;-1:-1:-1::0;;;26670:11:0::1;;;;;;;;26639:43;26618:64:::0;-1:-1:-1;26689:22:0::1;26618:64:::0;26689:22;::::1;:::i;:::-;;;26583:134;;26779:87;26799:22;:36;26822:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;26799:36:0::1;-1:-1:-1::0;;;;;26799:36:0::1;;;;;;;;;;;;:53;26836:15;-1:-1:-1::0;;;;;26799:53:0::1;-1:-1:-1::0;;;;;26799:53:0::1;;;;;;;;;;;;26779:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26854:8;26863:1;26854:11;;;;;;-1:-1:-1::0;;;26854:11:0::1;;;;;;;;;;;;;;;26779:19;:87::i;:::-;26723:22;:36;26746:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;26723:36:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;26723:36:0;;;:53;;::::1;::::0;;;;;;:143;;::::1;::::0;:53;;:143;;;::::1;::::0;::::1;:::i;:::-;;26871:22;:36;26894:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;26871:36:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;26871:36:0;;;:53;;::::1;::::0;;;;;;:59;;;::::1;;-1:-1:-1::0;;;26871:59:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;26945:15;-1:-1:-1::0;;;;;26937:41:0::1;;26987:4;26994:12;:10;:12::i;:::-;27008:8;27017:1;27008:11;;;;;;-1:-1:-1::0;;;27008:11:0::1;;;;;;;;;;;;;;;26937:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26415:3;;;;;:::i;:::-;;;;26378:649;;;;27034:24;27045:12;:10;:12::i;27034:24::-;27064:28:::0;;;27114:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;27105:56:0::1;;27128:15;27145:8;:15;27105:56;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;4842:1:0;5706:22;;-1:-1:-1;;26061:1105:0:o;21854:78::-;21900:7;21921:6;-1:-1:-1;;;;;21921:6:0;21854:78;:::o;33063:97::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;33132:13:::1;:23:::0;;-1:-1:-1;;;;;;33132:23:0::1;-1:-1:-1::0;;;;;33132:23:0;;;::::1;::::0;;;::::1;::::0;;33063:97::o;33165:227::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;33222:15:::1;::::0;::::1;;33221:16;33213:62;;;;-1:-1:-1::0;;;33213:62:0::1;;;;;;;:::i;:::-;33281:15;:22:::0;;-1:-1:-1;;33281:22:0::1;33299:4;33281:22;::::0;;33347:39:::1;23346:1;23281:12;33347:39;:::i;:::-;33328:59;::::0;:15:::1;:59;:::i;:::-;33309:16;:78:::0;33165:227::o;33397:118::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33480:21:0;;::::1;;::::0;;;:10:::1;:21;::::0;;;;:30;33397:118::o;23480:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23480:30:0;;-1:-1:-1;23480:30:0;:::o;31615:166::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31702:21:0;;::::1;;::::0;;;:10:::1;:21;::::0;;;;;;;:35;;;;31743:15:::1;:26:::0;;;:33;;-1:-1:-1;;31743:33:0::1;31772:4;31743:33;::::0;;31615:166::o;32244:544::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;32370:2:::1;32351:8;:15;:21;;32343:50;;;;-1:-1:-1::0;;;32343:50:0::1;;;;;;;:::i;:::-;32399:18;32412:4;32399:12;:18::i;:::-;32428:9;32423:361;32443:8;:15;32439:1;:19;32423:361;;;-1:-1:-1::0;;;;;32489:27:0;::::1;32470:16;32489:27:::0;;;:13:::1;:27;::::0;;;;32517:11;;32470:16;;32517:8;;32526:1;;32517:11;::::1;;;-1:-1:-1::0;;;32517:11:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;32489:40;;;::::1;::::0;;;;;;-1:-1:-1;32489:40:0;;-1:-1:-1;;;;;32489:40:0::1;::::0;-1:-1:-1;32538:22:0;;;::::1;::::0;:85:::1;;;32618:4;-1:-1:-1::0;;;;;32564:59:0::1;32572:12;-1:-1:-1::0;;;;;32564:29:0::1;;32594:8;32603:1;32594:11;;;;;;-1:-1:-1::0;;;32594:11:0::1;;;;;;;;;;;;;;;32564:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32564:59:0::1;;32538:85;32534:244;;;32640:12;-1:-1:-1::0;;;;;32632:34:0::1;;32675:4;32682:8;32692;32701:1;32692:11;;;;;;-1:-1:-1::0;;;32692:11:0::1;;;;;;;;;;;;;;;32632:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32760:8;32769:1;32760:11;;;;;;-1:-1:-1::0;;;32760:11:0::1;;;;;;;;;;;;;;;32746:12;-1:-1:-1::0;;;;;32716:56:0::1;32736:8;-1:-1:-1::0;;;;;32716:56:0::1;;;;;;;;;;;32534:244;-1:-1:-1::0;32460:3:0;::::1;::::0;::::1;:::i;:::-;;;;32423:361;;;;32244:544:::0;;:::o;23516:27::-;;;;;;:::o;22679:186::-;22058:12;:10;:12::i;:::-;-1:-1:-1;;;;;22047:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;22047:23:0;;22039:68;;;;-1:-1:-1;;;22039:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22762:22:0;::::1;22754:73;;;;-1:-1:-1::0;;;22754:73:0::1;;;;;;;:::i;:::-;22832:28;22851:8;22832:18;:28::i;:::-;22679:186:::0;:::o;3075:89::-;3149:10;3075:89;:::o;31182:173::-;31271:24;31288:6;31271:16;:24::i;:::-;-1:-1:-1;;;;;31233:16:0;;;;;;:8;:16;;;;;:34;;:62;;:34;;:16;:62;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;31301:16:0;;;;;:8;:16;;;;;31335:15;31301:31;;;;:49;31182:173::o;23010:170::-;23078:16;23097:6;;-1:-1:-1;;;;;23108:17:0;;;-1:-1:-1;;;;;;23108:17:0;;;;;;23135:40;;23097:6;;;;;;;23135:40;;23078:16;23135:40;23010:170;;:::o;29427:493::-;29608:4;29620:16;29666:15;29683:8;29693:11;29649:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29639:67;;;;;;29620:86;;29712:15;29730:38;29759:8;29730:28;:38::i;:::-;29712:56;;29776:23;29802:33;29816:7;29825:9;;29802:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29802:13:0;;-1:-1:-1;;;29802:33:0:i;:::-;29776:59;-1:-1:-1;;;;;;29849:29:0;;;;;;:65;;-1:-1:-1;29901:13:0;;-1:-1:-1;;;;;29882:32:0;;;29901:13;;29882:32;29849:65;29841:74;29427:493;-1:-1:-1;;;;;;;;;29427:493:0:o;29925:407::-;30091:11;:18;30072:8;:15;:37;30064:71;;;;-1:-1:-1;;;30064:71:0;;;;;;;:::i;:::-;30146:9;30141:187;30161:8;:15;30157:1;:19;30141:187;;;30192:11;30204:1;30192:14;;;;;;-1:-1:-1;;;30192:14:0;;;;;;;;;;;;;;;30210:1;30192:19;;:51;;;;;30233:10;30215:11;30227:1;30215:14;;;;;;-1:-1:-1;;;30215:14:0;;;;;;;;;;;;;;;:28;;30192:51;30188:134;;;30302:11;30314:1;30302:14;;;;;;-1:-1:-1;;;30302:14:0;;;;;;;;;;;;;;;30252:17;:34;30270:15;-1:-1:-1;;;;;30252:34:0;-1:-1:-1;;;;;30252:34:0;;;;;;;;;;;;:47;30287:8;30296:1;30287:11;;;;;;-1:-1:-1;;;30287:11:0;;;;;;;;;;;;;;;30252:47;;;;;;;;;;;:64;;;;30188:134;30178:3;;;;:::i;:::-;;;;30141:187;;;;29925:407;;;:::o;28848:574::-;28940:16;28964:18;28992:22;29031:1;29017:4;:11;:15;;;;:::i;:::-;29055:11;;28992:40;;-1:-1:-1;29038:14:0;29074:114;29097:6;29093:1;:10;29074:114;;;29130:7;29119:4;29124:1;29119:7;;;;;;-1:-1:-1;;;29119:7:0;;;;;;;;;;;;;;;:18;29115:67;;;29159:5;:1;29163;29159:5;:::i;:::-;29146:18;;29171:5;;29115:67;29105:3;;;;:::i;:::-;;;;29074:114;;;-1:-1:-1;29201:15:0;29193:55;;;;-1:-1:-1;;;29193:55:0;;;;;;;:::i;:::-;29256:15;29270:1;29256:15;;:::i;:::-;;;29297:14;29283:10;:28;29279:120;;29337:4;29342:14;29337:20;;;;;;-1:-1:-1;;;29337:20:0;;;;;;;;;;;;;;;29318:4;29323:10;29318:16;;;;;;-1:-1:-1;;;29318:16:0;;;;;;;;;;;;;;:39;;;;;29385:7;29362:4;29367:14;29362:20;;;;;;-1:-1:-1;;;29362:20:0;;;;;;;;;;;;;;:30;;;;;29279:120;-1:-1:-1;29413:4:0;;28848:574;-1:-1:-1;;;;28848:574:0:o;12895:248::-;12964:7;13132:4;13079:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;13069:69;;;;;;13062:76;;12895:248;;;:::o;9499:210::-;9577:7;9592:17;9611:18;9633:27;9644:4;9650:9;9633:10;:27::i;:::-;9591:69;;;;9665:18;9677:5;9665:11;:18::i;:::-;-1:-1:-1;9695:9:0;9499:210;-1:-1:-1;;;9499:210:0:o;7683:1059::-;7764:7;7773:12;7974:9;:16;7994:2;7974:22;7970:768;;;8204:4;8189:20;;8183:27;8242:4;8227:20;;8221:27;8288:4;8273:20;;8267:27;8004:9;8259:36;8313:25;8324:4;8259:36;8183:27;8221;8313:10;:25::i;:::-;8306:32;;;;;;;;;7970:768;8354:9;:16;8374:2;8354:22;8350:388;;;8572:4;8557:20;;8551:27;8611:4;8596:20;;8590:27;8635:23;8646:4;8551:27;8590;8635:10;:23::i;:::-;8628:30;;;;;;;;8350:388;-1:-1:-1;8692:1:0;;-1:-1:-1;8696:35:0;8350:388;7683:1059;;;;;:::o;6101:559::-;6173:20;6164:5;:29;;;;;;-1:-1:-1;;;6164:29:0;;;;;;;;;;6160:496;;;6201:7;;6160:496;6256:29;6247:5;:38;;;;;;-1:-1:-1;;;6247:38:0;;;;;;;;;;6243:413;;;6293:34;;-1:-1:-1;;;6293:34:0;;;;;;;:::i;6243:413::-;6352:35;6343:5;:44;;;;;;-1:-1:-1;;;6343:44:0;;;;;;;;;;6339:317;;;6395:41;;-1:-1:-1;;;6395:41:0;;;;;;;:::i;6339:317::-;6461:30;6452:5;:39;;;;;;-1:-1:-1;;;6452:39:0;;;;;;;;;;6448:208;;;6499:44;;-1:-1:-1;;;6499:44:0;;;;;;;:::i;6448:208::-;6568:30;6559:5;:39;;;;;;-1:-1:-1;;;6559:39:0;;;;;;;;;;6555:101;;;6606:44;;-1:-1:-1;;;6606:44:0;;;;;;;:::i;10800:1467::-;10904:7;;11778:66;11765:79;;11761:148;;;-1:-1:-1;11868:1:0;;-1:-1:-1;11872:30:0;11852:51;;11761:148;11917:1;:7;;11922:2;11917:7;;:18;;;;;11928:1;:7;;11933:2;11928:7;;11917:18;11913:87;;;-1:-1:-1;11959:1:0;;-1:-1:-1;11963:30:0;11943:51;;11913:87;12085:14;12102:24;12112:4;12118:1;12121;12124;12102:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12102:24:0;;-1:-1:-1;;12102:24:0;;;-1:-1:-1;;;;;;;12135:20:0;;12131:88;;12179:1;12183:29;12163:50;;;;;;;12131:88;12233:6;-1:-1:-1;12241:20:0;;-1:-1:-1;10800:1467:0;;;;;;;;:::o;9948:319::-;10041:7;;-1:-1:-1;;;;;10115:75:0;;10208:3;10204:12;;;10218:2;10200:21;10237:25;10248:4;10200:21;10257:1;10115:75;10237:10;:25::i;:::-;10230:32;;;;;;9948:319;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:926:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;238:18;275:2;271;268:10;265:2;;;281:18;;:::i;:::-;328:2;324;320:11;360:2;354:9;411:2;406;398:6;394:15;390:24;464:6;452:10;449:22;444:2;432:10;429:18;426:46;423:2;;;475:18;;:::i;:::-;511:2;504:22;561:18;;;595:15;;;;-1:-1:-1;630:15:1;;;664;;;660:24;;657:33;-1:-1:-1;654:2:1;;;707:5;700;693:20;654:2;733:5;724:14;;747:163;761:2;758:1;755:9;747:163;;;818:17;;806:30;;856:12;;;;779:1;772:9;;;;;888:12;;747:163;;;-1:-1:-1;928:6:1;84:856;-1:-1:-1;;;;;;;84:856:1:o;945:377::-;;;1062:3;1055:4;1047:6;1043:17;1039:27;1029:2;;1087:8;1077;1070:26;1029:2;-1:-1:-1;1117:20:1;;1160:18;1149:30;;1146:2;;;1199:8;1189;1182:26;1146:2;1243:4;1235:6;1231:17;1219:29;;1295:3;1288:4;1279:6;1271;1267:19;1263:30;1260:39;1257:2;;;1312:1;1309;1302:12;1327:259;;1439:2;1427:9;1418:7;1414:23;1410:32;1407:2;;;1460:6;1452;1445:22;1407:2;1504:9;1491:23;1523:33;1550:5;1523:33;:::i;1591:263::-;;1714:2;1702:9;1693:7;1689:23;1685:32;1682:2;;;1735:6;1727;1720:22;1682:2;1772:9;1766:16;1791:33;1818:5;1791:33;:::i;1859:402::-;;;1988:2;1976:9;1967:7;1963:23;1959:32;1956:2;;;2009:6;2001;1994:22;1956:2;2053:9;2040:23;2072:33;2099:5;2072:33;:::i;:::-;2124:5;-1:-1:-1;2181:2:1;2166:18;;2153:32;2194:35;2153:32;2194:35;:::i;:::-;2248:7;2238:17;;;1946:315;;;;;:::o;2266:470::-;;;;2412:2;2400:9;2391:7;2387:23;2383:32;2380:2;;;2433:6;2425;2418:22;2380:2;2477:9;2464:23;2496:33;2523:5;2496:33;:::i;:::-;2548:5;-1:-1:-1;2605:2:1;2590:18;;2577:32;2618:35;2577:32;2618:35;:::i;:::-;2370:366;;2672:7;;-1:-1:-1;;;2726:2:1;2711:18;;;;2698:32;;2370:366::o;2741:780::-;;;;;;2923:3;2911:9;2902:7;2898:23;2894:33;2891:2;;;2945:6;2937;2930:22;2891:2;2989:9;2976:23;3008:33;3035:5;3008:33;:::i;:::-;3060:5;-1:-1:-1;3117:2:1;3102:18;;3089:32;3130:35;3089:32;3130:35;:::i;:::-;3184:7;-1:-1:-1;3238:2:1;3223:18;;3210:32;;-1:-1:-1;3293:2:1;3278:18;;3265:32;3320:18;3309:30;;3306:2;;;3357:6;3349;3342:22;3306:2;3401:60;3453:7;3444:6;3433:9;3429:22;3401:60;:::i;:::-;2881:640;;;;-1:-1:-1;2881:640:1;;-1:-1:-1;3480:8:1;;3375:86;2881:640;-1:-1:-1;;;2881:640:1:o;3526:511::-;;;3680:2;3668:9;3659:7;3655:23;3651:32;3648:2;;;3701:6;3693;3686:22;3648:2;3745:9;3732:23;3764:33;3791:5;3764:33;:::i;:::-;3816:5;-1:-1:-1;3872:2:1;3857:18;;3844:32;3899:18;3888:30;;3885:2;;;3936:6;3928;3921:22;3885:2;3964:67;4023:7;4014:6;4003:9;3999:22;3964:67;:::i;:::-;3954:77;;;3638:399;;;;;:::o;4042:1074::-;;;;;;4274:3;4262:9;4253:7;4249:23;4245:33;4242:2;;;4296:6;4288;4281:22;4242:2;4340:9;4327:23;4359:33;4386:5;4359:33;:::i;:::-;4411:5;-1:-1:-1;4467:2:1;4452:18;;4439:32;4490:18;4520:14;;;4517:2;;;4552:6;4544;4537:22;4517:2;4580:67;4639:7;4630:6;4619:9;4615:22;4580:67;:::i;:::-;4570:77;;4700:2;4689:9;4685:18;4672:32;4656:48;;4729:2;4719:8;4716:16;4713:2;;;4750:6;4742;4735:22;4713:2;4778:69;4839:7;4828:8;4817:9;4813:24;4778:69;:::i;:::-;4768:79;;4900:2;4889:9;4885:18;4872:32;4856:48;;4929:2;4919:8;4916:16;4913:2;;;4950:6;4942;4935:22;4913:2;;4994:62;5048:7;5037:8;5026:9;5022:24;4994:62;:::i;5121:327::-;;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5271:6;5263;5256:22;5218:2;5315:9;5302:23;5334:33;5361:5;5334:33;:::i;:::-;5386:5;5438:2;5423:18;;;;5410:32;;-1:-1:-1;;;5208:240:1:o;5453:293::-;;5562:2;5550:9;5541:7;5537:23;5533:32;5530:2;;;5583:6;5575;5568:22;5530:2;5627:9;5614:23;5680:5;5673:13;5666:21;5659:5;5656:32;5646:2;;5707:6;5699;5692:22;5751:190;;5863:2;5851:9;5842:7;5838:23;5834:32;5831:2;;;5884:6;5876;5869:22;5831:2;-1:-1:-1;5912:23:1;;5821:120;-1:-1:-1;5821:120:1:o;5946:406::-;;6043:5;6037:12;6087:4;6125:2;6118:5;6114:14;6146:3;6158:169;6172:6;6169:1;6166:13;6158:169;;;6233:13;;6221:26;;6267:12;;;;6302:15;;;;6194:1;6187:9;6158:169;;;-1:-1:-1;6343:3:1;;6013:339;-1:-1:-1;;;;;6013:339:1:o;6357:473::-;;6679:26;6675:31;6666:6;6662:2;6658:15;6654:53;6649:3;6642:66;6724:100;6767:56;6819:2;6814:3;6810:12;6802:6;6767:56;:::i;:::-;6759:6;6724:100;:::i;:::-;6717:107;6632:198;-1:-1:-1;;;;;6632:198:1:o;6835:380::-;7077:66;7065:79;;7169:2;7160:12;;7153:28;;;;7206:2;7197:12;;7055:160::o;7220:203::-;-1:-1:-1;;;;;7384:32:1;;;;7366:51;;7354:2;7339:18;;7321:102::o;7428:375::-;-1:-1:-1;;;;;7686:15:1;;;7668:34;;7738:15;;;;7733:2;7718:18;;7711:43;7785:2;7770:18;;7763:34;;;;7618:2;7603:18;;7585:218::o;7808:274::-;-1:-1:-1;;;;;8000:32:1;;;;7982:51;;8064:2;8049:18;;8042:34;7970:2;7955:18;;7937:145::o;8087:635::-;8258:2;8310:21;;;8380:13;;8283:18;;;8402:22;;;8087:635;;8258:2;8481:15;;;;8455:2;8440:18;;;8087:635;8527:169;8541:6;8538:1;8535:13;8527:169;;;8602:13;;8590:26;;8671:15;;;;8636:12;;;;8563:1;8556:9;8527:169;;;-1:-1:-1;8713:3:1;;8238:484;-1:-1:-1;;;;;;8238:484:1:o;8727:187::-;8892:14;;8885:22;8867:41;;8855:2;8840:18;;8822:92::o;8919:398::-;9146:25;;;9219:4;9207:17;;;;9202:2;9187:18;;9180:45;9256:2;9241:18;;9234:34;9299:2;9284:18;;9277:34;9133:3;9118:19;;9100:217::o;9322:202::-;-1:-1:-1;;;;;;9484:33:1;;;;9466:52;;9454:2;9439:18;;9421:103::o;9529:348::-;9731:2;9713:21;;;9770:2;9750:18;;;9743:30;9809:26;9804:2;9789:18;;9782:54;9868:2;9853:18;;9703:174::o;9882:329::-;10084:2;10066:21;;;10123:1;10103:18;;;10096:29;-1:-1:-1;;;10156:2:1;10141:18;;10134:36;10202:2;10187:18;;10056:155::o;10216:355::-;10418:2;10400:21;;;10457:2;10437:18;;;10430:30;10496:33;10491:2;10476:18;;10469:61;10562:2;10547:18;;10390:181::o;10576:341::-;10778:2;10760:21;;;10817:2;10797:18;;;10790:30;-1:-1:-1;;;10851:2:1;10836:18;;10829:47;10908:2;10893:18;;10750:167::o;10922:402::-;11124:2;11106:21;;;11163:2;11143:18;;;11136:30;11202:34;11197:2;11182:18;;11175:62;-1:-1:-1;;;11268:2:1;11253:18;;11246:36;11314:3;11299:19;;11096:228::o;11329:397::-;11531:2;11513:21;;;11570:2;11550:18;;;11543:30;11609:34;11604:2;11589:18;;11582:62;-1:-1:-1;;;11675:2:1;11660:18;;11653:31;11716:3;11701:19;;11503:223::o;11731:398::-;11933:2;11915:21;;;11972:2;11952:18;;;11945:30;12011:34;12006:2;11991:18;;11984:62;-1:-1:-1;;;12077:2:1;12062:18;;12055:32;12119:3;12104:19;;11905:224::o;12134:351::-;12336:2;12318:21;;;12375:2;12355:18;;;12348:30;12414:29;12409:2;12394:18;;12387:57;12476:2;12461:18;;12308:177::o;12490:337::-;12692:2;12674:21;;;12731:2;12711:18;;;12704:30;-1:-1:-1;;;12765:2:1;12750:18;;12743:43;12818:2;12803:18;;12664:163::o;12832:338::-;13034:2;13016:21;;;13073:2;13053:18;;;13046:30;-1:-1:-1;;;13107:2:1;13092:18;;13085:44;13161:2;13146:18;;13006:164::o;13175:345::-;13377:2;13359:21;;;13416:2;13396:18;;;13389:30;-1:-1:-1;;;13450:2:1;13435:18;;13428:51;13511:2;13496:18;;13349:171::o;13525:400::-;13727:2;13709:21;;;13766:2;13746:18;;;13739:30;13805:34;13800:2;13785:18;;13778:62;-1:-1:-1;;;13871:2:1;13856:18;;13849:34;13915:3;13900:19;;13699:226::o;13930:398::-;14132:2;14114:21;;;14171:2;14151:18;;;14144:30;14210:34;14205:2;14190:18;;14183:62;-1:-1:-1;;;14276:2:1;14261:18;;14254:32;14318:3;14303:19;;14104:224::o;14333:356::-;14535:2;14517:21;;;14554:18;;;14547:30;14613:34;14608:2;14593:18;;14586:62;14680:2;14665:18;;14507:182::o;14694:340::-;14896:2;14878:21;;;14935:2;14915:18;;;14908:30;-1:-1:-1;;;14969:2:1;14954:18;;14947:46;15025:2;15010:18;;14868:166::o;15039:340::-;15241:2;15223:21;;;15280:2;15260:18;;;15253:30;-1:-1:-1;;;15314:2:1;15299:18;;15292:46;15370:2;15355:18;;15213:166::o;15384:355::-;15586:2;15568:21;;;15625:2;15605:18;;;15598:30;15664:33;15659:2;15644:18;;15637:61;15730:2;15715:18;;15558:181::o;15744:345::-;15946:2;15928:21;;;15985:2;15965:18;;;15958:30;-1:-1:-1;;;16019:2:1;16004:18;;15997:51;16080:2;16065:18;;15918:171::o;16094:351::-;16296:2;16278:21;;;16335:2;16315:18;;;16308:30;16374:29;16369:2;16354:18;;16347:57;16436:2;16421:18;;16268:177::o;16450:::-;16596:25;;;16584:2;16569:18;;16551:76::o;16632:128::-;;16703:1;16699:6;16696:1;16693:13;16690:2;;;16709:18;;:::i;:::-;-1:-1:-1;16745:9:1;;16680:80::o;16765:217::-;;16831:1;16821:2;;-1:-1:-1;;;16856:31:1;;16910:4;16907:1;16900:15;16938:4;16863:1;16928:15;16821:2;-1:-1:-1;16967:9:1;;16811:171::o;16987:168::-;;17093:1;17089;17085:6;17081:14;17078:1;17075:21;17070:1;17063:9;17056:17;17052:45;17049:2;;;17100:18;;:::i;:::-;-1:-1:-1;17140:9:1;;17039:116::o;17160:125::-;;17228:1;17225;17222:8;17219:2;;;17233:18;;:::i;:::-;-1:-1:-1;17270:9:1;;17209:76::o;17290:135::-;;-1:-1:-1;;17350:17:1;;17347:2;;;17370:18;;:::i;:::-;-1:-1:-1;17417:1:1;17406:13;;17337:88::o;17430:127::-;17491:10;17486:3;17482:20;17479:1;17472:31;17522:4;17519:1;17512:15;17546:4;17543:1;17536:15;17562:127;17623:10;17618:3;17614:20;17611:1;17604:31;17654:4;17651:1;17644:15;17678:4;17675:1;17668:15;17694:133;-1:-1:-1;;;;;17771:31:1;;17761:42;;17751:2;;17817:1;17814;17807:12
Swarm Source
ipfs://e4b7936020d0a6411cbc668375dd1efcd2a18da27e0af14cfd44211d465e5606
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.