More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 14,717 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 21424361 | 6 days ago | IN | 0 ETH | 0.00185357 | ||||
Unstake | 21424355 | 6 days ago | IN | 0 ETH | 0.00181774 | ||||
Unstake | 21415872 | 7 days ago | IN | 0 ETH | 0.00190896 | ||||
Unstake | 21197428 | 38 days ago | IN | 0 ETH | 0.00263861 | ||||
Unstake | 21189453 | 39 days ago | IN | 0 ETH | 0.00479039 | ||||
Unstake | 21086208 | 53 days ago | IN | 0 ETH | 0.02777788 | ||||
Unstake | 20772381 | 97 days ago | IN | 0 ETH | 0.0015559 | ||||
Unstake | 20353446 | 155 days ago | IN | 0 ETH | 0.00092988 | ||||
Unstake | 20251679 | 170 days ago | IN | 0 ETH | 0.00043515 | ||||
Unstake | 20251678 | 170 days ago | IN | 0 ETH | 0.00039736 | ||||
Unstake | 20094675 | 192 days ago | IN | 0 ETH | 0.00040723 | ||||
Unstake | 19975928 | 208 days ago | IN | 0 ETH | 0.0018061 | ||||
Unstake | 19846072 | 226 days ago | IN | 0 ETH | 0.00157797 | ||||
Unstake | 19821199 | 230 days ago | IN | 0 ETH | 0.00033049 | ||||
Unstake | 19739528 | 241 days ago | IN | 0 ETH | 0.00243585 | ||||
Unstake | 19583000 | 263 days ago | IN | 0 ETH | 0.00469416 | ||||
Unstake | 19496843 | 275 days ago | IN | 0 ETH | 0.00113088 | ||||
Unstake | 19352701 | 295 days ago | IN | 0 ETH | 0.00498683 | ||||
Unstake | 19342423 | 297 days ago | IN | 0 ETH | 0.00788265 | ||||
Unstake | 19339861 | 297 days ago | IN | 0 ETH | 0.00328913 | ||||
Unstake | 19309334 | 302 days ago | IN | 0 ETH | 0.00147713 | ||||
Unstake | 19303970 | 302 days ago | IN | 0 ETH | 0.00196149 | ||||
Stake | 19282644 | 305 days ago | IN | 0 ETH | 0.01312847 | ||||
Unstake | 19258779 | 309 days ago | IN | 0 ETH | 0.00203063 | ||||
Unstake | 19257564 | 309 days ago | IN | 0 ETH | 0.0033896 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Monkestake
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // @author: @CoolMonkes - Monkestake - Staking // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ........................ ....................... // ........................ %%%,,,,,,,,,,,,,,,,,,,,,,,,,%% ....................... // ........................ %%%,,,,,,,,,,,,,,,,,,,,,,,,,%% ....................... // ....................... ///.........................// ...................... // ....................... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...................... // ....................... / / ...................... // ........................ %%%,,,,,,,.. %%%%% .,,,,,,,,%% ....................... // ........................ %%%........,...............,%% ....................... // ........................ %%%,,,,,,,,,,,,,,,,,,,,,,,,,%% ....................... // ........................ %%%,,,,,,,,,,,,,,,,,,,,,,,,,%% ....................... // ....................... %%%&&&%%%&&&&&&&&&&&&&&&&&&&&&&%% ...................... // ....................... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...................... // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // ................................................................................ // Features: // Secure signed stake function for extra security // Batch staking & unstaking to lower gas fees pragma solidity ^0.8.11; import "./Pausable.sol"; import "./Ownable.sol"; import "./IERC721Receiver.sol"; import "./ECDSA.sol"; import "./SafeMath.sol"; interface IMonkes { function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) external; function transferFrom(address from, address to, uint256 tokenId) external; function ownerOf(uint256 tokenId) external returns (address); } interface IBoosts { function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) external; function transferFrom(address from, address to, uint256 tokenId) external; function ownerOf(uint256 tokenId) external returns (address); } contract Monkestake is Ownable, IERC721Receiver, Pausable { using SafeMath for uint256; using ECDSA for bytes32; address public constant enforcerAddress = 0xD8A7fd1887cf690119FFed888924056aF7f299CE; address public monkeAddress; address public boostAddress; //Store token, owner, and stake timestamp struct Stake { uint16 tokenId; address owner; uint80 value; } //Minting tracking and efficient rule enforcement, nounce sent must always be unique mapping(address => uint256) public nounceTracker; //Maps tokenIds to stake mapping(uint256 => Stake) public monkeStaked; mapping(uint256 => Stake) public boostStaked; function setMonkeAddress(address contractAddress) public onlyOwner { monkeAddress = contractAddress; } function setBoostAddress(address contractAddress) public onlyOwner { boostAddress = contractAddress; } //Returns nounce for earner to enable transaction parity for security, next nounce has to be > than this value! function stakerCurrentNounce(address staker) public view returns (uint256) { return nounceTracker[staker]; } function getMessageHash(address _to, uint _amount, uint _nonce) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_to, _amount, _nonce)); } function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)); } function verify(address _signer, address _to, uint _amount, uint _nounce, bytes memory signature) internal pure returns (bool) { bytes32 messageHash = getMessageHash(_to, _amount, _nounce); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, signature) == _signer; } function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) internal pure returns (bytes32 r, bytes32 s, uint8 v ) { require(sig.length == 65, "Invalid signature length!"); assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } } function stake(address account, uint16[] calldata monkeTokenIds, uint16[] calldata boostTokenIds, uint amount, uint nounce, bytes memory signature) public whenNotPaused { require(account == _msgSender() || _msgSender() == boostAddress, "Can only stake to your own benefit!"); if (_msgSender() != boostAddress) { require(nounceTracker[_msgSender()] < nounce, "Can not repeat a prior transaction!"); require(verify(enforcerAddress, _msgSender(), amount, nounce, signature) == true, "Staking must be done from our website!"); nounceTracker[_msgSender()] = nounce; for (uint i = 0; i < monkeTokenIds.length; i++) { require(IMonkes(monkeAddress).ownerOf(monkeTokenIds[i]) == _msgSender(), "Token does not belong to you"); IMonkes(monkeAddress).transferFrom(_msgSender(), address(this), monkeTokenIds[i]); monkeStaked[monkeTokenIds[i]] = Stake({ owner: account, tokenId: uint16(monkeTokenIds[i]), value: uint80(block.timestamp) }); } } for (uint i = 0; i < boostTokenIds.length; i++) { if (_msgSender() != boostAddress) { require(IBoosts(boostAddress).ownerOf(boostTokenIds[i]) == _msgSender(), "Token does not belong to you"); IBoosts(boostAddress).transferFrom(_msgSender(), address(this), boostTokenIds[i]); } boostStaked[boostTokenIds[i]] = Stake({ owner: account, tokenId: uint16(boostTokenIds[i]), value: uint80(block.timestamp) }); } } function unstake(uint16[] calldata monkeTokenIds, uint16[] calldata boostTokenIds, uint amount, uint nounce, bytes memory signature) public whenNotPaused { require(nounceTracker[_msgSender()] < nounce, "Can not repeat a prior transaction!"); require(verify(enforcerAddress, _msgSender(), amount, nounce, signature) == true, "Unstaking must be done from our website!"); nounceTracker[_msgSender()] = nounce; for (uint i = 0; i < monkeTokenIds.length; i++) { require(monkeStaked[monkeTokenIds[i]].owner == _msgSender(), "Token does not belong to you"); IMonkes(monkeAddress).safeTransferFrom(address(this), _msgSender(), monkeTokenIds[i], ""); delete monkeStaked[monkeTokenIds[i]]; } for (uint i = 0; i < boostTokenIds.length; i++) { require(boostStaked[boostTokenIds[i]].owner == _msgSender(), "Token does not belong to you"); IBoosts(boostAddress).safeTransferFrom(address(this), _msgSender(), boostTokenIds[i], ""); delete boostStaked[boostTokenIds[i]]; } } function emergencyRescue(address account, uint16[] calldata monkeTokenIds, uint16[] calldata boostTokenIds) public onlyOwner { for (uint i = 0; i < monkeTokenIds.length; i++) { IMonkes(monkeAddress).safeTransferFrom(address(this), account, monkeTokenIds[i], ""); delete monkeStaked[monkeTokenIds[i]]; } for (uint i = 0; i < boostTokenIds.length; i++) { IBoosts(boostAddress).safeTransferFrom(address(this), account, boostTokenIds[i], ""); delete boostStaked[boostTokenIds[i]]; } } function onERC721Received(address, address from, uint256, bytes calldata) external pure override returns (bytes4) { require(from == address(0x0), "Cannot send tokens to Monkestake directly"); return IERC721Receiver.onERC721Received.selector; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; 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)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"boostAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boostStaked","outputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint80","name":"value","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16[]","name":"monkeTokenIds","type":"uint16[]"},{"internalType":"uint16[]","name":"boostTokenIds","type":"uint16[]"}],"name":"emergencyRescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforcerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monkeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"monkeStaked","outputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint80","name":"value","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nounceTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setBoostAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setMonkeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16[]","name":"monkeTokenIds","type":"uint16[]"},{"internalType":"uint16[]","name":"boostTokenIds","type":"uint16[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nounce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"stakerCurrentNounce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"monkeTokenIds","type":"uint16[]"},{"internalType":"uint16[]","name":"boostTokenIds","type":"uint16[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nounce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361002c565b6000805460ff60a01b1916905561007c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121548061008b6000396000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80638da5cb5b116100cd578063dd766fb611610081578063ee16b20911610066578063ee16b209146103c1578063f2fde38b146103d4578063fe78dd08146103e757600080fd5b8063dd766fb614610385578063e3a00130146103ae57600080fd5b8063b1d8a81a116100b2578063b1d8a81a146102e8578063c1698f3214610344578063c7c7f9321461035757600080fd5b80638da5cb5b146102b0578063a73c5145146102d557600080fd5b80636226b4e511610124578063715018a611610109578063715018a61461028d5780637dfa3a84146102955780638456cb59146102a857600080fd5b80636226b4e5146101ea5780637018db121461027a57600080fd5b8063037d5cb214610156578063150b7a021461016b5780633f4ba83a146101b45780635c975abb146101bc575b600080fd5b610169610164366004611c69565b610402565b005b61017e610179366004611c8d565b61049b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b610169610545565b60005474010000000000000000000000000000000000000000900460ff1660405190151581526020016101ab565b6102466101f8366004611d2c565b60046020526000908152604090205461ffff8116906201000081046001600160a01b031690760100000000000000000000000000000000000000000000900469ffffffffffffffffffff1683565b6040805161ffff90941684526001600160a01b03909216602084015269ffffffffffffffffffff16908201526060016101ab565b610169610288366004611d91565b6105a9565b610169610860565b6101696102a3366004611eee565b6108c4565b610169610df5565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101ab565b6101696102e3366004611f95565b610e57565b6102466102f6366004611d2c565b60056020526000908152604090205461ffff8116906201000081046001600160a01b031690760100000000000000000000000000000000000000000000900469ffffffffffffffffffff1683565b6002546102bd906001600160a01b031681565b610377610365366004611c69565b60036020526000908152604090205481565b6040519081526020016101ab565b610377610393366004611c69565b6001600160a01b031660009081526003602052604090205490565b6001546102bd906001600160a01b031681565b6101696103cf366004611c69565b6116f5565b6101696103e2366004611c69565b611789565b6102bd73d8a7fd1887cf690119ffed888924056af7f299ce81565b6000546001600160a01b031633146104615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006001600160a01b0385161561051a5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f742073656e6420746f6b656e7320746f204d6f6e6b657374616b6560448201527f206469726563746c7900000000000000000000000000000000000000000000006064820152608401610458565b507f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6000546001600160a01b0316331461059f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6105a761186b565b565b6000546001600160a01b031633146106035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b60005b8381101561072d576001546001600160a01b031663b88d4fde30888888868181106106335761063361204e565b9050602002016020810190610648919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b1580156106c157600080fd5b505af11580156106d5573d6000803e3d6000fd5b50505050600460008686848181106106ef576106ef61204e565b9050602002016020810190610704919061207d565b61ffff168152602081019190915260400160009081205580610725816120a1565b915050610606565b5060005b81811015610858576002546001600160a01b031663b88d4fde308886868681811061075e5761075e61204e565b9050602002016020810190610773919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b1580156107ec57600080fd5b505af1158015610800573d6000803e3d6000fd5b505050506005600084848481811061081a5761081a61204e565b905060200201602081019061082f919061207d565b61ffff168152602081019190915260400160009081205580610850816120a1565b915050610731565b505050505050565b6000546001600160a01b031633146108ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6105a7600061193d565b60005474010000000000000000000000000000000000000000900460ff161561092f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610458565b3360009081526003602052604090205482116109b35760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f74207265706561742061207072696f72207472616e736163746960448201527f6f6e2100000000000000000000000000000000000000000000000000000000006064820152608401610458565b6109d573d8a7fd1887cf690119ffed888924056af7f299ce335b8585856119a5565b1515600114610a4c5760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e67206d75737420626520646f6e652066726f6d206f75722060448201527f77656273697465210000000000000000000000000000000000000000000000006064820152608401610458565b3360009081526003602052604081208390555b86811015610c235733600460008a8a85818110610a7e57610a7e61204e565b9050602002016020810190610a93919061207d565b61ffff1681526020810191909152604001600020546201000090046001600160a01b031614610b045760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6001546001600160a01b031663b88d4fde30338b8b86818110610b2957610b2961204e565b9050602002016020810190610b3e919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b158015610bb757600080fd5b505af1158015610bcb573d6000803e3d6000fd5b5050505060046000898984818110610be557610be561204e565b9050602002016020810190610bfa919061207d565b61ffff168152602081019190915260400160009081205580610c1b816120a1565b915050610a5f565b5060005b84811015610deb573360056000888885818110610c4657610c4661204e565b9050602002016020810190610c5b919061207d565b61ffff1681526020810191909152604001600020546201000090046001600160a01b031614610ccc5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6002546001600160a01b031663b88d4fde3033898986818110610cf157610cf161204e565b9050602002016020810190610d06919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b5050505060056000878784818110610dad57610dad61204e565b9050602002016020810190610dc2919061207d565b61ffff168152602081019190915260400160009081205580610de3816120a1565b915050610c27565b5050505050505050565b6000546001600160a01b03163314610e4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6105a7611a71565b60005474010000000000000000000000000000000000000000900460ff1615610ec25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610458565b6001600160a01b038816331480610eec57506002546001600160a01b0316336001600160a01b0316145b610f5e5760405162461bcd60e51b815260206004820152602360248201527f43616e206f6e6c79207374616b6520746f20796f7572206f776e2062656e656660448201527f69742100000000000000000000000000000000000000000000000000000000006064820152608401610458565b6002546001600160a01b0316336001600160a01b0316146113b957336000908152600360205260409020548211610ffd5760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f74207265706561742061207072696f72207472616e736163746960448201527f6f6e2100000000000000000000000000000000000000000000000000000000006064820152608401610458565b61101b73d8a7fd1887cf690119ffed888924056af7f299ce336109cd565b15156001146110925760405162461bcd60e51b815260206004820152602660248201527f5374616b696e67206d75737420626520646f6e652066726f6d206f757220776560448201527f62736974652100000000000000000000000000000000000000000000000000006064820152608401610458565b3360009081526003602052604081208390555b868110156113b75760015433906001600160a01b0316636352211e8a8a858181106110d2576110d261204e565b90506020020160208101906110e7919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815261ffff90911660048201526024016020604051808303816000875af1158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190612101565b6001600160a01b0316146111ba5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6001546001600160a01b03166323b872dd33308b8b868181106111df576111df61204e565b90506020020160208101906111f4919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b15801561125f57600080fd5b505af1158015611273573d6000803e3d6000fd5b5050505060405180606001604052808989848181106112945761129461204e565b90506020020160208101906112a9919061207d565b61ffff1681526020018a6001600160a01b031681526020014269ffffffffffffffffffff16815250600460008a8a858181106112e7576112e761204e565b90506020020160208101906112fc919061207d565b61ffff908116825260208083019390935260409182016000208451815494860151959093015169ffffffffffffffffffff167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff6001600160a01b0390961662010000027fffffffffffffffffffff0000000000000000000000000000000000000000000090951693909216929092179290921792909216179055806113af816120a1565b9150506110a5565b505b60005b848110156116ea576002546001600160a01b0316336001600160a01b0316146115aa5760025433906001600160a01b0316636352211e8888858181106114045761140461204e565b9050602002016020810190611419919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815261ffff90911660048201526024016020604051808303816000875af1158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612101565b6001600160a01b0316146114ec5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6002546001600160a01b03166323b872dd33308989868181106115115761151161204e565b9050602002016020810190611526919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050505b60405180606001604052808787848181106115c7576115c761204e565b90506020020160208101906115dc919061207d565b61ffff1681526020018a6001600160a01b031681526020014269ffffffffffffffffffff168152506005600088888581811061161a5761161a61204e565b905060200201602081019061162f919061207d565b61ffff908116825260208083019390935260409182016000208451815494860151959093015169ffffffffffffffffffff167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff6001600160a01b0390961662010000027fffffffffffffffffffff0000000000000000000000000000000000000000000090951693909216929092179290921792909216179055806116e2816120a1565b9150506113bc565b505050505050505050565b6000546001600160a01b0316331461174f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b031633146117e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6001600160a01b03811661185f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610458565b6118688161193d565b50565b60005474010000000000000000000000000000000000000000900460ff166118d55760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610458565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b16602080830191909152603482018690526054808301869052835180840390910181526074830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a333200000000609484015260b08084018290528451808503909101815260d0909301909352815191012060009190876001600160a01b0316611a5b8286611b43565b6001600160a01b03161498975050505050505050565b60005474010000000000000000000000000000000000000000900460ff1615611adc5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610458565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119203390565b600080600080611b5285611be0565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611bad573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b60008060008351604114611c365760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e6174757265206c656e67746821000000000000006044820152606401610458565b50505060208101516040820151606090920151909260009190911a90565b6001600160a01b038116811461186857600080fd5b600060208284031215611c7b57600080fd5b8135611c8681611c54565b9392505050565b600080600080600060808688031215611ca557600080fd5b8535611cb081611c54565b94506020860135611cc081611c54565b935060408601359250606086013567ffffffffffffffff80821115611ce457600080fd5b818801915088601f830112611cf857600080fd5b813581811115611d0757600080fd5b896020828501011115611d1957600080fd5b9699959850939650602001949392505050565b600060208284031215611d3e57600080fd5b5035919050565b60008083601f840112611d5757600080fd5b50813567ffffffffffffffff811115611d6f57600080fd5b6020830191508360208260051b8501011115611d8a57600080fd5b9250929050565b600080600080600060608688031215611da957600080fd5b8535611db481611c54565b9450602086013567ffffffffffffffff80821115611dd157600080fd5b611ddd89838a01611d45565b90965094506040880135915080821115611df657600080fd5b50611e0388828901611d45565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112611e5457600080fd5b813567ffffffffffffffff80821115611e6f57611e6f611e14565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611eb557611eb5611e14565b81604052838152866020858801011115611ece57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060a0888a031215611f0957600080fd5b873567ffffffffffffffff80821115611f2157600080fd5b611f2d8b838c01611d45565b909950975060208a0135915080821115611f4657600080fd5b611f528b838c01611d45565b909750955060408a0135945060608a0135935060808a0135915080821115611f7957600080fd5b50611f868a828b01611e43565b91505092959891949750929550565b60008060008060008060008060c0898b031215611fb157600080fd5b8835611fbc81611c54565b9750602089013567ffffffffffffffff80821115611fd957600080fd5b611fe58c838d01611d45565b909950975060408b0135915080821115611ffe57600080fd5b61200a8c838d01611d45565b909750955060608b0135945060808b0135935060a08b013591508082111561203157600080fd5b5061203e8b828c01611e43565b9150509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561208f57600080fd5b813561ffff81168114611c8657600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156120fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561211357600080fd5b8151611c8681611c5456fea2646970667358221220a8044cbb76d9e796bb82c16b7bba52002bfef3c22825972d5ee82ebe2a3315b464736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101515760003560e01c80638da5cb5b116100cd578063dd766fb611610081578063ee16b20911610066578063ee16b209146103c1578063f2fde38b146103d4578063fe78dd08146103e757600080fd5b8063dd766fb614610385578063e3a00130146103ae57600080fd5b8063b1d8a81a116100b2578063b1d8a81a146102e8578063c1698f3214610344578063c7c7f9321461035757600080fd5b80638da5cb5b146102b0578063a73c5145146102d557600080fd5b80636226b4e511610124578063715018a611610109578063715018a61461028d5780637dfa3a84146102955780638456cb59146102a857600080fd5b80636226b4e5146101ea5780637018db121461027a57600080fd5b8063037d5cb214610156578063150b7a021461016b5780633f4ba83a146101b45780635c975abb146101bc575b600080fd5b610169610164366004611c69565b610402565b005b61017e610179366004611c8d565b61049b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b610169610545565b60005474010000000000000000000000000000000000000000900460ff1660405190151581526020016101ab565b6102466101f8366004611d2c565b60046020526000908152604090205461ffff8116906201000081046001600160a01b031690760100000000000000000000000000000000000000000000900469ffffffffffffffffffff1683565b6040805161ffff90941684526001600160a01b03909216602084015269ffffffffffffffffffff16908201526060016101ab565b610169610288366004611d91565b6105a9565b610169610860565b6101696102a3366004611eee565b6108c4565b610169610df5565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101ab565b6101696102e3366004611f95565b610e57565b6102466102f6366004611d2c565b60056020526000908152604090205461ffff8116906201000081046001600160a01b031690760100000000000000000000000000000000000000000000900469ffffffffffffffffffff1683565b6002546102bd906001600160a01b031681565b610377610365366004611c69565b60036020526000908152604090205481565b6040519081526020016101ab565b610377610393366004611c69565b6001600160a01b031660009081526003602052604090205490565b6001546102bd906001600160a01b031681565b6101696103cf366004611c69565b6116f5565b6101696103e2366004611c69565b611789565b6102bd73d8a7fd1887cf690119ffed888924056af7f299ce81565b6000546001600160a01b031633146104615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006001600160a01b0385161561051a5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f742073656e6420746f6b656e7320746f204d6f6e6b657374616b6560448201527f206469726563746c7900000000000000000000000000000000000000000000006064820152608401610458565b507f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6000546001600160a01b0316331461059f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6105a761186b565b565b6000546001600160a01b031633146106035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b60005b8381101561072d576001546001600160a01b031663b88d4fde30888888868181106106335761063361204e565b9050602002016020810190610648919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b1580156106c157600080fd5b505af11580156106d5573d6000803e3d6000fd5b50505050600460008686848181106106ef576106ef61204e565b9050602002016020810190610704919061207d565b61ffff168152602081019190915260400160009081205580610725816120a1565b915050610606565b5060005b81811015610858576002546001600160a01b031663b88d4fde308886868681811061075e5761075e61204e565b9050602002016020810190610773919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b1580156107ec57600080fd5b505af1158015610800573d6000803e3d6000fd5b505050506005600084848481811061081a5761081a61204e565b905060200201602081019061082f919061207d565b61ffff168152602081019190915260400160009081205580610850816120a1565b915050610731565b505050505050565b6000546001600160a01b031633146108ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6105a7600061193d565b60005474010000000000000000000000000000000000000000900460ff161561092f5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610458565b3360009081526003602052604090205482116109b35760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f74207265706561742061207072696f72207472616e736163746960448201527f6f6e2100000000000000000000000000000000000000000000000000000000006064820152608401610458565b6109d573d8a7fd1887cf690119ffed888924056af7f299ce335b8585856119a5565b1515600114610a4c5760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e67206d75737420626520646f6e652066726f6d206f75722060448201527f77656273697465210000000000000000000000000000000000000000000000006064820152608401610458565b3360009081526003602052604081208390555b86811015610c235733600460008a8a85818110610a7e57610a7e61204e565b9050602002016020810190610a93919061207d565b61ffff1681526020810191909152604001600020546201000090046001600160a01b031614610b045760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6001546001600160a01b031663b88d4fde30338b8b86818110610b2957610b2961204e565b9050602002016020810190610b3e919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b158015610bb757600080fd5b505af1158015610bcb573d6000803e3d6000fd5b5050505060046000898984818110610be557610be561204e565b9050602002016020810190610bfa919061207d565b61ffff168152602081019190915260400160009081205580610c1b816120a1565b915050610a5f565b5060005b84811015610deb573360056000888885818110610c4657610c4661204e565b9050602002016020810190610c5b919061207d565b61ffff1681526020810191909152604001600020546201000090046001600160a01b031614610ccc5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6002546001600160a01b031663b88d4fde3033898986818110610cf157610cf161204e565b9050602002016020810190610d06919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152608060648201526000608482015260a401600060405180830381600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b5050505060056000878784818110610dad57610dad61204e565b9050602002016020810190610dc2919061207d565b61ffff168152602081019190915260400160009081205580610de3816120a1565b915050610c27565b5050505050505050565b6000546001600160a01b03163314610e4f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6105a7611a71565b60005474010000000000000000000000000000000000000000900460ff1615610ec25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610458565b6001600160a01b038816331480610eec57506002546001600160a01b0316336001600160a01b0316145b610f5e5760405162461bcd60e51b815260206004820152602360248201527f43616e206f6e6c79207374616b6520746f20796f7572206f776e2062656e656660448201527f69742100000000000000000000000000000000000000000000000000000000006064820152608401610458565b6002546001600160a01b0316336001600160a01b0316146113b957336000908152600360205260409020548211610ffd5760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f74207265706561742061207072696f72207472616e736163746960448201527f6f6e2100000000000000000000000000000000000000000000000000000000006064820152608401610458565b61101b73d8a7fd1887cf690119ffed888924056af7f299ce336109cd565b15156001146110925760405162461bcd60e51b815260206004820152602660248201527f5374616b696e67206d75737420626520646f6e652066726f6d206f757220776560448201527f62736974652100000000000000000000000000000000000000000000000000006064820152608401610458565b3360009081526003602052604081208390555b868110156113b75760015433906001600160a01b0316636352211e8a8a858181106110d2576110d261204e565b90506020020160208101906110e7919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815261ffff90911660048201526024016020604051808303816000875af1158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190612101565b6001600160a01b0316146111ba5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6001546001600160a01b03166323b872dd33308b8b868181106111df576111df61204e565b90506020020160208101906111f4919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b15801561125f57600080fd5b505af1158015611273573d6000803e3d6000fd5b5050505060405180606001604052808989848181106112945761129461204e565b90506020020160208101906112a9919061207d565b61ffff1681526020018a6001600160a01b031681526020014269ffffffffffffffffffff16815250600460008a8a858181106112e7576112e761204e565b90506020020160208101906112fc919061207d565b61ffff908116825260208083019390935260409182016000208451815494860151959093015169ffffffffffffffffffff167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff6001600160a01b0390961662010000027fffffffffffffffffffff0000000000000000000000000000000000000000000090951693909216929092179290921792909216179055806113af816120a1565b9150506110a5565b505b60005b848110156116ea576002546001600160a01b0316336001600160a01b0316146115aa5760025433906001600160a01b0316636352211e8888858181106114045761140461204e565b9050602002016020810190611419919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815261ffff90911660048201526024016020604051808303816000875af1158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612101565b6001600160a01b0316146114ec5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20646f6573206e6f742062656c6f6e6720746f20796f75000000006044820152606401610458565b6002546001600160a01b03166323b872dd33308989868181106115115761151161204e565b9050602002016020810190611526919061207d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015261ffff166044820152606401600060405180830381600087803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050505b60405180606001604052808787848181106115c7576115c761204e565b90506020020160208101906115dc919061207d565b61ffff1681526020018a6001600160a01b031681526020014269ffffffffffffffffffff168152506005600088888581811061161a5761161a61204e565b905060200201602081019061162f919061207d565b61ffff908116825260208083019390935260409182016000208451815494860151959093015169ffffffffffffffffffff167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff6001600160a01b0390961662010000027fffffffffffffffffffff0000000000000000000000000000000000000000000090951693909216929092179290921792909216179055806116e2816120a1565b9150506113bc565b505050505050505050565b6000546001600160a01b0316331461174f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b031633146117e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6001600160a01b03811661185f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610458565b6118688161193d565b50565b60005474010000000000000000000000000000000000000000900460ff166118d55760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610458565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b16602080830191909152603482018690526054808301869052835180840390910181526074830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a333200000000609484015260b08084018290528451808503909101815260d0909301909352815191012060009190876001600160a01b0316611a5b8286611b43565b6001600160a01b03161498975050505050505050565b60005474010000000000000000000000000000000000000000900460ff1615611adc5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610458565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119203390565b600080600080611b5285611be0565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611bad573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b60008060008351604114611c365760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e6174757265206c656e67746821000000000000006044820152606401610458565b50505060208101516040820151606090920151909260009190911a90565b6001600160a01b038116811461186857600080fd5b600060208284031215611c7b57600080fd5b8135611c8681611c54565b9392505050565b600080600080600060808688031215611ca557600080fd5b8535611cb081611c54565b94506020860135611cc081611c54565b935060408601359250606086013567ffffffffffffffff80821115611ce457600080fd5b818801915088601f830112611cf857600080fd5b813581811115611d0757600080fd5b896020828501011115611d1957600080fd5b9699959850939650602001949392505050565b600060208284031215611d3e57600080fd5b5035919050565b60008083601f840112611d5757600080fd5b50813567ffffffffffffffff811115611d6f57600080fd5b6020830191508360208260051b8501011115611d8a57600080fd5b9250929050565b600080600080600060608688031215611da957600080fd5b8535611db481611c54565b9450602086013567ffffffffffffffff80821115611dd157600080fd5b611ddd89838a01611d45565b90965094506040880135915080821115611df657600080fd5b50611e0388828901611d45565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112611e5457600080fd5b813567ffffffffffffffff80821115611e6f57611e6f611e14565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611eb557611eb5611e14565b81604052838152866020858801011115611ece57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060a0888a031215611f0957600080fd5b873567ffffffffffffffff80821115611f2157600080fd5b611f2d8b838c01611d45565b909950975060208a0135915080821115611f4657600080fd5b611f528b838c01611d45565b909750955060408a0135945060608a0135935060808a0135915080821115611f7957600080fd5b50611f868a828b01611e43565b91505092959891949750929550565b60008060008060008060008060c0898b031215611fb157600080fd5b8835611fbc81611c54565b9750602089013567ffffffffffffffff80821115611fd957600080fd5b611fe58c838d01611d45565b909950975060408b0135915080821115611ffe57600080fd5b61200a8c838d01611d45565b909750955060608b0135945060808b0135935060a08b013591508082111561203157600080fd5b5061203e8b828c01611e43565b9150509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561208f57600080fd5b813561ffff81168114611c8657600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156120fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561211357600080fd5b8151611c8681611c5456fea2646970667358221220a8044cbb76d9e796bb82c16b7bba52002bfef3c22825972d5ee82ebe2a3315b464736f6c634300080b0033
Deployed Bytecode Sourcemap
3636:6418:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4482:116;;;;;;:::i;:::-;;:::i;:::-;;9643:262;;;;;;:::i;:::-;;:::i;:::-;;;1540:66:8;1528:79;;;1510:98;;1498:2;1483:18;9643:262:3;;;;;;;;9982:65;;;:::i;1091:84:5:-;1138:4;1161:7;;;;;;1091:84;;1784:14:8;;1777:22;1759:41;;1747:2;1732:18;1091:84:5;1619:187:8;4254:44:3;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4254:44:3;;;;;;;;;;;;;2224:6:8;2212:19;;;2194:38;;-1:-1:-1;;;;;2268:55:8;;;2263:2;2248:18;;2241:83;2372:22;2360:35;2340:18;;;2333:63;2182:2;2167:18;4254:44:3;1996:406:8;9056:579:3;;;;;;:::i;:::-;;:::i;1661:101:4:-;;;:::i;7937:1109:3:-;;;;;;:::i;:::-;;:::i;9913:61::-;;;:::i;1029:85:4:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:4;1029:85;;;-1:-1:-1;;;;;5932:55:8;;;5914:74;;5902:2;5887:18;1029:85:4;5768:226:8;6187:1738:3;;;;;;:::i;:::-;;:::i;4305:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4305:44:3;;;;;;;;;3893:27;;;;;-1:-1:-1;;;;;3893:27:3;;;4167:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7391:25:8;;;7379:2;7364:18;4167:48:3;7245:177:8;4723:122:3;;;;;;:::i;:::-;-1:-1:-1;;;;;4816:21:3;4789:7;4816:21;;;:13;:21;;;;;;;4723:122;3859:27;;;;;-1:-1:-1;;;;;3859:27:3;;;4358:116;;;;;;:::i;:::-;;:::i;1911:198:4:-;;;;;;:::i;:::-;;:::i;3766:84:3:-;;3808:42;3766:84;;4482:116;1075:7:4;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;;;;;;;;;4560:12:3::1;:30:::0;;;::::1;-1:-1:-1::0;;;;;4560:30:3;;;::::1;::::0;;;::::1;::::0;;4482:116::o;9643:262::-;9749:6;-1:-1:-1;;;;;9774:20:3;;;9766:74;;;;-1:-1:-1;;;9766:74:3;;7990:2:8;9766:74:3;;;7972:21:8;8029:2;8009:18;;;8002:30;8068:34;8048:18;;;8041:62;8139:11;8119:18;;;8112:39;8168:19;;9766:74:3;7788:405:8;9766:74:3;-1:-1:-1;9856:41:3;9643:262;;;;;;;:::o;9982:65::-;1075:7:4;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;7427:356:8;1233:68:4;10029:10:3::1;:8;:10::i;:::-;9982:65::o:0;9056:579::-;1075:7:4;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;7427:356:8;1233:68:4;9199:6:3::1;9194:210;9211:24:::0;;::::1;9194:210;;;9265:12;::::0;-1:-1:-1;;;;;9265:12:3::1;9257:38;9304:4;9311:7:::0;9320:13;;9334:1;9320:16;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9257:84;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9009:15:8;;;9257:84:3::1;::::0;::::1;8991:34:8::0;9061:15;;;;9041:18;;;9034:43;9125:6;9113:19;9093:18;;;9086:47;9169:3;9149:18;;;9142:31;-1:-1:-1;9189:19:8;;;9182:30;9229:19;;9257:84:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9363:11;:29;9375:13;;9389:1;9375:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9363:29;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;9363:29:3;;;9356:36;9237:3;::::1;::::0;::::1;:::i;:::-;;;;9194:210;;;;9421:6;9416:210;9433:24:::0;;::::1;9416:210;;;9487:12;::::0;-1:-1:-1;;;;;9487:12:3::1;9479:38;9526:4;9533:7:::0;9542:13;;9556:1;9542:16;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9479:84;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9009:15:8;;;9479:84:3::1;::::0;::::1;8991:34:8::0;9061:15;;;;9041:18;;;9034:43;9125:6;9113:19;9093:18;;;9086:47;9169:3;9149:18;;;9142:31;-1:-1:-1;9189:19:8;;;9182:30;9229:19;;9479:84:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9585:11;:29;9597:13;;9611:1;9597:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9585:29;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;9585:29:3;;;9578:36;9459:3;::::1;::::0;::::1;:::i;:::-;;;;9416:210;;;;9056:579:::0;;;;;:::o;1661:101:4:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;7427:356:8;1233:68:4;1725:30:::1;1752:1;1725:18;:30::i;7937:1109:3:-:0;1138:4:5;1161:7;;;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:5;;9815:2:8;1396:38:5;;;9797:21:8;9854:2;9834:18;;;9827:30;9893:18;9873;;;9866:46;9929:18;;1396:38:5;9613:340:8;1396:38:5;719:10:0;8111:27:3::1;::::0;;;:13:::1;:27;::::0;;;;;:36;-1:-1:-1;8103:84:3::1;;;::::0;-1:-1:-1;;;8103:84:3;;10160:2:8;8103:84:3::1;::::0;::::1;10142:21:8::0;10199:2;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10309:5;10289:18;;;10282:33;10332:19;;8103:84:3::1;9958:399:8::0;8103:84:3::1;8206:64;3808:42;719:10:0::0;8230:12:3::1;8244:6;8252;8260:9;8206:6;:64::i;:::-;:72;;8274:4;8206:72;8198:125;;;::::0;-1:-1:-1;;;8198:125:3;;10564:2:8;8198:125:3::1;::::0;::::1;10546:21:8::0;10603:2;10583:18;;;10576:30;10642:34;10622:18;;;10615:62;10713:10;10693:18;;;10686:38;10741:19;;8198:125:3::1;10362:404:8::0;8198:125:3::1;719:10:0::0;8334:27:3::1;::::0;;;:13:::1;:27;::::0;;;;:36;;;8383:322:::1;8400:24:::0;;::::1;8383:322;;;719:10:0::0;8454:11:3::1;:29;8466:13:::0;;8480:1;8466:16;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8454:29;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8454:29:3;:35;;;::::1;-1:-1:-1::0;;;;;8454:35:3::1;:51;8446:92;;;::::0;-1:-1:-1;;;8446:92:3;;10973:2:8;8446:92:3::1;::::0;::::1;10955:21:8::0;11012:2;10992:18;;;10985:30;11051;11031:18;;;11024:58;11099:18;;8446:92:3::1;10771:352:8::0;8446:92:3::1;8561:12;::::0;-1:-1:-1;;;;;8561:12:3::1;8553:38;8600:4;719:10:0::0;8621:13:3::1;;8635:1;8621:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8553:89;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9009:15:8;;;8553:89:3::1;::::0;::::1;8991:34:8::0;9061:15;;;;9041:18;;;9034:43;9125:6;9113:19;9093:18;;;9086:47;9169:3;9149:18;;;9142:31;-1:-1:-1;9189:19:8;;;9182:30;9229:19;;8553:89:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8664:11;:29;8676:13;;8690:1;8676:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8664:29;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8664:29:3;;;8657:36;8426:3;::::1;::::0;::::1;:::i;:::-;;;;8383:322;;;;8722:6;8717:322;8734:24:::0;;::::1;8717:322;;;719:10:0::0;8788:11:3::1;:29;8800:13:::0;;8814:1;8800:16;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8788:29;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8788:29:3;:35;;;::::1;-1:-1:-1::0;;;;;8788:35:3::1;:51;8780:92;;;::::0;-1:-1:-1;;;8780:92:3;;10973:2:8;8780:92:3::1;::::0;::::1;10955:21:8::0;11012:2;10992:18;;;10985:30;11051;11031:18;;;11024:58;11099:18;;8780:92:3::1;10771:352:8::0;8780:92:3::1;8895:12;::::0;-1:-1:-1;;;;;8895:12:3::1;8887:38;8934:4;719:10:0::0;8955:13:3::1;;8969:1;8955:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8887:89;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;9009:15:8;;;8887:89:3::1;::::0;::::1;8991:34:8::0;9061:15;;;;9041:18;;;9034:43;9125:6;9113:19;9093:18;;;9086:47;9169:3;9149:18;;;9142:31;-1:-1:-1;9189:19:8;;;9182:30;9229:19;;8887:89:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8998:11;:29;9010:13;;9024:1;9010:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8998:29;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8998:29:3;;;8991:36;8760:3;::::1;::::0;::::1;:::i;:::-;;;;8717:322;;;;7937:1109:::0;;;;;;;:::o;9913:61::-;1075:7:4;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;7427:356:8;1233:68:4;9958:8:3::1;:6;:8::i;6187:1738::-:0;1138:4:5;1161:7;;;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:5;;9815:2:8;1396:38:5;;;9797:21:8;9854:2;9834:18;;;9827:30;9893:18;9873;;;9866:46;9929:18;;1396:38:5;9613:340:8;1396:38:5;-1:-1:-1;;;;;6376:23:3;::::1;719:10:0::0;6376:23:3::1;::::0;:55:::1;;-1:-1:-1::0;6419:12:3::1;::::0;-1:-1:-1;;;;;6419:12:3::1;719:10:0::0;-1:-1:-1;;;;;6403:28:3::1;;6376:55;6368:103;;;::::0;-1:-1:-1;;;6368:103:3;;11330:2:8;6368:103:3::1;::::0;::::1;11312:21:8::0;11369:2;11349:18;;;11342:30;11408:34;11388:18;;;11381:62;11479:5;11459:18;;;11452:33;11502:19;;6368:103:3::1;11128:399:8::0;6368:103:3::1;6512:12;::::0;-1:-1:-1;;;;;6512:12:3::1;719:10:0::0;-1:-1:-1;;;;;6496:28:3::1;;6492:862;;719:10:0::0;6549:27:3::1;::::0;;;:13:::1;:27;::::0;;;;;:36;-1:-1:-1;6541:84:3::1;;;::::0;-1:-1:-1;;;6541:84:3;;10160:2:8;6541:84:3::1;::::0;::::1;10142:21:8::0;10199:2;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;10309:5;10289:18;;;10282:33;10332:19;;6541:84:3::1;9958:399:8::0;6541:84:3::1;6648:64;3808:42;719:10:0::0;6672:12:3::1;640:96:0::0;6648:64:3::1;:72;;6716:4;6648:72;6640:123;;;::::0;-1:-1:-1;;;6640:123:3;;11734:2:8;6640:123:3::1;::::0;::::1;11716:21:8::0;11773:2;11753:18;;;11746:30;11812:34;11792:18;;;11785:62;11883:8;11863:18;;;11856:36;11909:19;;6640:123:3::1;11532:402:8::0;6640:123:3::1;719:10:0::0;6778:27:3::1;::::0;;;:13:::1;:27;::::0;;;;:36;;;6831:512:::1;6848:24:::0;;::::1;6831:512;;;6914:12;::::0;719:10:0;;-1:-1:-1;;;;;6914:12:3::1;6906:29;6936:13:::0;;6950:1;6936:16;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6906:47;::::0;;::::1;::::0;;;;;;12114:6:8;12102:19;;;6906:47:3::1;::::0;::::1;12084:38:8::0;12057:18;;6906:47:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6906:63:3::1;;6898:104;;;::::0;-1:-1:-1;;;6898:104:3;;10973:2:8;6898:104:3::1;::::0;::::1;10955:21:8::0;11012:2;10992:18;;;10985:30;11051;11031:18;;;11024:58;11099:18;;6898:104:3::1;10771:352:8::0;6898:104:3::1;7029:12;::::0;-1:-1:-1;;;;;7029:12:3::1;7021:34;719:10:0::0;7078:4:3::1;7085:13;;7099:1;7085:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7021:81;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;12669:15:8;;;7021:81:3::1;::::0;::::1;12651:34:8::0;12721:15;;;;12701:18;;;12694:43;12785:6;12773:19;12753:18;;;12746:47;12563:18;;7021:81:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7155:172;;;;;;;;7237:13;;7251:1;7237:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7155:172;;;;;;7191:7;-1:-1:-1::0;;;;;7155:172:3::1;;;;;7291:15;7155:172;;;;::::0;7123:11:::1;:29;7135:13;;7149:1;7135:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7123:29;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;7123:29:3;:204;;;;;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;::::1;::::0;-1:-1:-1;;;;;7123:204:3;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;6874:3;::::1;::::0;::::1;:::i;:::-;;;;6831:512;;;;6492:862;7371:6;7366:552;7383:24:::0;;::::1;7366:552;;;7449:12;::::0;-1:-1:-1;;;;;7449:12:3::1;719:10:0::0;-1:-1:-1;;;;;7433:28:3::1;;7429:273;;7498:12;::::0;719:10:0;;-1:-1:-1;;;;;7498:12:3::1;7490:29;7520:13:::0;;7534:1;7520:16;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7490:47;::::0;;::::1;::::0;;;;;;12114:6:8;12102:19;;;7490:47:3::1;::::0;::::1;12084:38:8::0;12057:18;;7490:47:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7490:63:3::1;;7482:104;;;::::0;-1:-1:-1;;;7482:104:3;;10973:2:8;7482:104:3::1;::::0;::::1;10955:21:8::0;11012:2;10992:18;;;10985:30;11051;11031:18;;;11024:58;11099:18;;7482:104:3::1;10771:352:8::0;7482:104:3::1;7613:12;::::0;-1:-1:-1;;;;;7613:12:3::1;7605:34;719:10:0::0;7662:4:3::1;7669:13;;7683:1;7669:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7605:81;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;12669:15:8;;;7605:81:3::1;::::0;::::1;12651:34:8::0;12721:15;;;;12701:18;;;12694:43;12785:6;12773:19;12753:18;;;12746:47;12563:18;;7605:81:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7429:273;7750:156;;;;;;;;7824:13;;7838:1;7824:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7750:156;;;;;;7782:7;-1:-1:-1::0;;;;;7750:156:3::1;;;;;7874:15;7750:156;;;;::::0;7718:11:::1;:29;7730:13;;7744:1;7730:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7718:29;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;7718:29:3;:188;;;;;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;::::1;::::0;-1:-1:-1;;;;;7718:188:3;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;;::::0;;7409:3;::::1;::::0;::::1;:::i;:::-;;;;7366:552;;;;6187:1738:::0;;;;;;;;:::o;4358:116::-;1075:7:4;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;7427:356:8;1233:68:4;4436:12:3::1;:30:::0;;;::::1;-1:-1:-1::0;;;;;4436:30:3;;;::::1;::::0;;;::::1;::::0;;4358:116::o;1911:198:4:-;1075:7;1101:6;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;7629:2:8;1233:68:4;;;7611:21:8;;;7648:18;;;7641:30;7707:34;7687:18;;;7680:62;7759:18;;1233:68:4;7427:356:8;1233:68:4;-1:-1:-1;;;;;1999:22:4;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:4;;13006:2:8;1991:73:4::1;::::0;::::1;12988:21:8::0;13045:2;13025:18;;;13018:30;13084:34;13064:18;;;13057:62;13155:8;13135:18;;;13128:36;13181:19;;1991:73:4::1;12804:402:8::0;1991:73:4::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;2103:117:5:-;1138:4;1161:7;;;;;;1662:41;;;;-1:-1:-1;;;1662:41:5;;13413:2:8;1662:41:5;;;13395:21:8;13452:2;13432:18;;;13425:30;13491:22;13471:18;;;13464:50;13531:18;;1662:41:5;13211:344:8;1662:41:5;2171:5:::1;2161:15:::0;;;::::1;::::0;;2191:22:::1;719:10:0::0;2200:12:5::1;2191:22;::::0;-1:-1:-1;;;;;5932:55:8;;;5914:74;;5902:2;5887:18;2191:22:5::1;;;;;;;2103:117::o:0;2263:187:4:-;2336:16;2355:6;;-1:-1:-1;;;;;2371:17:4;;;;;;;;;;2403:40;;2355:6;;;;;;;2403:40;;2336:16;2403:40;2326:124;2263:187;:::o;5231:358:3:-;4978:38;;;13778:66:8;13765:2;13761:15;;;13757:88;4978:38:3;;;;13745:101:8;;;;13862:12;;;13855:28;;;13899:12;;;;13892:28;;;4978:38:3;;;;;;;;;;13936:12:8;;;4978:38:3;;4968:49;;;;;;14201:66:8;5148::3;;;14189:79:8;14284:12;;;;14277:28;;;5148:66:3;;;;;;;;;;14321:12:8;;;;5148:66:3;;;5138:77;;;;;-1:-1:-1;;4968:49:3;5574:7;-1:-1:-1;;;;;5524:57:3;:46;5538:20;5560:9;5524:13;:46::i;:::-;-1:-1:-1;;;;;5524:57:3;;;5231:358;-1:-1:-1;;;;;;;;5231:358:3:o;1856:115:5:-;1138:4;1161:7;;;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:5;;9815:2:8;1396:38:5;;;9797:21:8;9854:2;9834:18;;;9827:30;9893:18;9873;;;9866:46;9929:18;;1396:38:5;9613:340:8;1396:38:5;1915:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;1944:20:::1;1951:12;719:10:0::0;;640:96;5597:249:3;5699:7;5720:9;5731;5742:7;5753:26;5768:10;5753:14;:26::i;:::-;5797:41;;;;;;;;;;;;14571:25:8;;;14644:4;14632:17;;14612:18;;;14605:45;;;;14666:18;;;14659:34;;;14709:18;;;14702:34;;;5719:60:3;;-1:-1:-1;5719:60:3;;-1:-1:-1;5719:60:3;-1:-1:-1;5797:41:3;;14543:19:8;;5797:41:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5797:41:3;;;;;;5597:249;-1:-1:-1;;;;;;;5597:249:3:o;5854:324::-;5919:9;5930;5941:7;5970:3;:10;5984:2;5970:16;5962:54;;;;-1:-1:-1;;;5962:54:3;;14949:2:8;5962:54:3;;;14931:21:8;14988:2;14968:18;;;14961:30;15027:27;15007:18;;;15000:55;15072:18;;5962:54:3;14747:349:8;5962:54:3;-1:-1:-1;;;6071:2:3;6062:12;;6056:19;6109:2;6100:12;;6094:19;6155:2;6146:12;;;6140:19;6056;;6137:1;6132:28;;;;;5854:324::o;14:154:8:-;-1:-1:-1;;;;;93:5:8;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:247;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;:::-;409:5;173:247;-1:-1:-1;;;173:247:8:o;425:936::-;522:6;530;538;546;554;607:3;595:9;586:7;582:23;578:33;575:53;;;624:1;621;614:12;575:53;663:9;650:23;682:31;707:5;682:31;:::i;:::-;732:5;-1:-1:-1;789:2:8;774:18;;761:32;802:33;761:32;802:33;:::i;:::-;854:7;-1:-1:-1;908:2:8;893:18;;880:32;;-1:-1:-1;963:2:8;948:18;;935:32;986:18;1016:14;;;1013:34;;;1043:1;1040;1033:12;1013:34;1081:6;1070:9;1066:22;1056:32;;1126:7;1119:4;1115:2;1111:13;1107:27;1097:55;;1148:1;1145;1138:12;1097:55;1188:2;1175:16;1214:2;1206:6;1203:14;1200:34;;;1230:1;1227;1220:12;1200:34;1275:7;1270:2;1261:6;1257:2;1253:15;1249:24;1246:37;1243:57;;;1296:1;1293;1286:12;1243:57;425:936;;;;-1:-1:-1;425:936:8;;-1:-1:-1;1327:2:8;1319:11;;1349:6;425:936;-1:-1:-1;;;425:936:8:o;1811:180::-;1870:6;1923:2;1911:9;1902:7;1898:23;1894:32;1891:52;;;1939:1;1936;1929:12;1891:52;-1:-1:-1;1962:23:8;;1811:180;-1:-1:-1;1811:180:8:o;2407:366::-;2469:8;2479:6;2533:3;2526:4;2518:6;2514:17;2510:27;2500:55;;2551:1;2548;2541:12;2500:55;-1:-1:-1;2574:20:8;;2617:18;2606:30;;2603:50;;;2649:1;2646;2639:12;2603:50;2686:4;2678:6;2674:17;2662:29;;2746:3;2739:4;2729:6;2726:1;2722:14;2714:6;2710:27;2706:38;2703:47;2700:67;;;2763:1;2760;2753:12;2700:67;2407:366;;;;;:::o;2778:904::-;2907:6;2915;2923;2931;2939;2992:2;2980:9;2971:7;2967:23;2963:32;2960:52;;;3008:1;3005;2998:12;2960:52;3047:9;3034:23;3066:31;3091:5;3066:31;:::i;:::-;3116:5;-1:-1:-1;3172:2:8;3157:18;;3144:32;3195:18;3225:14;;;3222:34;;;3252:1;3249;3242:12;3222:34;3291:69;3352:7;3343:6;3332:9;3328:22;3291:69;:::i;:::-;3379:8;;-1:-1:-1;3265:95:8;-1:-1:-1;3467:2:8;3452:18;;3439:32;;-1:-1:-1;3483:16:8;;;3480:36;;;3512:1;3509;3502:12;3480:36;;3551:71;3614:7;3603:8;3592:9;3588:24;3551:71;:::i;:::-;2778:904;;;;-1:-1:-1;2778:904:8;;-1:-1:-1;3641:8:8;;3525:97;2778:904;-1:-1:-1;;;2778:904:8:o;3687:184::-;3739:77;3736:1;3729:88;3836:4;3833:1;3826:15;3860:4;3857:1;3850:15;3876:777;3918:5;3971:3;3964:4;3956:6;3952:17;3948:27;3938:55;;3989:1;3986;3979:12;3938:55;4025:6;4012:20;4051:18;4088:2;4084;4081:10;4078:36;;;4094:18;;:::i;:::-;4228:2;4222:9;4290:4;4282:13;;4133:66;4278:22;;;4302:2;4274:31;4270:40;4258:53;;;4326:18;;;4346:22;;;4323:46;4320:72;;;4372:18;;:::i;:::-;4412:10;4408:2;4401:22;4447:2;4439:6;4432:18;4493:3;4486:4;4481:2;4473:6;4469:15;4465:26;4462:35;4459:55;;;4510:1;4507;4500:12;4459:55;4574:2;4567:4;4559:6;4555:17;4548:4;4540:6;4536:17;4523:54;4621:1;4614:4;4609:2;4601:6;4597:15;4593:26;4586:37;4641:6;4632:15;;;;;;3876:777;;;;:::o;4658:1105::-;4814:6;4822;4830;4838;4846;4854;4862;4915:3;4903:9;4894:7;4890:23;4886:33;4883:53;;;4932:1;4929;4922:12;4883:53;4972:9;4959:23;5001:18;5042:2;5034:6;5031:14;5028:34;;;5058:1;5055;5048:12;5028:34;5097:69;5158:7;5149:6;5138:9;5134:22;5097:69;:::i;:::-;5185:8;;-1:-1:-1;5071:95:8;-1:-1:-1;5273:2:8;5258:18;;5245:32;;-1:-1:-1;5289:16:8;;;5286:36;;;5318:1;5315;5308:12;5286:36;5357:71;5420:7;5409:8;5398:9;5394:24;5357:71;:::i;:::-;5447:8;;-1:-1:-1;5331:97:8;-1:-1:-1;5529:2:8;5514:18;;5501:32;;-1:-1:-1;5580:2:8;5565:18;;5552:32;;-1:-1:-1;5637:3:8;5622:19;;5609:33;;-1:-1:-1;5654:16:8;;;5651:36;;;5683:1;5680;5673:12;5651:36;;5706:51;5749:7;5738:8;5727:9;5723:24;5706:51;:::i;:::-;5696:61;;;4658:1105;;;;;;;;;;:::o;5999:1241::-;6164:6;6172;6180;6188;6196;6204;6212;6220;6273:3;6261:9;6252:7;6248:23;6244:33;6241:53;;;6290:1;6287;6280:12;6241:53;6329:9;6316:23;6348:31;6373:5;6348:31;:::i;:::-;6398:5;-1:-1:-1;6454:2:8;6439:18;;6426:32;6477:18;6507:14;;;6504:34;;;6534:1;6531;6524:12;6504:34;6573:69;6634:7;6625:6;6614:9;6610:22;6573:69;:::i;:::-;6661:8;;-1:-1:-1;6547:95:8;-1:-1:-1;6749:2:8;6734:18;;6721:32;;-1:-1:-1;6765:16:8;;;6762:36;;;6794:1;6791;6784:12;6762:36;6833:71;6896:7;6885:8;6874:9;6870:24;6833:71;:::i;:::-;6923:8;;-1:-1:-1;6807:97:8;-1:-1:-1;7005:2:8;6990:18;;6977:32;;-1:-1:-1;7056:3:8;7041:19;;7028:33;;-1:-1:-1;7114:3:8;7099:19;;7086:33;;-1:-1:-1;7131:16:8;;;7128:36;;;7160:1;7157;7150:12;7128:36;;7183:51;7226:7;7215:8;7204:9;7200:24;7183:51;:::i;:::-;7173:61;;;5999:1241;;;;;;;;;;;:::o;8198:184::-;8250:77;8247:1;8240:88;8347:4;8344:1;8337:15;8371:4;8368:1;8361:15;8387:272;8445:6;8498:2;8486:9;8477:7;8473:23;8469:32;8466:52;;;8514:1;8511;8504:12;8466:52;8553:9;8540:23;8603:6;8596:5;8592:18;8585:5;8582:29;8572:57;;8625:1;8622;8615:12;9259:349;9298:3;9329:66;9322:5;9319:77;9316:257;;;9429:77;9426:1;9419:88;9530:4;9527:1;9520:15;9558:4;9555:1;9548:15;9316:257;-1:-1:-1;9600:1:8;9589:13;;9259:349::o;12133:251::-;12203:6;12256:2;12244:9;12235:7;12231:23;12227:32;12224:52;;;12272:1;12269;12262:12;12224:52;12304:9;12298:16;12323:31;12348:5;12323:31;:::i
Swarm Source
ipfs://a8044cbb76d9e796bb82c16b7bba52002bfef3c22825972d5ee82ebe2a3315b4
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.