Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RektStaking
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-23 */ // Sources flattened with hardhat v2.12.6 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @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); } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is Initializable, ERC165Upgradeable, IERC1155ReceiverUpgradeable { function __ERC1155Receiver_init() internal onlyInitializing { } function __ERC1155Receiver_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155HolderUpgradeable is Initializable, ERC1155ReceiverUpgradeable { function __ERC1155Holder_init() internal onlyInitializing { } function __ERC1155Holder_init_unchained() internal onlyInitializing { } function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File contracts/library/FixedPointLibrary.sol pragma solidity 0.8.12; library FixedPointLibrary { function digits() internal pure returns(uint256){ return 32; } function divider() internal pure returns(uint256){ return 10**digits(); } function toFixed(uint256 number) internal pure returns(uint256){ return number*divider(); } function fromFixed(uint256 number) internal pure returns(uint256 result){ result = number/divider(); } } // File contracts/RektStaking.sol pragma solidity 0.8.12; contract RektStaking is OwnableUpgradeable, ERC1155HolderUpgradeable { using FixedPointLibrary for uint256; enum RegisteredERC {NOT_REGISTERED, ERC721, ERC1155} IERC20 public stakingToken; struct UserInfo { uint256 totalStakingPower; uint256 totalReceivedReward; uint256 S0; } mapping(address => UserInfo) public users; mapping(address => uint256) public erc721SP; mapping(address => mapping(uint256 => uint256)) public erc1155SP; mapping(address => mapping(uint256 => mapping(address => uint256))) public erc1155Balances; mapping(address => RegisteredERC) public registeredERC; /************************ Staking Stat ************************/ uint256 public constant epochTime = 7884000; bool public isStakingActive; uint256 public startTime; uint256 public currentReward; uint256 public lastRewardTime; uint256 public endTime; uint256 public totalReward; uint256 public totalRewardDispersed; uint256 public totalStakingPower; uint256 public S; /************************ Events ************************/ event StakeERC1155(address indexed user, uint256[] ids, uint256[] amounts); event UnstakeERC1155(address indexed user, uint256[] ids, uint256[] amounts); event Claim(address indexed user, uint256 amount, uint256 S); event UpdateReward(uint256 S); function initialize( address token ) public initializer { require(token != address(0), "Zero Address"); __Ownable_init(); stakingToken = IERC20(token); currentReward = 2438546930492136000; totalReward = 80000000000000000000000000; } /************************ User Functions ************************/ function stakeERC1155( address _contract, uint256[] memory _listOfIds, uint256[] memory _amounts ) external { require(registeredERC[_contract] == RegisteredERC.ERC1155, "NA"); require(_listOfIds.length == _amounts.length, "Length are not same"); // updating current reward information updateReward(); UserInfo storage userInfo = users[msg.sender]; if (userInfo.totalStakingPower != 0) { claimReward(); } else { userInfo.S0 = S; } uint256 amountSP; for (uint256 i = 0; i < _listOfIds.length; i++) { amountSP += _amounts[i] * erc1155SP[_contract][_listOfIds[i]]; erc1155Balances[_contract][_listOfIds[i]][msg.sender] += _amounts[i]; } require(amountSP != 0, "StakingPower can't be zero"); IERC1155(_contract).safeBatchTransferFrom(msg.sender, address(this), _listOfIds, _amounts, ""); totalStakingPower += amountSP; userInfo.totalStakingPower += amountSP; emit StakeERC1155(msg.sender, _listOfIds, _amounts); } function claim() public { updateReward(); claimReward(); } function unstakeERC1155( address _contract, uint256[] memory _listOfIds, uint256[] memory _amounts ) external { require(registeredERC[_contract] == RegisteredERC.ERC1155, "NA"); require(_listOfIds.length == _amounts.length, "Length are not same"); // updating current reward information updateReward(); UserInfo storage userInfo = users[msg.sender]; require(userInfo.totalStakingPower != 0, "Nothing to withdraw"); claimReward(); uint256 amountSp; for (uint256 i = 0; i < _listOfIds.length; i++) { require(_amounts[i] <= erc1155Balances[_contract][_listOfIds[i]][msg.sender], "Not enough balances"); amountSp += _amounts[i] * erc1155SP[_contract][_listOfIds[i]]; erc1155Balances[_contract][_listOfIds[i]][msg.sender] -= _amounts[i]; } require(amountSp != 0, " can't be zero"); IERC1155(_contract).safeBatchTransferFrom(address(this), msg.sender, _listOfIds, _amounts, ""); totalStakingPower -= amountSp; userInfo.totalStakingPower -= amountSp; emit UnstakeERC1155(msg.sender, _listOfIds, _amounts); } /************************ View Function ************************/ function getPendingReward(address user) external view returns (uint256 reward) { if (isStakingActive) { uint256 _S = S; (uint256 rewardAmount,) = calcReward(); uint256 rewardInFixed = rewardAmount.toFixed(); if (totalStakingPower != 0) { _S = S + (rewardInFixed / totalStakingPower); } reward = calcUserReward(user, _S); } else { reward = 0; } } /************************ Internal Calls ************************/ function updateReward() internal { if (isStakingActive) { if (endTime >= block.timestamp) { (uint256 rewardAmount,uint256 newReward) = calcReward(); uint256 rewardInFixed = rewardAmount.toFixed(); if (totalStakingPower != 0) { S = S + (rewardInFixed / totalStakingPower); } currentReward = newReward; totalRewardDispersed += rewardAmount; } else { uint256 rewardInFixed = (totalReward - totalRewardDispersed).toFixed(); if (totalStakingPower != 0) { S = S + (rewardInFixed / totalStakingPower); } currentReward = 0; totalRewardDispersed = totalReward; } lastRewardTime = block.timestamp; emit UpdateReward(S); } } function calcReward() internal view returns (uint256 rewardAmount, uint256 rewardPerTime) { uint256 startPeriod = ((lastRewardTime - startTime) / epochTime) + 1; uint256 startPeriodBlock = startTime + (epochTime * startPeriod); uint256 currentBlock = block.timestamp; if (startPeriodBlock > currentBlock) { rewardAmount = currentReward * (currentBlock - lastRewardTime); rewardPerTime = currentReward; } else { bool isContinue = true; uint256 i = startPeriod; rewardAmount = currentReward * (startPeriodBlock - lastRewardTime); uint256 tempRewardPerTime = currentReward; while (isContinue) { tempRewardPerTime = (tempRewardPerTime * 80) / 100; uint256 nextBlock = startTime + (epochTime * (i + 1)); if (nextBlock <= currentBlock) { rewardAmount += (tempRewardPerTime * epochTime); } else { uint256 blocks = nextBlock - epochTime; rewardAmount += (tempRewardPerTime * (currentBlock - blocks)); isContinue = false; } i++; } rewardPerTime = tempRewardPerTime; } } function claimReward() internal { if (isStakingActive) { UserInfo storage userInfo = users[msg.sender]; uint256 reward = calcUserReward(msg.sender, S); if (reward != 0) { safeTransferToken(msg.sender, reward); } // updating UserInfo userInfo.S0 = S; userInfo.totalReceivedReward = userInfo.totalReceivedReward + reward; emit Claim(msg.sender, reward, S); } } function calcUserReward(address _user, uint256 _S) internal view returns (uint256 reward) { UserInfo memory userInfo = users[_user]; uint256 rewardMultiplier = _S - userInfo.S0; uint256 rewardInFixed = userInfo.totalStakingPower * rewardMultiplier; reward = rewardInFixed.fromFixed(); } function safeTransferToken(address _to, uint256 _amount) internal { uint256 balance = stakingToken.balanceOf(address(this)); if (_amount > balance) { stakingToken.transfer(_to, balance); } else { stakingToken.transfer(_to, _amount); } } /************************ Managing Contract ************************/ function registerERC721(address _contract, uint256 _sP) public onlyOwner { require(_contract != address(0), "Zero Address"); registeredERC[_contract] = RegisteredERC.ERC721; erc721SP[_contract] = _sP; } function registerERC1155(address _contract, uint256[] memory _listOfIds, uint256[] memory _sp) public onlyOwner { require(_contract != address(0), "Zero Address"); require(_listOfIds.length == _sp.length, "Length are not same"); registeredERC[_contract] = RegisteredERC.ERC1155; for (uint i = 0; i < _listOfIds.length; i++) { require(_sp[i] != 0, "NOT ZERO"); erc1155SP[_contract][_listOfIds[i]] = _sp[i]; } } function start() public onlyOwner { uint256 currentTime = block.timestamp; isStakingActive = true; startTime = currentTime; lastRewardTime = currentTime; endTime = currentTime + (epochTime * 8); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"S","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"StakeERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"UnstakeERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"S","type":"uint256"}],"name":"UpdateReward","type":"event"},{"inputs":[],"name":"S","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"erc1155Balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"erc1155SP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"erc721SP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isStakingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256[]","name":"_listOfIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_sp","type":"uint256[]"}],"name":"registerERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_sP","type":"uint256"}],"name":"registerERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"registeredERC","outputs":[{"internalType":"enum RektStaking.RegisteredERC","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256[]","name":"_listOfIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"stakeERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardDispersed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingPower","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":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256[]","name":"_listOfIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"unstakeERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"totalStakingPower","type":"uint256"},{"internalType":"uint256","name":"totalReceivedReward","type":"uint256"},{"internalType":"uint256","name":"S0","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611da1806100206000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637e21aeb211610104578063c23b47f7116100a2578063ee514bc311610071578063ee514bc314610412578063f18d64b514610443578063f23a6e6114610474578063f2fde38b1461049357600080fd5b8063c23b47f7146103c2578063c4d66de8146103e2578063c84abc12146103f5578063d25976cb146103ff57600080fd5b8063a87430ba116100de578063a87430ba14610325578063b4e6e1be1461036f578063bc197c8114610382578063be9a6555146103ba57600080fd5b80637e21aeb2146102df5780638da5cb5b1461030a5780639231cf741461031b57600080fd5b80634e71d92d1161017c578063715018a61161014b578063715018a61461029857806372f702f3146102a0578063750142e6146102cb57806378e97925146102d557600080fd5b80634e71d92d146102655780635053e4611461026d5780635db2115c1461027757806361f644571461028a57600080fd5b80633197cbb6116101b85780633197cbb614610234578063340e1a4d1461023e5780634be1c796146102485780634df9d6ba1461025257600080fd5b806301ffc9a7146101df57806307621eca1461020757806316f183f51461021f575b600080fd5b6101f26101ed36600461166f565b6104a6565b60405190151581526020015b60405180910390f35b6102116101035481565b6040519081526020016101fe565b61023261022d36600461177e565b6104dd565b005b6102116101055481565b6102116101085481565b6102116101095481565b6102116102603660046117f2565b6107f6565b610232610869565b61021162784ce081565b61023261028536600461177e565b61087b565b610101546101f29060ff1681565b6102326109d3565b60fb546102b3906001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b6102116101065481565b6102116101025481565b6102116102ed36600461180d565b60fe60209081526000928352604080842090915290825290205481565b6033546001600160a01b03166102b3565b6102116101045481565b6103546103333660046117f2565b60fc6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101fe565b61023261037d36600461180d565b6109e5565b6103a16103903660046118a7565b63bc197c8160e01b95945050505050565b6040516001600160e01b031990911681526020016101fe565b610232610a46565b6102116103d03660046117f2565b60fd6020526000908152604090205481565b6102326103f03660046117f2565b610a88565b6102116101075481565b61023261040d36600461177e565b610bf8565b6104366104203660046117f2565b6101006020526000908152604090205460ff1681565b6040516101fe9190611967565b61021161045136600461198f565b60ff60209081526000938452604080852082529284528284209052825290205481565b6103a16104823660046119cb565b63f23a6e6160e01b95945050505050565b6102326104a13660046117f2565b610fe4565b60006001600160e01b03198216630271189760e51b14806104d757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60026001600160a01b0384166000908152610100602052604090205460ff16600281111561050d5761050d611951565b146105445760405162461bcd60e51b81526020600482015260026024820152614e4160f01b60448201526064015b60405180910390fd5b80518251146105655760405162461bcd60e51b815260040161053b90611a30565b61056d61105d565b33600090815260fc602052604090208054156105905761058b61117c565b61059a565b6101095460028201555b6000805b84518110156106d0576001600160a01b038616600090815260fe6020526040812086519091908790849081106105d6576105d6611a5d565b60200260200101518152602001908152602001600020548482815181106105ff576105ff611a5d565b60200260200101516106119190611a89565b61061b9083611aa8565b915083818151811061062f5761062f611a5d565b602002602001015160ff6000886001600160a01b03166001600160a01b03168152602001908152602001600020600087848151811061067057610670611a5d565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008282546106b89190611aa8565b909155508190506106c881611ac0565b91505061059e565b508061071e5760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e67506f7765722063616e2774206265207a65726f000000000000604482015260640161053b565b604051631759616b60e11b81526001600160a01b03861690632eb2c2d690610750903390309089908990600401611b16565b600060405180830381600087803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b505050508061010860008282546107959190611aa8565b90915550508154819083906000906107ae908490611aa8565b909155505060405133907f740e8d8c2676520941f11dd9546978227e5ca5ff6cd5b5bd0b8fcdb39081bace906107e79087908790611b71565b60405180910390a25050505050565b6101015460009060ff16156108605761010954600061081361121f565b50905060006108218261138f565b90506101085460001461084d576101085461083c9082611b96565b6101095461084a9190611aa8565b92505b61085785846113a3565b95945050505050565b5060005b919050565b61087161105d565b61087961117c565b565b610883611415565b6001600160a01b0383166108a95760405162461bcd60e51b815260040161053b90611bb8565b80518251146108ca5760405162461bcd60e51b815260040161053b90611a30565b6001600160a01b038316600090815261010060205260408120805460ff191660021790555b82518110156109cd5781818151811061090a5761090a611a5d565b60200260200101516000141561094d5760405162461bcd60e51b81526020600482015260086024820152674e4f54205a45524f60c01b604482015260640161053b565b81818151811061095f5761095f611a5d565b602002602001015160fe6000866001600160a01b03166001600160a01b0316815260200190815260200160002060008584815181106109a0576109a0611a5d565b602002602001015181526020019081526020016000208190555080806109c590611ac0565b9150506108ef565b50505050565b6109db611415565b610879600061146f565b6109ed611415565b6001600160a01b038216610a135760405162461bcd60e51b815260040161053b90611bb8565b6001600160a01b0391909116600090815261010060209081526040808320805460ff1916600117905560fd909152902055565b610a4e611415565b610101805460ff1916600117905542610102819055610104819055610a7762784ce06008611a89565b610a819082611aa8565b6101055550565b600054610100900460ff1615808015610aa85750600054600160ff909116105b80610ac25750303b158015610ac2575060005460ff166001145b610b255760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053b565b6000805460ff191660011790558015610b48576000805461ff0019166101001790555b6001600160a01b038216610b6e5760405162461bcd60e51b815260040161053b90611bb8565b610b766114c1565b60fb80546001600160a01b0319166001600160a01b0384161790556721d77583681a5a40610103556a422ca8b0a00a4250000000610106558015610bf4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60026001600160a01b0384166000908152610100602052604090205460ff166002811115610c2857610c28611951565b14610c5a5760405162461bcd60e51b81526020600482015260026024820152614e4160f01b604482015260640161053b565b8051825114610c7b5760405162461bcd60e51b815260040161053b90611a30565b610c8361105d565b33600090815260fc602052604090208054610cd65760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015260640161053b565b610cde61117c565b6000805b8451811015610edb576001600160a01b038616600090815260ff602052604081208651909190879084908110610d1a57610d1a611a5d565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054848281518110610d6657610d66611a5d565b60200260200101511115610db25760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f7567682062616c616e63657360681b604482015260640161053b565b6001600160a01b038616600090815260fe602052604081208651909190879084908110610de157610de1611a5d565b6020026020010151815260200190815260200160002054848281518110610e0a57610e0a611a5d565b6020026020010151610e1c9190611a89565b610e269083611aa8565b9150838181518110610e3a57610e3a611a5d565b602002602001015160ff6000886001600160a01b03166001600160a01b031681526020019081526020016000206000878481518110610e7b57610e7b611a5d565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b031681526020019081526020016000206000828254610ec39190611bde565b90915550819050610ed381611ac0565b915050610ce2565b5080610f1b5760405162461bcd60e51b815260206004820152600f60248201526e202063616e2774206265207a65726f60881b604482015260640161053b565b604051631759616b60e11b81526001600160a01b03861690632eb2c2d690610f4d903090339089908990600401611b16565b600060405180830381600087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b50505050806101086000828254610f929190611bde565b9091555050815481908390600090610fab908490611bde565b909155505060405133907fd4a841c3e635153f9bcd747beb0acf58cb9479dfe54b3fe7ed9acb5e191ce90a906107e79087908790611b71565b610fec611415565b6001600160a01b0381166110515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161053b565b61105a8161146f565b50565b6101015460ff1615610879574261010554106110e45760008061107e61121f565b91509150600061108d8361138f565b9050610108546000146110bb57610108546110a89082611b96565b610109546110b69190611aa8565b610109555b81610103819055508261010760008282546110d69190611aa8565b9091555061113e9350505050565b600061110061010754610106546110fb9190611bde565b61138f565b90506101085460001461112e576101085461111b9082611b96565b610109546111299190611aa8565b610109555b5060006101035561010654610107555b4261010455610109546040519081527f0a20771588202779c3c4cb1dedde6e8dcc8dbcb6739073bf52f4a7e8d49040269060200160405180910390a1565b6101015460ff16156108795733600081815260fc602052604081206101095490926111a6916113a3565b905080156111b8576111b833826114f0565b61010954600283015560018201546111d1908290611aa8565b60018301556101095460405133917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79161121391858252602082015260400190565b60405180910390a25050565b600080600062784ce0610102546101045461123a9190611bde565b6112449190611b96565b61124f906001611aa8565b905060006112608262784ce0611a89565b6101025461126e9190611aa8565b905042808211156112a257610104546112879082611bde565b610103546112959190611a89565b9450610103549350611388565b6101045460019084906112b59085611bde565b610103546112c39190611a89565b610103549097505b82156113835760646112de826050611a89565b6112e89190611b96565b905060006112f7836001611aa8565b6113049062784ce0611a89565b610102546113129190611aa8565b90508481116113395761132862784ce083611a89565b611332908a611aa8565b9850611370565b600061134862784ce083611bde565b90506113548187611bde565b61135e9084611a89565b611368908b611aa8565b995060009450505b8261137a81611ac0565b935050506112cb565b955050505b5050509091565b6000611399611618565b6104d79083611a89565b6001600160a01b038216600090815260fc602090815260408083208151606081018352815481526001820154938101939093526002015490820181905282906113ec9085611bde565b905060008183600001516114009190611a89565b905061140b8161162b565b9695505050505050565b6033546001600160a01b031633146108795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161053b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166114e85760405162461bcd60e51b815260040161053b90611bf5565b61087961163f565b60fb546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190611c40565b9050808211156115df5760fb5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb906044015b6020604051808303816000875af11580156115bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cd9190611c59565b60fb5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb9060440161159c565b60006116266020600a611d5f565b905090565b6000611635611618565b6104d79083611b96565b600054610100900460ff166116665760405162461bcd60e51b815260040161053b90611bf5565b6108793361146f565b60006020828403121561168157600080fd5b81356001600160e01b03198116811461169957600080fd5b9392505050565b80356001600160a01b038116811461086457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116f6576116f66116b7565b604052919050565b600082601f83011261170f57600080fd5b8135602067ffffffffffffffff82111561172b5761172b6116b7565b8160051b61173a8282016116cd565b928352848101820192828101908785111561175457600080fd5b83870192505b848310156117735782358252918301919083019061175a565b979650505050505050565b60008060006060848603121561179357600080fd5b61179c846116a0565b9250602084013567ffffffffffffffff808211156117b957600080fd5b6117c5878388016116fe565b935060408601359150808211156117db57600080fd5b506117e8868287016116fe565b9150509250925092565b60006020828403121561180457600080fd5b611699826116a0565b6000806040838503121561182057600080fd5b611829836116a0565b946020939093013593505050565b600082601f83011261184857600080fd5b813567ffffffffffffffff811115611862576118626116b7565b611875601f8201601f19166020016116cd565b81815284602083860101111561188a57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156118bf57600080fd5b6118c8866116a0565b94506118d6602087016116a0565b9350604086013567ffffffffffffffff808211156118f357600080fd5b6118ff89838a016116fe565b9450606088013591508082111561191557600080fd5b61192189838a016116fe565b9350608088013591508082111561193757600080fd5b5061194488828901611837565b9150509295509295909350565b634e487b7160e01b600052602160045260246000fd5b602081016003831061198957634e487b7160e01b600052602160045260246000fd5b91905290565b6000806000606084860312156119a457600080fd5b6119ad846116a0565b9250602084013591506119c2604085016116a0565b90509250925092565b600080600080600060a086880312156119e357600080fd5b6119ec866116a0565b94506119fa602087016116a0565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a2457600080fd5b61194488828901611837565b6020808252601390820152724c656e67746820617265206e6f742073616d6560681b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611aa357611aa3611a73565b500290565b60008219821115611abb57611abb611a73565b500190565b6000600019821415611ad457611ad4611a73565b5060010190565b600081518084526020808501945080840160005b83811015611b0b57815187529582019590820190600101611aef565b509495945050505050565b6001600160a01b0385811682528416602082015260a060408201819052600090611b4290830185611adb565b8281036060840152611b548185611adb565b838103608090940193909352505060008152602001949350505050565b604081526000611b846040830185611adb565b82810360208401526108578185611adb565b600082611bb357634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b600082821015611bf057611bf0611a73565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215611c5257600080fd5b5051919050565b600060208284031215611c6b57600080fd5b8151801515811461169957600080fd5b600181815b80851115611cb6578160001904821115611c9c57611c9c611a73565b80851615611ca957918102915b93841c9390800290611c80565b509250929050565b600082611ccd575060016104d7565b81611cda575060006104d7565b8160018114611cf05760028114611cfa57611d16565b60019150506104d7565b60ff841115611d0b57611d0b611a73565b50506001821b6104d7565b5060208310610133831016604e8410600b8410161715611d39575081810a6104d7565b611d438383611c7b565b8060001904821115611d5757611d57611a73565b029392505050565b60006116998383611cbe56fea2646970667358221220cf7bcf906f0c423ce75f5b7e74e13d1a17390ed27061f8cb23fff251b1a99b7064736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637e21aeb211610104578063c23b47f7116100a2578063ee514bc311610071578063ee514bc314610412578063f18d64b514610443578063f23a6e6114610474578063f2fde38b1461049357600080fd5b8063c23b47f7146103c2578063c4d66de8146103e2578063c84abc12146103f5578063d25976cb146103ff57600080fd5b8063a87430ba116100de578063a87430ba14610325578063b4e6e1be1461036f578063bc197c8114610382578063be9a6555146103ba57600080fd5b80637e21aeb2146102df5780638da5cb5b1461030a5780639231cf741461031b57600080fd5b80634e71d92d1161017c578063715018a61161014b578063715018a61461029857806372f702f3146102a0578063750142e6146102cb57806378e97925146102d557600080fd5b80634e71d92d146102655780635053e4611461026d5780635db2115c1461027757806361f644571461028a57600080fd5b80633197cbb6116101b85780633197cbb614610234578063340e1a4d1461023e5780634be1c796146102485780634df9d6ba1461025257600080fd5b806301ffc9a7146101df57806307621eca1461020757806316f183f51461021f575b600080fd5b6101f26101ed36600461166f565b6104a6565b60405190151581526020015b60405180910390f35b6102116101035481565b6040519081526020016101fe565b61023261022d36600461177e565b6104dd565b005b6102116101055481565b6102116101085481565b6102116101095481565b6102116102603660046117f2565b6107f6565b610232610869565b61021162784ce081565b61023261028536600461177e565b61087b565b610101546101f29060ff1681565b6102326109d3565b60fb546102b3906001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b6102116101065481565b6102116101025481565b6102116102ed36600461180d565b60fe60209081526000928352604080842090915290825290205481565b6033546001600160a01b03166102b3565b6102116101045481565b6103546103333660046117f2565b60fc6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101fe565b61023261037d36600461180d565b6109e5565b6103a16103903660046118a7565b63bc197c8160e01b95945050505050565b6040516001600160e01b031990911681526020016101fe565b610232610a46565b6102116103d03660046117f2565b60fd6020526000908152604090205481565b6102326103f03660046117f2565b610a88565b6102116101075481565b61023261040d36600461177e565b610bf8565b6104366104203660046117f2565b6101006020526000908152604090205460ff1681565b6040516101fe9190611967565b61021161045136600461198f565b60ff60209081526000938452604080852082529284528284209052825290205481565b6103a16104823660046119cb565b63f23a6e6160e01b95945050505050565b6102326104a13660046117f2565b610fe4565b60006001600160e01b03198216630271189760e51b14806104d757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60026001600160a01b0384166000908152610100602052604090205460ff16600281111561050d5761050d611951565b146105445760405162461bcd60e51b81526020600482015260026024820152614e4160f01b60448201526064015b60405180910390fd5b80518251146105655760405162461bcd60e51b815260040161053b90611a30565b61056d61105d565b33600090815260fc602052604090208054156105905761058b61117c565b61059a565b6101095460028201555b6000805b84518110156106d0576001600160a01b038616600090815260fe6020526040812086519091908790849081106105d6576105d6611a5d565b60200260200101518152602001908152602001600020548482815181106105ff576105ff611a5d565b60200260200101516106119190611a89565b61061b9083611aa8565b915083818151811061062f5761062f611a5d565b602002602001015160ff6000886001600160a01b03166001600160a01b03168152602001908152602001600020600087848151811061067057610670611a5d565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008282546106b89190611aa8565b909155508190506106c881611ac0565b91505061059e565b508061071e5760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e67506f7765722063616e2774206265207a65726f000000000000604482015260640161053b565b604051631759616b60e11b81526001600160a01b03861690632eb2c2d690610750903390309089908990600401611b16565b600060405180830381600087803b15801561076a57600080fd5b505af115801561077e573d6000803e3d6000fd5b505050508061010860008282546107959190611aa8565b90915550508154819083906000906107ae908490611aa8565b909155505060405133907f740e8d8c2676520941f11dd9546978227e5ca5ff6cd5b5bd0b8fcdb39081bace906107e79087908790611b71565b60405180910390a25050505050565b6101015460009060ff16156108605761010954600061081361121f565b50905060006108218261138f565b90506101085460001461084d576101085461083c9082611b96565b6101095461084a9190611aa8565b92505b61085785846113a3565b95945050505050565b5060005b919050565b61087161105d565b61087961117c565b565b610883611415565b6001600160a01b0383166108a95760405162461bcd60e51b815260040161053b90611bb8565b80518251146108ca5760405162461bcd60e51b815260040161053b90611a30565b6001600160a01b038316600090815261010060205260408120805460ff191660021790555b82518110156109cd5781818151811061090a5761090a611a5d565b60200260200101516000141561094d5760405162461bcd60e51b81526020600482015260086024820152674e4f54205a45524f60c01b604482015260640161053b565b81818151811061095f5761095f611a5d565b602002602001015160fe6000866001600160a01b03166001600160a01b0316815260200190815260200160002060008584815181106109a0576109a0611a5d565b602002602001015181526020019081526020016000208190555080806109c590611ac0565b9150506108ef565b50505050565b6109db611415565b610879600061146f565b6109ed611415565b6001600160a01b038216610a135760405162461bcd60e51b815260040161053b90611bb8565b6001600160a01b0391909116600090815261010060209081526040808320805460ff1916600117905560fd909152902055565b610a4e611415565b610101805460ff1916600117905542610102819055610104819055610a7762784ce06008611a89565b610a819082611aa8565b6101055550565b600054610100900460ff1615808015610aa85750600054600160ff909116105b80610ac25750303b158015610ac2575060005460ff166001145b610b255760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161053b565b6000805460ff191660011790558015610b48576000805461ff0019166101001790555b6001600160a01b038216610b6e5760405162461bcd60e51b815260040161053b90611bb8565b610b766114c1565b60fb80546001600160a01b0319166001600160a01b0384161790556721d77583681a5a40610103556a422ca8b0a00a4250000000610106558015610bf4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60026001600160a01b0384166000908152610100602052604090205460ff166002811115610c2857610c28611951565b14610c5a5760405162461bcd60e51b81526020600482015260026024820152614e4160f01b604482015260640161053b565b8051825114610c7b5760405162461bcd60e51b815260040161053b90611a30565b610c8361105d565b33600090815260fc602052604090208054610cd65760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015260640161053b565b610cde61117c565b6000805b8451811015610edb576001600160a01b038616600090815260ff602052604081208651909190879084908110610d1a57610d1a611a5d565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002054848281518110610d6657610d66611a5d565b60200260200101511115610db25760405162461bcd60e51b81526020600482015260136024820152724e6f7420656e6f7567682062616c616e63657360681b604482015260640161053b565b6001600160a01b038616600090815260fe602052604081208651909190879084908110610de157610de1611a5d565b6020026020010151815260200190815260200160002054848281518110610e0a57610e0a611a5d565b6020026020010151610e1c9190611a89565b610e269083611aa8565b9150838181518110610e3a57610e3a611a5d565b602002602001015160ff6000886001600160a01b03166001600160a01b031681526020019081526020016000206000878481518110610e7b57610e7b611a5d565b602002602001015181526020019081526020016000206000336001600160a01b03166001600160a01b031681526020019081526020016000206000828254610ec39190611bde565b90915550819050610ed381611ac0565b915050610ce2565b5080610f1b5760405162461bcd60e51b815260206004820152600f60248201526e202063616e2774206265207a65726f60881b604482015260640161053b565b604051631759616b60e11b81526001600160a01b03861690632eb2c2d690610f4d903090339089908990600401611b16565b600060405180830381600087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b50505050806101086000828254610f929190611bde565b9091555050815481908390600090610fab908490611bde565b909155505060405133907fd4a841c3e635153f9bcd747beb0acf58cb9479dfe54b3fe7ed9acb5e191ce90a906107e79087908790611b71565b610fec611415565b6001600160a01b0381166110515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161053b565b61105a8161146f565b50565b6101015460ff1615610879574261010554106110e45760008061107e61121f565b91509150600061108d8361138f565b9050610108546000146110bb57610108546110a89082611b96565b610109546110b69190611aa8565b610109555b81610103819055508261010760008282546110d69190611aa8565b9091555061113e9350505050565b600061110061010754610106546110fb9190611bde565b61138f565b90506101085460001461112e576101085461111b9082611b96565b610109546111299190611aa8565b610109555b5060006101035561010654610107555b4261010455610109546040519081527f0a20771588202779c3c4cb1dedde6e8dcc8dbcb6739073bf52f4a7e8d49040269060200160405180910390a1565b6101015460ff16156108795733600081815260fc602052604081206101095490926111a6916113a3565b905080156111b8576111b833826114f0565b61010954600283015560018201546111d1908290611aa8565b60018301556101095460405133917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79161121391858252602082015260400190565b60405180910390a25050565b600080600062784ce0610102546101045461123a9190611bde565b6112449190611b96565b61124f906001611aa8565b905060006112608262784ce0611a89565b6101025461126e9190611aa8565b905042808211156112a257610104546112879082611bde565b610103546112959190611a89565b9450610103549350611388565b6101045460019084906112b59085611bde565b610103546112c39190611a89565b610103549097505b82156113835760646112de826050611a89565b6112e89190611b96565b905060006112f7836001611aa8565b6113049062784ce0611a89565b610102546113129190611aa8565b90508481116113395761132862784ce083611a89565b611332908a611aa8565b9850611370565b600061134862784ce083611bde565b90506113548187611bde565b61135e9084611a89565b611368908b611aa8565b995060009450505b8261137a81611ac0565b935050506112cb565b955050505b5050509091565b6000611399611618565b6104d79083611a89565b6001600160a01b038216600090815260fc602090815260408083208151606081018352815481526001820154938101939093526002015490820181905282906113ec9085611bde565b905060008183600001516114009190611a89565b905061140b8161162b565b9695505050505050565b6033546001600160a01b031633146108795760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161053b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166114e85760405162461bcd60e51b815260040161053b90611bf5565b61087961163f565b60fb546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155d9190611c40565b9050808211156115df5760fb5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490529091169063a9059cbb906044015b6020604051808303816000875af11580156115bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cd9190611c59565b60fb5460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb9060440161159c565b60006116266020600a611d5f565b905090565b6000611635611618565b6104d79083611b96565b600054610100900460ff166116665760405162461bcd60e51b815260040161053b90611bf5565b6108793361146f565b60006020828403121561168157600080fd5b81356001600160e01b03198116811461169957600080fd5b9392505050565b80356001600160a01b038116811461086457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116f6576116f66116b7565b604052919050565b600082601f83011261170f57600080fd5b8135602067ffffffffffffffff82111561172b5761172b6116b7565b8160051b61173a8282016116cd565b928352848101820192828101908785111561175457600080fd5b83870192505b848310156117735782358252918301919083019061175a565b979650505050505050565b60008060006060848603121561179357600080fd5b61179c846116a0565b9250602084013567ffffffffffffffff808211156117b957600080fd5b6117c5878388016116fe565b935060408601359150808211156117db57600080fd5b506117e8868287016116fe565b9150509250925092565b60006020828403121561180457600080fd5b611699826116a0565b6000806040838503121561182057600080fd5b611829836116a0565b946020939093013593505050565b600082601f83011261184857600080fd5b813567ffffffffffffffff811115611862576118626116b7565b611875601f8201601f19166020016116cd565b81815284602083860101111561188a57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156118bf57600080fd5b6118c8866116a0565b94506118d6602087016116a0565b9350604086013567ffffffffffffffff808211156118f357600080fd5b6118ff89838a016116fe565b9450606088013591508082111561191557600080fd5b61192189838a016116fe565b9350608088013591508082111561193757600080fd5b5061194488828901611837565b9150509295509295909350565b634e487b7160e01b600052602160045260246000fd5b602081016003831061198957634e487b7160e01b600052602160045260246000fd5b91905290565b6000806000606084860312156119a457600080fd5b6119ad846116a0565b9250602084013591506119c2604085016116a0565b90509250925092565b600080600080600060a086880312156119e357600080fd5b6119ec866116a0565b94506119fa602087016116a0565b93506040860135925060608601359150608086013567ffffffffffffffff811115611a2457600080fd5b61194488828901611837565b6020808252601390820152724c656e67746820617265206e6f742073616d6560681b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611aa357611aa3611a73565b500290565b60008219821115611abb57611abb611a73565b500190565b6000600019821415611ad457611ad4611a73565b5060010190565b600081518084526020808501945080840160005b83811015611b0b57815187529582019590820190600101611aef565b509495945050505050565b6001600160a01b0385811682528416602082015260a060408201819052600090611b4290830185611adb565b8281036060840152611b548185611adb565b838103608090940193909352505060008152602001949350505050565b604081526000611b846040830185611adb565b82810360208401526108578185611adb565b600082611bb357634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b600082821015611bf057611bf0611a73565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600060208284031215611c5257600080fd5b5051919050565b600060208284031215611c6b57600080fd5b8151801515811461169957600080fd5b600181815b80851115611cb6578160001904821115611c9c57611c9c611a73565b80851615611ca957918102915b93841c9390800290611c80565b509250929050565b600082611ccd575060016104d7565b81611cda575060006104d7565b8160018114611cf05760028114611cfa57611d16565b60019150506104d7565b60ff841115611d0b57611d0b611a73565b50506001821b6104d7565b5060208310610133831016604e8410600b8410161715611d39575081810a6104d7565b611d438383611c7b565b8060001904821115611d5757611d57611a73565b029392505050565b60006116998383611cbe56fea2646970667358221220cf7bcf906f0c423ce75f5b7e74e13d1a17390ed27061f8cb23fff251b1a99b7064736f6c634300080c0033
Deployed Bytecode Sourcemap
36453:9427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25750:256;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;25750:256:0;;;;;;;;37311:28;;;;;;;;;643:25:1;;;631:2;616:18;37311:28:0;497:177:1;38261:1153:0;;;;;;:::i;:::-;;:::i;:::-;;37382:22;;;;;;37486:32;;;;;;37525:16;;;;;;40818:485;;;;;;:::i;:::-;;:::i;39422:81::-;;;:::i;37196:43::-;;37232:7;37196:43;;45136:485;;;;;;:::i;:::-;;:::i;37246:27::-;;;;;;;;;18922:103;;;:::i;36633:26::-;;;;;-1:-1:-1;;;;;36633:26:0;;;;;;-1:-1:-1;;;;;3030:32:1;;;3012:51;;3000:2;2985:18;36633:26:0;2851:218:1;37411:26:0;;;;;;37280:24;;;;;;36893:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;18274:87;18347:6;;-1:-1:-1;;;;;18347:6:0;18274:87;;37346:29;;;;;;36795:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3743:25:1;;;3799:2;3784:18;;3777:34;;;;3827:18;;;3820:34;3731:2;3716:18;36795:41:0;3541:319:1;44894:234:0;;;;;;:::i;:::-;;:::i;27295:255::-;;;;;;:::i;:::-;-1:-1:-1;;;27295:255:0;;;;;;;;;;;-1:-1:-1;;;;;;5510:33:1;;;5492:52;;5480:2;5465:18;27295:255:0;5348:202:1;45629:246:0;;;:::i;36843:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;37885:296;;;;;;:::i;:::-;;:::i;37444:35::-;;;;;;39513:1224;;;;;;:::i;:::-;;:::i;37061:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;36964:90::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27060:227;;;;;;:::i;:::-;-1:-1:-1;;;27060:227:0;;;;;;;;19180:201;;;;;;:::i;:::-;;:::i;25750:256::-;25874:4;-1:-1:-1;;;;;;25898:60:0;;-1:-1:-1;;;25898:60:0;;:100;;-1:-1:-1;;;;;;;;;;24784:51:0;;;25962:36;25891:107;25750:256;-1:-1:-1;;25750:256:0:o;38261:1153::-;38448:21;-1:-1:-1;;;;;38420:24:0;;;;;;:13;:24;;;;;;;;:49;;;;;;;;:::i;:::-;;38412:64;;;;-1:-1:-1;;;38412:64:0;;7184:2:1;38412:64:0;;;7166:21:1;7223:1;7203:18;;;7196:29;-1:-1:-1;;;7241:18:1;;;7234:32;7283:18;;38412:64:0;;;;;;;;;38516:8;:15;38495:10;:17;:36;38487:68;;;;-1:-1:-1;;;38487:68:0;;;;;;;:::i;:::-;38614:14;:12;:14::i;:::-;38675:10;38641:25;38669:17;;;:5;:17;;;;;38701:26;;:31;38697:125;;38749:13;:11;:13::i;:::-;38697:125;;;38809:1;;38795:11;;;:15;38697:125;38834:16;;38861:219;38885:10;:17;38881:1;:21;38861:219;;;-1:-1:-1;;;;;38950:20:0;;;;;;:9;:20;;;;;38971:13;;38950:20;;;38971:10;;38982:1;;38971:13;;;;;;:::i;:::-;;;;;;;38950:35;;;;;;;;;;;;38936:8;38945:1;38936:11;;;;;;;;:::i;:::-;;;;;;;:49;;;;:::i;:::-;38924:61;;;;:::i;:::-;;;39057:8;39066:1;39057:11;;;;;;;;:::i;:::-;;;;;;;39000:15;:26;39016:9;-1:-1:-1;;;;;39000:26:0;-1:-1:-1;;;;;39000:26:0;;;;;;;;;;;;:41;39027:10;39038:1;39027:13;;;;;;;;:::i;:::-;;;;;;;39000:41;;;;;;;;;;;:53;39042:10;-1:-1:-1;;;;;39000:53:0;-1:-1:-1;;;;;39000:53:0;;;;;;;;;;;;;:68;;;;;;;:::i;:::-;;;;-1:-1:-1;38904:3:0;;-1:-1:-1;38904:3:0;;;:::i;:::-;;;;38861:219;;;-1:-1:-1;39100:13:0;39092:52;;;;-1:-1:-1;;;39092:52:0;;8572:2:1;39092:52:0;;;8554:21:1;8611:2;8591:18;;;8584:30;8650:28;8630:18;;;8623:56;8696:18;;39092:52:0;8370:350:1;39092:52:0;39157:94;;-1:-1:-1;;;39157:94:0;;-1:-1:-1;;;;;39157:41:0;;;;;:94;;39199:10;;39219:4;;39226:10;;39238:8;;39157:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39285:8;39264:17;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;39304:38:0;;39334:8;;39304;;:26;;:38;;39334:8;;39304:38;:::i;:::-;;;;-1:-1:-1;;39360:46:0;;39373:10;;39360:46;;;;39385:10;;39397:8;;39360:46;:::i;:::-;;;;;;;;38401:1013;;38261:1153;;;:::o;40818:485::-;40912:15;;40881:14;;40912:15;;40908:388;;;40957:1;;40944:10;40999:12;:10;:12::i;:::-;40973:38;;;41026:21;41050:22;:12;:20;:22::i;:::-;41026:46;;41091:17;;41112:1;41091:22;41087:107;;41160:17;;41144:33;;:13;:33;:::i;:::-;41139:1;;:39;;;;:::i;:::-;41134:44;;41087:107;41217:24;41232:4;41238:2;41217:14;:24::i;:::-;41208:33;40818:485;-1:-1:-1;;;;;40818:485:0:o;40908:388::-;-1:-1:-1;41283:1:0;40908:388;40818:485;;;:::o;39422:81::-;39457:14;:12;:14::i;:::-;39482:13;:11;:13::i;:::-;39422:81::o;45136:485::-;18160:13;:11;:13::i;:::-;-1:-1:-1;;;;;45267:23:0;::::1;45259:48;;;;-1:-1:-1::0;;;45259:48:0::1;;;;;;;:::i;:::-;45347:3;:10;45326;:17;:31;45318:63;;;;-1:-1:-1::0;;;45318:63:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45392:24:0;::::1;;::::0;;;:13:::1;:24;::::0;;;;:48;;-1:-1:-1;;45392:48:0::1;45419:21;45392:48;::::0;;45451:163:::1;45472:10;:17;45468:1;:21;45451:163;;;45519:3;45523:1;45519:6;;;;;;;;:::i;:::-;;;;;;;45529:1;45519:11;;45511:32;;;::::0;-1:-1:-1;;;45511:32:0;;11294:2:1;45511:32:0::1;::::0;::::1;11276:21:1::0;11333:1;11313:18;;;11306:29;-1:-1:-1;;;11351:18:1;;;11344:38;11399:18;;45511:32:0::1;11092:331:1::0;45511:32:0::1;45596:3;45600:1;45596:6;;;;;;;;:::i;:::-;;;;;;;45558:9;:20;45568:9;-1:-1:-1::0;;;;;45558:20:0::1;-1:-1:-1::0;;;;;45558:20:0::1;;;;;;;;;;;;:35;45579:10;45590:1;45579:13;;;;;;;;:::i;:::-;;;;;;;45558:35;;;;;;;;;;;:44;;;;45491:3;;;;;:::i;:::-;;;;45451:163;;;;45136:485:::0;;;:::o;18922:103::-;18160:13;:11;:13::i;:::-;18987:30:::1;19014:1;18987:18;:30::i;44894:234::-:0;18160:13;:11;:13::i;:::-;-1:-1:-1;;;;;44986:23:0;::::1;44978:48;;;;-1:-1:-1::0;;;44978:48:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45037:24:0;;;::::1;;::::0;;;:13:::1;:24;::::0;;;;;;;:47;;-1:-1:-1;;45037:47:0::1;45064:20;45037:47;::::0;;45095:8:::1;:19:::0;;;;;:25;44894:234::o;45629:246::-;18160:13;:11;:13::i;:::-;45722:15:::1;:22:::0;;-1:-1:-1;;45722:22:0::1;45740:4;45722:22;::::0;;45696:15:::1;45755:9;:23:::0;;;45789:14:::1;:28:::0;;;45853:13:::1;37232:7;45865:1;45853:13;:::i;:::-;45838:29;::::0;:11;:29:::1;:::i;:::-;45828:7;:39:::0;-1:-1:-1;45629:246:0:o;37885:296::-;11978:19;12001:13;;;;;;12000:14;;12048:34;;;;-1:-1:-1;12066:12:0;;12081:1;12066:12;;;;:16;12048:34;12047:108;;;-1:-1:-1;12127:4:0;1633:19;:23;;;12088:66;;-1:-1:-1;12137:12:0;;;;;:17;12088:66;12025:204;;;;-1:-1:-1;;;12025:204:0;;11630:2:1;12025:204:0;;;11612:21:1;11669:2;11649:18;;;11642:30;11708:34;11688:18;;;11681:62;-1:-1:-1;;;11759:18:1;;;11752:44;11813:19;;12025:204:0;11428:410:1;12025:204:0;12240:12;:16;;-1:-1:-1;;12240:16:0;12255:1;12240:16;;;12267:67;;;;12302:13;:20;;-1:-1:-1;;12302:20:0;;;;;12267:67;-1:-1:-1;;;;;37974:19:0;::::1;37966:44;;;;-1:-1:-1::0;;;37966:44:0::1;;;;;;;:::i;:::-;38021:16;:14;:16::i;:::-;38048:12;:28:::0;;-1:-1:-1;;;;;;38048:28:0::1;-1:-1:-1::0;;;;;38048:28:0;::::1;;::::0;;38103:19:::1;38087:13;:35:::0;38147:26:::1;38133:11;:40:::0;12356:102;;;;12407:5;12391:21;;-1:-1:-1;;12391:21:0;;;12432:14;;-1:-1:-1;11995:36:1;;12432:14:0;;11983:2:1;11968:18;12432:14:0;;;;;;;12356:102;11967:498;37885:296;:::o;39513:1224::-;39702:21;-1:-1:-1;;;;;39674:24:0;;;;;;:13;:24;;;;;;;;:49;;;;;;;;:::i;:::-;;39666:64;;;;-1:-1:-1;;;39666:64:0;;7184:2:1;39666:64:0;;;7166:21:1;7223:1;7203:18;;;7196:29;-1:-1:-1;;;7241:18:1;;;7234:32;7283:18;;39666:64:0;6982:325:1;39666:64:0;39770:8;:15;39749:10;:17;:36;39741:68;;;;-1:-1:-1;;;39741:68:0;;;;;;;:::i;:::-;39868:14;:12;:14::i;:::-;39929:10;39895:25;39923:17;;;:5;:17;;;;;39959:26;;39951:63;;;;-1:-1:-1;;;39951:63:0;;12244:2:1;39951:63:0;;;12226:21:1;12283:2;12263:18;;;12256:30;-1:-1:-1;;;12302:18:1;;;12295:49;12361:18;;39951:63:0;12042:343:1;39951:63:0;40025:13;:11;:13::i;:::-;40051:16;;40078:334;40102:10;:17;40098:1;:21;40078:334;;;-1:-1:-1;;;;;40164:26:0;;;;;;:15;:26;;;;;40191:13;;40164:26;;;40191:10;;40202:1;;40191:13;;;;;;:::i;:::-;;;;;;;40164:41;;;;;;;;;;;:53;40206:10;-1:-1:-1;;;;;40164:53:0;-1:-1:-1;;;;;40164:53:0;;;;;;;;;;;;;40149:8;40158:1;40149:11;;;;;;;;:::i;:::-;;;;;;;:68;;40141:100;;;;-1:-1:-1;;;40141:100:0;;12592:2:1;40141:100:0;;;12574:21:1;12631:2;12611:18;;;12604:30;-1:-1:-1;;;12650:18:1;;;12643:49;12709:18;;40141:100:0;12390:343:1;40141:100:0;-1:-1:-1;;;;;40282:20:0;;;;;;:9;:20;;;;;40303:13;;40282:20;;;40303:10;;40314:1;;40303:13;;;;;;:::i;:::-;;;;;;;40282:35;;;;;;;;;;;;40268:8;40277:1;40268:11;;;;;;;;:::i;:::-;;;;;;;:49;;;;:::i;:::-;40256:61;;;;:::i;:::-;;;40389:8;40398:1;40389:11;;;;;;;;:::i;:::-;;;;;;;40332:15;:26;40348:9;-1:-1:-1;;;;;40332:26:0;-1:-1:-1;;;;;40332:26:0;;;;;;;;;;;;:41;40359:10;40370:1;40359:13;;;;;;;;:::i;:::-;;;;;;;40332:41;;;;;;;;;;;:53;40374:10;-1:-1:-1;;;;;40332:53:0;-1:-1:-1;;;;;40332:53:0;;;;;;;;;;;;;:68;;;;;;;:::i;:::-;;;;-1:-1:-1;40121:3:0;;-1:-1:-1;40121:3:0;;;:::i;:::-;;;;40078:334;;;-1:-1:-1;40432:13:0;40424:41;;;;-1:-1:-1;;;40424:41:0;;13070:2:1;40424:41:0;;;13052:21:1;13109:2;13089:18;;;13082:30;-1:-1:-1;;;13128:18:1;;;13121:45;13183:18;;40424:41:0;12868:339:1;40424:41:0;40478:94;;-1:-1:-1;;;40478:94:0;;-1:-1:-1;;;;;40478:41:0;;;;;:94;;40528:4;;40535:10;;40547;;40559:8;;40478:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40606:8;40585:17;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;40625:38:0;;40655:8;;40625;;:26;;:38;;40655:8;;40625:38;:::i;:::-;;;;-1:-1:-1;;40681:48:0;;40696:10;;40681:48;;;;40708:10;;40720:8;;40681:48;:::i;19180:201::-;18160:13;:11;:13::i;:::-;-1:-1:-1;;;;;19269:22:0;::::1;19261:73;;;::::0;-1:-1:-1;;;19261:73:0;;13414:2:1;19261:73:0::1;::::0;::::1;13396:21:1::0;13453:2;13433:18;;;13426:30;13492:34;13472:18;;;13465:62;-1:-1:-1;;;13543:18:1;;;13536:36;13589:19;;19261:73:0::1;13212:402:1::0;19261:73:0::1;19345:28;19364:8;19345:18;:28::i;:::-;19180:201:::0;:::o;41383:934::-;41431:15;;;;41427:883;;;41478:15;41467:7;;:26;41463:752;;41515:20;41536:17;41557:12;:10;:12::i;:::-;41514:55;;;;41588:21;41612:22;:12;:20;:22::i;:::-;41588:46;;41657:17;;41678:1;41657:22;41653:114;;41729:17;;41713:33;;:13;:33;:::i;:::-;41708:1;;:39;;;;:::i;:::-;41704:1;:43;41653:114;41803:9;41787:13;:25;;;;41855:12;41831:20;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;41463:752:0;;-1:-1:-1;;;;41463:752:0;;41908:21;41932:46;41947:20;;41933:11;;:34;;;;:::i;:::-;41932:44;:46::i;:::-;41908:70;;42001:17;;42022:1;42001:22;41997:114;;42073:17;;42057:33;;:13;:33;:::i;:::-;42052:1;;:39;;;;:::i;:::-;42048:1;:43;41997:114;-1:-1:-1;42145:1:0;42129:13;:17;42188:11;;42165:20;:34;41463:752;42246:15;42229:14;:32;42296:1;;42283:15;;643:25:1;;;42283:15:0;;631:2:1;616:18;42283:15:0;;;;;;;41383:934::o;43655:508::-;43702:15;;;;43698:458;;;43768:10;43734:25;43762:17;;;:5;:17;;;;;43838:1;;43762:17;;43811:29;;:14;:29::i;:::-;43794:46;-1:-1:-1;43861:11:0;;43857:89;;43893:37;43911:10;43923:6;43893:17;:37::i;:::-;44010:1;;43996:11;;;:15;44057:28;;;;:37;;44088:6;;44057:37;:::i;:::-;44026:28;;;:68;44142:1;;44116:28;;44122:10;;44116:28;;;;44134:6;13793:25:1;;13849:2;13834:18;;13827:34;13781:2;13766:18;;13619:248;44116:28:0;;;;;;;;43719:437;;43655:508::o;42325:1322::-;42370:20;42392:21;42426:19;37232:7;42467:9;;42450:14;;:26;;;;:::i;:::-;42449:40;;;;:::i;:::-;42448:46;;42493:1;42448:46;:::i;:::-;42426:68;-1:-1:-1;42505:24:0;42545:23;42426:68;37232:7;42545:23;:::i;:::-;42532:9;;:37;;;;:::i;:::-;42505:64;-1:-1:-1;42603:15:0;42633:31;;;42629:1011;;;42728:14;;42713:29;;:12;:29;:::i;:::-;42696:13;;:47;;;;:::i;:::-;42681:62;;42774:13;;42758:29;;42629:1011;;;42946:14;;42838:4;;42869:11;;42927:33;;:16;:33;:::i;:::-;42910:13;;:51;;;;:::i;:::-;43004:13;;42895:66;;-1:-1:-1;43032:549:0;43039:10;43032:549;;;43117:3;43091:22;:17;43111:2;43091:22;:::i;:::-;43090:30;;;;:::i;:::-;43070:50;-1:-1:-1;43139:17:0;43185:5;:1;43189;43185:5;:::i;:::-;43172:19;;37232:7;43172:19;:::i;:::-;43159:9;;:33;;;;:::i;:::-;43139:53;;43228:12;43215:9;:25;43211:333;;43282:29;37232:7;43282:17;:29;:::i;:::-;43265:47;;;;:::i;:::-;;;43211:333;;;43361:14;43378:21;37232:7;43378:9;:21;:::i;:::-;43361:38;-1:-1:-1;43460:21:0;43361:38;43460:12;:21;:::i;:::-;43439:43;;:17;:43;:::i;:::-;43422:61;;;;:::i;:::-;;;43519:5;43506:18;;43338:206;43211:333;43562:3;;;;:::i;:::-;;;;43051:530;43032:549;;;43611:17;-1:-1:-1;;;42629:1011:0;42415:1232;;;42325:1322;;:::o;36151:105::-;36206:7;36239:9;:7;:9::i;:::-;36232:16;;:6;:16;:::i;44171:327::-;-1:-1:-1;;;;;44299:12:0;;44245:14;44299:12;;;:5;:12;;;;;;;;44272:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44245:14;;44349:16;;:2;:16;:::i;:::-;44322:43;;44376:21;44429:16;44400:8;:26;;;:45;;;;:::i;:::-;44376:69;;44465:25;:13;:23;:25::i;:::-;44456:34;44171:327;-1:-1:-1;;;;;;44171:327:0:o;18439:132::-;18347:6;;-1:-1:-1;;;;;18347:6:0;16386:10;18503:23;18495:68;;;;-1:-1:-1;;;18495:68:0;;14074:2:1;18495:68:0;;;14056:21:1;;;14093:18;;;14086:30;14152:34;14132:18;;;14125:62;14204:18;;18495:68:0;13872:356:1;19541:191:0;19634:6;;;-1:-1:-1;;;;;19651:17:0;;;-1:-1:-1;;;;;;19651:17:0;;;;;;;19684:40;;19634:6;;;19651:17;19634:6;;19684:40;;19615:16;;19684:40;19604:128;19541:191;:::o;17817:97::-;14121:13;;;;;;;14113:69;;;;-1:-1:-1;;;14113:69:0;;;;;;;:::i;:::-;17880:26:::1;:24;:26::i;44508:303::-:0;44603:12;;:37;;-1:-1:-1;;;44603:37:0;;44634:4;44603:37;;;3012:51:1;44585:15:0;;-1:-1:-1;;;;;44603:12:0;;:22;;2985:18:1;;44603:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44585:55;;44665:7;44655;:17;44651:153;;;44689:12;;:35;;-1:-1:-1;;;44689:35:0;;-1:-1:-1;;;;;15026:32:1;;;44689:35:0;;;15008:51:1;15075:18;;;15068:34;;;44689:12:0;;;;:21;;14981:18:1;;44689:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44651:153::-;44757:12;;:35;;-1:-1:-1;;;44757:35:0;;-1:-1:-1;;;;;15026:32:1;;;44757:35:0;;;15008:51:1;15075:18;;;15068:34;;;44757:12:0;;;;:21;;14981:18:1;;44757:35:0;14834:274:1;36056:87:0;36097:7;36123:12;36038:2;36123;:12;:::i;:::-;36116:19;;36056:87;:::o;36264:116::-;36321:14;36363:9;:7;:9::i;:::-;36356:16;;:6;:16;:::i;17922:113::-;14121:13;;;;;;;14113:69;;;;-1:-1:-1;;;14113:69:0;;;;;;;:::i;:::-;17995:32:::1;16386:10:::0;17995:18:::1;:32::i;14:286:1:-:0;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:1:o;679:173::-;747:20;;-1:-1:-1;;;;;796:31:1;;786:42;;776:70;;842:1;839;832:12;857:127;918:10;913:3;909:20;906:1;899:31;949:4;946:1;939:15;973:4;970:1;963:15;989:275;1060:2;1054:9;1125:2;1106:13;;-1:-1:-1;;1102:27:1;1090:40;;1160:18;1145:34;;1181:22;;;1142:62;1139:88;;;1207:18;;:::i;:::-;1243:2;1236:22;989:275;;-1:-1:-1;989:275:1:o;1269:712::-;1323:5;1376:3;1369:4;1361:6;1357:17;1353:27;1343:55;;1394:1;1391;1384:12;1343:55;1430:6;1417:20;1456:4;1479:18;1475:2;1472:26;1469:52;;;1501:18;;:::i;:::-;1547:2;1544:1;1540:10;1570:28;1594:2;1590;1586:11;1570:28;:::i;:::-;1632:15;;;1702;;;1698:24;;;1663:12;;;;1734:15;;;1731:35;;;1762:1;1759;1752:12;1731:35;1798:2;1790:6;1786:15;1775:26;;1810:142;1826:6;1821:3;1818:15;1810:142;;;1892:17;;1880:30;;1843:12;;;;1930;;;;1810:142;;;1970:5;1269:712;-1:-1:-1;;;;;;;1269:712:1:o;1986:669::-;2113:6;2121;2129;2182:2;2170:9;2161:7;2157:23;2153:32;2150:52;;;2198:1;2195;2188:12;2150:52;2221:29;2240:9;2221:29;:::i;:::-;2211:39;;2301:2;2290:9;2286:18;2273:32;2324:18;2365:2;2357:6;2354:14;2351:34;;;2381:1;2378;2371:12;2351:34;2404:61;2457:7;2448:6;2437:9;2433:22;2404:61;:::i;:::-;2394:71;;2518:2;2507:9;2503:18;2490:32;2474:48;;2547:2;2537:8;2534:16;2531:36;;;2563:1;2560;2553:12;2531:36;;2586:63;2641:7;2630:8;2619:9;2615:24;2586:63;:::i;:::-;2576:73;;;1986:669;;;;;:::o;2660:186::-;2719:6;2772:2;2760:9;2751:7;2747:23;2743:32;2740:52;;;2788:1;2785;2778:12;2740:52;2811:29;2830:9;2811:29;:::i;3074:254::-;3142:6;3150;3203:2;3191:9;3182:7;3178:23;3174:32;3171:52;;;3219:1;3216;3209:12;3171:52;3242:29;3261:9;3242:29;:::i;:::-;3232:39;3318:2;3303:18;;;;3290:32;;-1:-1:-1;;;3074:254:1:o;3865:530::-;3907:5;3960:3;3953:4;3945:6;3941:17;3937:27;3927:55;;3978:1;3975;3968:12;3927:55;4014:6;4001:20;4040:18;4036:2;4033:26;4030:52;;;4062:18;;:::i;:::-;4106:55;4149:2;4130:13;;-1:-1:-1;;4126:27:1;4155:4;4122:38;4106:55;:::i;:::-;4186:2;4177:7;4170:19;4232:3;4225:4;4220:2;4212:6;4208:15;4204:26;4201:35;4198:55;;;4249:1;4246;4239:12;4198:55;4314:2;4307:4;4299:6;4295:17;4288:4;4279:7;4275:18;4262:55;4362:1;4337:16;;;4355:4;4333:27;4326:38;;;;4341:7;3865:530;-1:-1:-1;;;3865:530:1:o;4400:943::-;4554:6;4562;4570;4578;4586;4639:3;4627:9;4618:7;4614:23;4610:33;4607:53;;;4656:1;4653;4646:12;4607:53;4679:29;4698:9;4679:29;:::i;:::-;4669:39;;4727:38;4761:2;4750:9;4746:18;4727:38;:::i;:::-;4717:48;;4816:2;4805:9;4801:18;4788:32;4839:18;4880:2;4872:6;4869:14;4866:34;;;4896:1;4893;4886:12;4866:34;4919:61;4972:7;4963:6;4952:9;4948:22;4919:61;:::i;:::-;4909:71;;5033:2;5022:9;5018:18;5005:32;4989:48;;5062:2;5052:8;5049:16;5046:36;;;5078:1;5075;5068:12;5046:36;5101:63;5156:7;5145:8;5134:9;5130:24;5101:63;:::i;:::-;5091:73;;5217:3;5206:9;5202:19;5189:33;5173:49;;5247:2;5237:8;5234:16;5231:36;;;5263:1;5260;5253:12;5231:36;;5286:51;5329:7;5318:8;5307:9;5303:24;5286:51;:::i;:::-;5276:61;;;4400:943;;;;;;;;:::o;5555:127::-;5616:10;5611:3;5607:20;5604:1;5597:31;5647:4;5644:1;5637:15;5671:4;5668:1;5661:15;5687:346;5837:2;5822:18;;5870:1;5859:13;;5849:144;;5915:10;5910:3;5906:20;5903:1;5896:31;5950:4;5947:1;5940:15;5978:4;5975:1;5968:15;5849:144;6002:25;;;5687:346;:::o;6038:328::-;6115:6;6123;6131;6184:2;6172:9;6163:7;6159:23;6155:32;6152:52;;;6200:1;6197;6190:12;6152:52;6223:29;6242:9;6223:29;:::i;:::-;6213:39;;6299:2;6288:9;6284:18;6271:32;6261:42;;6322:38;6356:2;6345:9;6341:18;6322:38;:::i;:::-;6312:48;;6038:328;;;;;:::o;6371:606::-;6475:6;6483;6491;6499;6507;6560:3;6548:9;6539:7;6535:23;6531:33;6528:53;;;6577:1;6574;6567:12;6528:53;6600:29;6619:9;6600:29;:::i;:::-;6590:39;;6648:38;6682:2;6671:9;6667:18;6648:38;:::i;:::-;6638:48;;6733:2;6722:9;6718:18;6705:32;6695:42;;6784:2;6773:9;6769:18;6756:32;6746:42;;6839:3;6828:9;6824:19;6811:33;6867:18;6859:6;6856:30;6853:50;;;6899:1;6896;6889:12;6853:50;6922:49;6963:7;6954:6;6943:9;6939:22;6922:49;:::i;7312:343::-;7514:2;7496:21;;;7553:2;7533:18;;;7526:30;-1:-1:-1;;;7587:2:1;7572:18;;7565:49;7646:2;7631:18;;7312:343::o;7660:127::-;7721:10;7716:3;7712:20;7709:1;7702:31;7752:4;7749:1;7742:15;7776:4;7773:1;7766:15;7792:127;7853:10;7848:3;7844:20;7841:1;7834:31;7884:4;7881:1;7874:15;7908:4;7905:1;7898:15;7924:168;7964:7;8030:1;8026;8022:6;8018:14;8015:1;8012:21;8007:1;8000:9;7993:17;7989:45;7986:71;;;8037:18;;:::i;:::-;-1:-1:-1;8077:9:1;;7924:168::o;8097:128::-;8137:3;8168:1;8164:6;8161:1;8158:13;8155:39;;;8174:18;;:::i;:::-;-1:-1:-1;8210:9:1;;8097:128::o;8230:135::-;8269:3;-1:-1:-1;;8290:17:1;;8287:43;;;8310:18;;:::i;:::-;-1:-1:-1;8357:1:1;8346:13;;8230:135::o;8725:435::-;8778:3;8816:5;8810:12;8843:6;8838:3;8831:19;8869:4;8898:2;8893:3;8889:12;8882:19;;8935:2;8928:5;8924:14;8956:1;8966:169;8980:6;8977:1;8974:13;8966:169;;;9041:13;;9029:26;;9075:12;;;;9110:15;;;;9002:1;8995:9;8966:169;;;-1:-1:-1;9151:3:1;;8725:435;-1:-1:-1;;;;;8725:435:1:o;9165:889::-;-1:-1:-1;;;;;9616:15:1;;;9598:34;;9668:15;;9663:2;9648:18;;9641:43;9578:3;9715:2;9700:18;;9693:31;;;9541:4;;9747:57;;9784:19;;9776:6;9747:57;:::i;:::-;9852:9;9844:6;9840:22;9835:2;9824:9;9820:18;9813:50;9886:44;9923:6;9915;9886:44;:::i;:::-;9967:22;;;9961:3;9946:19;;;9939:51;;;;-1:-1:-1;;10014:1:1;9999:17;;10045:2;10033:15;;9165:889;-1:-1:-1;;;;9165:889:1:o;10059:465::-;10316:2;10305:9;10298:21;10279:4;10342:56;10394:2;10383:9;10379:18;10371:6;10342:56;:::i;:::-;10446:9;10438:6;10434:22;10429:2;10418:9;10414:18;10407:50;10474:44;10511:6;10503;10474:44;:::i;10529:217::-;10569:1;10595;10585:132;;10639:10;10634:3;10630:20;10627:1;10620:31;10674:4;10671:1;10664:15;10702:4;10699:1;10692:15;10585:132;-1:-1:-1;10731:9:1;;10529:217::o;10751:336::-;10953:2;10935:21;;;10992:2;10972:18;;;10965:30;-1:-1:-1;;;11026:2:1;11011:18;;11004:42;11078:2;11063:18;;10751:336::o;12738:125::-;12778:4;12806:1;12803;12800:8;12797:34;;;12811:18;;:::i;:::-;-1:-1:-1;12848:9:1;;12738:125::o;14233:407::-;14435:2;14417:21;;;14474:2;14454:18;;;14447:30;14513:34;14508:2;14493:18;;14486:62;-1:-1:-1;;;14579:2:1;14564:18;;14557:41;14630:3;14615:19;;14233:407::o;14645:184::-;14715:6;14768:2;14756:9;14747:7;14743:23;14739:32;14736:52;;;14784:1;14781;14774:12;14736:52;-1:-1:-1;14807:16:1;;14645:184;-1:-1:-1;14645:184:1:o;15113:277::-;15180:6;15233:2;15221:9;15212:7;15208:23;15204:32;15201:52;;;15249:1;15246;15239:12;15201:52;15281:9;15275:16;15334:5;15327:13;15320:21;15313:5;15310:32;15300:60;;15356:1;15353;15346:12;15395:422;15484:1;15527:5;15484:1;15541:270;15562:7;15552:8;15549:21;15541:270;;;15621:4;15617:1;15613:6;15609:17;15603:4;15600:27;15597:53;;;15630:18;;:::i;:::-;15680:7;15670:8;15666:22;15663:55;;;15700:16;;;;15663:55;15779:22;;;;15739:15;;;;15541:270;;;15545:3;15395:422;;;;;:::o;15822:806::-;15871:5;15901:8;15891:80;;-1:-1:-1;15942:1:1;15956:5;;15891:80;15990:4;15980:76;;-1:-1:-1;16027:1:1;16041:5;;15980:76;16072:4;16090:1;16085:59;;;;16158:1;16153:130;;;;16065:218;;16085:59;16115:1;16106:10;;16129:5;;;16153:130;16190:3;16180:8;16177:17;16174:43;;;16197:18;;:::i;:::-;-1:-1:-1;;16253:1:1;16239:16;;16268:5;;16065:218;;16367:2;16357:8;16354:16;16348:3;16342:4;16339:13;16335:36;16329:2;16319:8;16316:16;16311:2;16305:4;16302:12;16298:35;16295:77;16292:159;;;-1:-1:-1;16404:19:1;;;16436:5;;16292:159;16483:34;16508:8;16502:4;16483:34;:::i;:::-;16553:6;16549:1;16545:6;16541:19;16532:7;16529:32;16526:58;;;16564:18;;:::i;:::-;16602:20;;15822:806;-1:-1:-1;;;15822:806:1:o;16633:131::-;16693:5;16722:36;16749:8;16743:4;16722:36;:::i
Swarm Source
ipfs://cf7bcf906f0c423ce75f5b7e74e13d1a17390ed27061f8cb23fff251b1a99b70
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.