Source Code
Overview
APE Balance
0 APE
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
ThriveProtocolNativeReward
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at curtis.apescan.io on 2024-10-30 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } // File: @openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v5.1.0) (access/extensions/IAccessControlEnumerable.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @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] * ```solidity * 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 Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 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 in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._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 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._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() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @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 { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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 { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/interfaces/draft-IERC1822.sol // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.20; /** * @dev ERC-1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File: @openzeppelin/contracts/proxy/beacon/IBeacon.sol // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.20; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {UpgradeableBeacon} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts/interfaces/IERC1967.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.20; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. */ interface IERC1967 { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // File: @openzeppelin/contracts/utils/Errors.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert Errors.FailedCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) 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 assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert Errors.FailedCall(); } } } // File: @openzeppelin/contracts/utils/StorageSlot.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.20; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC-1967 implementation slot: * ```solidity * contract ERC1967 { * // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * TIP: Consider using this library along with {SlotDerivation}. */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct Int256Slot { int256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `Int256Slot` with member `value` located at `slot`. */ function getInt256Slot(bytes32 slot) internal pure returns (Int256Slot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns a `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { assembly ("memory-safe") { r.slot := store.slot } } /** * @dev Returns a `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { assembly ("memory-safe") { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { assembly ("memory-safe") { r.slot := store.slot } } } // File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol // OpenZeppelin Contracts (last updated v5.1.0) (proxy/ERC1967/ERC1967Utils.sol) pragma solidity ^0.8.21; /** * @dev This library provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[ERC-1967] slots. */ library ERC1967Utils { /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev The `implementation` of the proxy is invalid. */ error ERC1967InvalidImplementation(address implementation); /** * @dev The `admin` of the proxy is invalid. */ error ERC1967InvalidAdmin(address admin); /** * @dev The `beacon` of the proxy is invalid. */ error ERC1967InvalidBeacon(address beacon); /** * @dev An upgrade function sees `msg.value > 0` that may be lost. */ error ERC1967NonPayable(); /** * @dev Returns the current implementation address. */ function getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the ERC-1967 implementation slot. */ function _setImplementation(address newImplementation) private { if (newImplementation.code.length == 0) { revert ERC1967InvalidImplementation(newImplementation); } StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Performs implementation upgrade with additional setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) internal { _setImplementation(newImplementation); emit IERC1967.Upgraded(newImplementation); if (data.length > 0) { Address.functionDelegateCall(newImplementation, data); } else { _checkNonPayable(); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by ERC-1967) using * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(ADMIN_SLOT).value; } /** * @dev Stores a new address in the ERC-1967 admin slot. */ function _setAdmin(address newAdmin) private { if (newAdmin == address(0)) { revert ERC1967InvalidAdmin(address(0)); } StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {IERC1967-AdminChanged} event. */ function changeAdmin(address newAdmin) internal { emit IERC1967.AdminChanged(getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(BEACON_SLOT).value; } /** * @dev Stores a new beacon in the ERC-1967 beacon slot. */ function _setBeacon(address newBeacon) private { if (newBeacon.code.length == 0) { revert ERC1967InvalidBeacon(newBeacon); } StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; address beaconImplementation = IBeacon(newBeacon).implementation(); if (beaconImplementation.code.length == 0) { revert ERC1967InvalidImplementation(beaconImplementation); } } /** * @dev Change the beacon and trigger a setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-BeaconUpgraded} event. * * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for * efficiency. */ function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { _setBeacon(newBeacon); emit IERC1967.BeaconUpgraded(newBeacon); if (data.length > 0) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } else { _checkNonPayable(); } } /** * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract * if an upgrade doesn't perform an initialization call. */ function _checkNonPayable() private { if (msg.value > 0) { revert ERC1967NonPayable(); } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v5.1.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.20; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. */ abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable __self = address(this); /** * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function * during an upgrade. */ string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; /** * @dev The call is from an unauthorized context. */ error UUPSUnauthorizedCallContext(); /** * @dev The storage `slot` is unsupported as a UUID. */ error UUPSUnsupportedProxiableUUID(bytes32 slot); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC-1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC-1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { _checkProxy(); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { _checkNotDelegated(); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual notDelegated returns (bytes32) { return ERC1967Utils.IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data); } /** * @dev Reverts if the execution is not performed via delegatecall or the execution * context is not of a proxy with an ERC-1967 compliant implementation pointing to self. * See {_onlyProxy}. */ function _checkProxy() internal view virtual { if ( address(this) == __self || // Must be called through delegatecall ERC1967Utils.getImplementation() != __self // Must be called through an active proxy ) { revert UUPSUnauthorizedCallContext(); } } /** * @dev Reverts if the execution is performed via delegatecall. * See {notDelegated}. */ function _checkNotDelegated() internal view virtual { if (address(this) != __self) { // Must not be called through delegatecall revert UUPSUnauthorizedCallContext(); } } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. * * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value * is expected to be the implementation slot in ERC-1967. * * Emits an {IERC1967-Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { revert UUPSUnsupportedProxiableUUID(slot); } ERC1967Utils.upgradeToAndCall(newImplementation, data); } catch { // The implementation is not UUPS revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); } } } // File: contracts/ThriveProtocolNativeReward.sol pragma solidity ^0.8.24; // Library for checking roles in an AccessControlEnumerable contract library AccessControlHelper { function checkRole( IAccessControlEnumerable accessControlEnumerable, bytes32 role, address user ) internal view { require( accessControlEnumerable.hasRole(role, user), "ThriveProtocol: must have admin role" ); } } /** * @title ThriveProtocolNativeReward * @notice Contract for managing rewards related to native token. * This contract allows admins to deposit tokens, give rewards, and users to withdraw their rewards. */ contract ThriveProtocolNativeReward is OwnableUpgradeable, UUPSUpgradeable { using AccessControlHelper for IAccessControlEnumerable; IAccessControlEnumerable public accessControlEnumerable; bytes32 public role; mapping(address => uint256) public balanceOf; /** * @dev Emitted when an admin rewards a user with tokens. */ event Reward(address indexed recipient, uint256 amount, string reason); /** * @dev Emitted when a user withdraws tokens from the contract. */ event Withdrawal(address indexed user, uint256 amount); /** * @dev Initializes the contract. * @param _accessControlEnumerable The address of the AccessControlEnumerable contract. * @param _role The access control role. */ function initialize(address _accessControlEnumerable, bytes32 _role) public initializer { __Ownable_init(_msgSender()); __UUPSUpgradeable_init(); accessControlEnumerable = IAccessControlEnumerable(_accessControlEnumerable); role = _role; } /** * @dev Overrides the authorization check for upgrading the contract implementation. * Only the owner of this contract can authorize upgrades. * @param newImplementation The address of the new implementation contract. */ function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} /** * @dev Modifier to only allow execution by admins. * If the caller is not an admin, reverts with a corresponding message. */ modifier onlyAdmin() { accessControlEnumerable.checkRole(role, msg.sender); _; } /** * @notice Deposit native tokens into the contract. * This function allows people to deposit native tokens into the contract. * The deposited tokens will be held in the contract's balance. */ function deposit() external payable { require(msg.value > 0, "Deposit amount must be greater than zero"); } /** * @notice Allows depositing native tokens without data. */ receive() external payable {} /** * @notice Allows depositing native tokens with arbitrary data. */ fallback() external payable {} /** * @notice Withdraw native tokens from the contract. * This function allows users to withdraw their rewards from the contract. * Users can only withdraw rewards that they have earned. * @param _amount The amount of tokens to withdraw. */ function withdraw(uint256 _amount) external { require(balanceOf[_msgSender()] >= _amount, "Insufficient balance"); require(address(this).balance >= _amount, "Insufficient contract balance"); balanceOf[_msgSender()] -= _amount; payable(_msgSender()).transfer(_amount); emit Withdrawal(_msgSender(), _amount); } /** * @dev Give a reward to a single recipient. * @param _recipient The address of the recipient. * @param _amount The amount of the reward. * @param _reason The reason for the reward. */ function reward( address _recipient, uint256 _amount, string calldata _reason ) external onlyAdmin { _reward(_recipient, _amount, _reason); } /** * @dev Give rewards to multiple recipients in bulk. * @param _recipients The addresses of the recipients. * @param _amounts The amounts of the rewards. * @param _reasons The reasons for the rewards. */ function rewardBulk( address[] calldata _recipients, uint256[] calldata _amounts, string[] calldata _reasons ) external onlyAdmin { require( _recipients.length == _amounts.length && _recipients.length == _reasons.length, "Array lengths mismatch" ); for (uint256 i = 0; i < _recipients.length; i++) { _reward(_recipients[i], _amounts[i], _reasons[i]); } } /** * @dev Internal function to give a reward to a single recipient. * @param _recipient The address of the recipient. * @param _amount The amount of the reward. * @param _reason The reason for the reward. */ function _reward( address _recipient, uint256 _amount, string calldata _reason ) internal { balanceOf[_recipient] += _amount; emit Reward(_recipient, _amount, _reason); } /** * @dev Sets the AccessControlEnumerable contract address. * Only the owner of this contract can call this function. * @param _accessControlEnumerable The address of the new AccessControlEnumerable contract. * @param _role The new access control role. */ function setAccessControlEnumerable( address _accessControlEnumerable, bytes32 _role ) external onlyOwner { accessControlEnumerable = IAccessControlEnumerable(_accessControlEnumerable); role = _role; } }
[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"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":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessControlEnumerable","outputs":[{"internalType":"contract IAccessControlEnumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_accessControlEnumerable","type":"address"},{"internalType":"bytes32","name":"_role","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_reason","type":"string"}],"name":"reward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"string[]","name":"_reasons","type":"string[]"}],"name":"rewardBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"role","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_accessControlEnumerable","type":"address"},{"internalType":"bytes32","name":"_role","type":"bytes32"}],"name":"setAccessControlEnumerable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152503480156041575f5ffd5b506080516120d76100685f395f8181610a9301528181610ae80152610ca201526120d75ff3fe6080604052600436106100eb575f3560e01c80637965b67611610089578063be13f47c11610058578063be13f47c146102a6578063d0e30db0146102ce578063f2fde38b146102d8578063f3d648e314610300576100ec565b80637965b676146102005780638da5cb5b1461022a578063a3adf30e14610254578063ad3cb1cc1461027c576100ec565b806352d1902d116100c557806352d1902d1461015c5780635c1027821461018657806370a08231146101ae578063715018a6146101ea576100ec565b806310055c1d146100ee5780632e1a7d4d146101185780634f1ef28614610140576100ec565b5b005b3480156100f9575f5ffd5b50610102610328565b60405161010f9190611472565b60405180910390f35b348015610123575f5ffd5b5061013e600480360381019061013991906114cf565b61032e565b005b61015a60048036038101906101559190611690565b6104f5565b005b348015610167575f5ffd5b50610170610514565b60405161017d9190611472565b60405180910390f35b348015610191575f5ffd5b506101ac60048036038101906101a79190611747565b610545565b005b3480156101b9575f5ffd5b506101d460048036038101906101cf91906117b8565b6105a4565b6040516101e191906117f2565b60405180910390f35b3480156101f5575f5ffd5b506101fe6105b9565b005b34801561020b575f5ffd5b506102146105cc565b6040516102219190611866565b60405180910390f35b348015610235575f5ffd5b5061023e6105f0565b60405161024b919061188e565b60405180910390f35b34801561025f575f5ffd5b5061027a600480360381019061027591906118d1565b610625565b005b348015610287575f5ffd5b50610290610677565b60405161029d919061196f565b60405180910390f35b3480156102b1575f5ffd5b506102cc60048036038101906102c791906118d1565b6106b0565b005b6102d6610887565b005b3480156102e3575f5ffd5b506102fe60048036038101906102f991906117b8565b6108cb565b005b34801561030b575f5ffd5b5061032660048036038101906103219190611a8e565b61094f565b005b60015481565b8060025f61033a610a8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156103b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ac90611b88565b60405180910390fd5b804710156103f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ef90611bf0565b60405180910390fd5b8060025f610404610a8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461044b9190611c3b565b9250508190555061045a610a8a565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561049c573d5f5f3e3d5ffd5b506104a5610a8a565b73ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040516104ea91906117f2565b60405180910390a250565b6104fd610a91565b61050682610b77565b6105108282610b82565b5050565b5f61051d610ca0565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b610592600154335f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d279092919063ffffffff16565b61059e84848484610de5565b50505050565b6002602052805f5260405f205f915090505481565b6105c1610e90565b6105ca5f610f17565b565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f6105fa610fe8565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b61062d610e90565b815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001819055505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f6106b961100f565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff161480156107015750825b90505f60018367ffffffffffffffff1614801561073457505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015610742575080155b15610779576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156107c6576001855f0160086101000a81548160ff0219169083151502179055505b6107d66107d1610a8a565b611036565b6107de61104a565b865f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600181905550831561087e575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516108759190611cba565b60405180910390a15b50505050505050565b5f34116108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090611d43565b60405180910390fd5b565b6108d3610e90565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610943575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161093a919061188e565b60405180910390fd5b61094c81610f17565b50565b61099c600154335f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d279092919063ffffffff16565b83839050868690501480156109b657508181905086869050145b6109f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ec90611dab565b60405180910390fd5b5f5f90505b86869050811015610a8157610a74878783818110610a1b57610a1a611dc9565b5b9050602002016020810190610a3091906117b8565b868684818110610a4357610a42611dc9565b5b90506020020135858585818110610a5d57610a5c611dc9565b5b9050602002810190610a6f9190611e02565b610de5565b80806001019150506109fa565b50505050505050565b5f33905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480610b3e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610b25611054565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610b7f610e90565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bea57506040513d601f19601f82011682018060405250810190610be79190611e78565b60015b610c2b57816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401610c22919061188e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114610c9157806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401610c889190611472565b60405180910390fd5b610c9b83836110a7565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610d25576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8273ffffffffffffffffffffffffffffffffffffffff166391d1485483836040518363ffffffff1660e01b8152600401610d62929190611ea3565b602060405180830381865afa158015610d7d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da19190611eff565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790611f9a565b60405180910390fd5b505050565b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610e319190611fb8565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167fa4c898e193f9b90ee1075eb2dc37474589a0bb45bb6307b47ba6d456b00010e8848484604051610e8293929190612017565b60405180910390a250505050565b610e98610a8a565b73ffffffffffffffffffffffffffffffffffffffff16610eb66105f0565b73ffffffffffffffffffffffffffffffffffffffff1614610f1557610ed9610a8a565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f0c919061188e565b60405180910390fd5b565b5f610f20610fe8565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61103e611119565b61104781611159565b50565b611052611119565b565b5f6110807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6111dd565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110b0826111e6565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561110c5761110682826112af565b50611115565b61111461132f565b5b5050565b61112161136b565b611157576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611161611119565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111d1575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111c8919061188e565b60405180910390fd5b6111da81610f17565b50565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361124157806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611238919061188e565b60405180910390fd5b8061126d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6111dd565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff16846040516112d8919061208b565b5f60405180830381855af49150503d805f8114611310576040519150601f19603f3d011682016040523d82523d5f602084013e611315565b606091505b5091509150611325858383611389565b9250505092915050565b5f341115611369576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f61137461100f565b5f0160089054906101000a900460ff16905090565b60608261139e5761139982611416565b61140e565b5f82511480156113c457505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561140657836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016113fd919061188e565b60405180910390fd5b81905061140f565b5b9392505050565b5f815111156114285780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f819050919050565b61146c8161145a565b82525050565b5f6020820190506114855f830184611463565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b6114ae8161149c565b81146114b8575f5ffd5b50565b5f813590506114c9816114a5565b92915050565b5f602082840312156114e4576114e3611494565b5b5f6114f1848285016114bb565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611523826114fa565b9050919050565b61153381611519565b811461153d575f5ffd5b50565b5f8135905061154e8161152a565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6115a28261155c565b810181811067ffffffffffffffff821117156115c1576115c061156c565b5b80604052505050565b5f6115d361148b565b90506115df8282611599565b919050565b5f67ffffffffffffffff8211156115fe576115fd61156c565b5b6116078261155c565b9050602081019050919050565b828183375f83830152505050565b5f61163461162f846115e4565b6115ca565b9050828152602081018484840111156116505761164f611558565b5b61165b848285611614565b509392505050565b5f82601f83011261167757611676611554565b5b8135611687848260208601611622565b91505092915050565b5f5f604083850312156116a6576116a5611494565b5b5f6116b385828601611540565b925050602083013567ffffffffffffffff8111156116d4576116d3611498565b5b6116e085828601611663565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f83601f84011261170757611706611554565b5b8235905067ffffffffffffffff811115611724576117236116ea565b5b6020830191508360018202830111156117405761173f6116ee565b5b9250929050565b5f5f5f5f6060858703121561175f5761175e611494565b5b5f61176c87828801611540565b945050602061177d878288016114bb565b935050604085013567ffffffffffffffff81111561179e5761179d611498565b5b6117aa878288016116f2565b925092505092959194509250565b5f602082840312156117cd576117cc611494565b5b5f6117da84828501611540565b91505092915050565b6117ec8161149c565b82525050565b5f6020820190506118055f8301846117e3565b92915050565b5f819050919050565b5f61182e611829611824846114fa565b61180b565b6114fa565b9050919050565b5f61183f82611814565b9050919050565b5f61185082611835565b9050919050565b61186081611846565b82525050565b5f6020820190506118795f830184611857565b92915050565b61188881611519565b82525050565b5f6020820190506118a15f83018461187f565b92915050565b6118b08161145a565b81146118ba575f5ffd5b50565b5f813590506118cb816118a7565b92915050565b5f5f604083850312156118e7576118e6611494565b5b5f6118f485828601611540565b9250506020611905858286016118bd565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6119418261190f565b61194b8185611919565b935061195b818560208601611929565b6119648161155c565b840191505092915050565b5f6020820190508181035f8301526119878184611937565b905092915050565b5f5f83601f8401126119a4576119a3611554565b5b8235905067ffffffffffffffff8111156119c1576119c06116ea565b5b6020830191508360208202830111156119dd576119dc6116ee565b5b9250929050565b5f5f83601f8401126119f9576119f8611554565b5b8235905067ffffffffffffffff811115611a1657611a156116ea565b5b602083019150836020820283011115611a3257611a316116ee565b5b9250929050565b5f5f83601f840112611a4e57611a4d611554565b5b8235905067ffffffffffffffff811115611a6b57611a6a6116ea565b5b602083019150836020820283011115611a8757611a866116ee565b5b9250929050565b5f5f5f5f5f5f60608789031215611aa857611aa7611494565b5b5f87013567ffffffffffffffff811115611ac557611ac4611498565b5b611ad189828a0161198f565b9650965050602087013567ffffffffffffffff811115611af457611af3611498565b5b611b0089828a016119e4565b9450945050604087013567ffffffffffffffff811115611b2357611b22611498565b5b611b2f89828a01611a39565b92509250509295509295509295565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f611b72601483611919565b9150611b7d82611b3e565b602082019050919050565b5f6020820190508181035f830152611b9f81611b66565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e63650000005f82015250565b5f611bda601d83611919565b9150611be582611ba6565b602082019050919050565b5f6020820190508181035f830152611c0781611bce565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c458261149c565b9150611c508361149c565b9250828203905081811115611c6857611c67611c0e565b5b92915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f611ca4611c9f611c9a84611c6e565b61180b565b611c77565b9050919050565b611cb481611c8a565b82525050565b5f602082019050611ccd5f830184611cab565b92915050565b7f4465706f73697420616d6f756e74206d757374206265206772656174657220745f8201527f68616e207a65726f000000000000000000000000000000000000000000000000602082015250565b5f611d2d602883611919565b9150611d3882611cd3565b604082019050919050565b5f6020820190508181035f830152611d5a81611d21565b9050919050565b7f4172726179206c656e67746873206d69736d61746368000000000000000000005f82015250565b5f611d95601683611919565b9150611da082611d61565b602082019050919050565b5f6020820190508181035f830152611dc281611d89565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112611e1e57611e1d611df6565b5b80840192508235915067ffffffffffffffff821115611e4057611e3f611dfa565b5b602083019250600182023603831315611e5c57611e5b611dfe565b5b509250929050565b5f81519050611e72816118a7565b92915050565b5f60208284031215611e8d57611e8c611494565b5b5f611e9a84828501611e64565b91505092915050565b5f604082019050611eb65f830185611463565b611ec3602083018461187f565b9392505050565b5f8115159050919050565b611ede81611eca565b8114611ee8575f5ffd5b50565b5f81519050611ef981611ed5565b92915050565b5f60208284031215611f1457611f13611494565b5b5f611f2184828501611eeb565b91505092915050565b7f54687269766550726f746f636f6c3a206d75737420686176652061646d696e205f8201527f726f6c6500000000000000000000000000000000000000000000000000000000602082015250565b5f611f84602483611919565b9150611f8f82611f2a565b604082019050919050565b5f6020820190508181035f830152611fb181611f78565b9050919050565b5f611fc28261149c565b9150611fcd8361149c565b9250828201905080821115611fe557611fe4611c0e565b5b92915050565b5f611ff68385611919565b9350612003838584611614565b61200c8361155c565b840190509392505050565b5f60408201905061202a5f8301866117e3565b818103602083015261203d818486611feb565b9050949350505050565b5f81519050919050565b5f81905092915050565b5f61206582612047565b61206f8185612051565b935061207f818560208601611929565b80840191505092915050565b5f612096828461205b565b91508190509291505056fea2646970667358221220782151c08c5df9d2c69b0f965dc5a8a12197cdecf441b8c71b3c455b7e5980e064736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106100eb575f3560e01c80637965b67611610089578063be13f47c11610058578063be13f47c146102a6578063d0e30db0146102ce578063f2fde38b146102d8578063f3d648e314610300576100ec565b80637965b676146102005780638da5cb5b1461022a578063a3adf30e14610254578063ad3cb1cc1461027c576100ec565b806352d1902d116100c557806352d1902d1461015c5780635c1027821461018657806370a08231146101ae578063715018a6146101ea576100ec565b806310055c1d146100ee5780632e1a7d4d146101185780634f1ef28614610140576100ec565b5b005b3480156100f9575f5ffd5b50610102610328565b60405161010f9190611472565b60405180910390f35b348015610123575f5ffd5b5061013e600480360381019061013991906114cf565b61032e565b005b61015a60048036038101906101559190611690565b6104f5565b005b348015610167575f5ffd5b50610170610514565b60405161017d9190611472565b60405180910390f35b348015610191575f5ffd5b506101ac60048036038101906101a79190611747565b610545565b005b3480156101b9575f5ffd5b506101d460048036038101906101cf91906117b8565b6105a4565b6040516101e191906117f2565b60405180910390f35b3480156101f5575f5ffd5b506101fe6105b9565b005b34801561020b575f5ffd5b506102146105cc565b6040516102219190611866565b60405180910390f35b348015610235575f5ffd5b5061023e6105f0565b60405161024b919061188e565b60405180910390f35b34801561025f575f5ffd5b5061027a600480360381019061027591906118d1565b610625565b005b348015610287575f5ffd5b50610290610677565b60405161029d919061196f565b60405180910390f35b3480156102b1575f5ffd5b506102cc60048036038101906102c791906118d1565b6106b0565b005b6102d6610887565b005b3480156102e3575f5ffd5b506102fe60048036038101906102f991906117b8565b6108cb565b005b34801561030b575f5ffd5b5061032660048036038101906103219190611a8e565b61094f565b005b60015481565b8060025f61033a610a8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410156103b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ac90611b88565b60405180910390fd5b804710156103f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ef90611bf0565b60405180910390fd5b8060025f610404610a8a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461044b9190611c3b565b9250508190555061045a610a8a565b73ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f1935050505015801561049c573d5f5f3e3d5ffd5b506104a5610a8a565b73ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040516104ea91906117f2565b60405180910390a250565b6104fd610a91565b61050682610b77565b6105108282610b82565b5050565b5f61051d610ca0565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b610592600154335f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d279092919063ffffffff16565b61059e84848484610de5565b50505050565b6002602052805f5260405f205f915090505481565b6105c1610e90565b6105ca5f610f17565b565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f6105fa610fe8565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b61062d610e90565b815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001819055505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f6106b961100f565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff161480156107015750825b90505f60018367ffffffffffffffff1614801561073457505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015610742575080155b15610779576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083156107c6576001855f0160086101000a81548160ff0219169083151502179055505b6107d66107d1610a8a565b611036565b6107de61104a565b865f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600181905550831561087e575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516108759190611cba565b60405180910390a15b50505050505050565b5f34116108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090611d43565b60405180910390fd5b565b6108d3610e90565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610943575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161093a919061188e565b60405180910390fd5b61094c81610f17565b50565b61099c600154335f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d279092919063ffffffff16565b83839050868690501480156109b657508181905086869050145b6109f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ec90611dab565b60405180910390fd5b5f5f90505b86869050811015610a8157610a74878783818110610a1b57610a1a611dc9565b5b9050602002016020810190610a3091906117b8565b868684818110610a4357610a42611dc9565b5b90506020020135858585818110610a5d57610a5c611dc9565b5b9050602002810190610a6f9190611e02565b610de5565b80806001019150506109fa565b50505050505050565b5f33905090565b7f0000000000000000000000002fde822da0b5f4ffe70eb9c4fb670178601b9e6d73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480610b3e57507f0000000000000000000000002fde822da0b5f4ffe70eb9c4fb670178601b9e6d73ffffffffffffffffffffffffffffffffffffffff16610b25611054565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b75576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b610b7f610e90565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610bea57506040513d601f19601f82011682018060405250810190610be79190611e78565b60015b610c2b57816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401610c22919061188e565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114610c9157806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401610c889190611472565b60405180910390fd5b610c9b83836110a7565b505050565b7f0000000000000000000000002fde822da0b5f4ffe70eb9c4fb670178601b9e6d73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610d25576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8273ffffffffffffffffffffffffffffffffffffffff166391d1485483836040518363ffffffff1660e01b8152600401610d62929190611ea3565b602060405180830381865afa158015610d7d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da19190611eff565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790611f9a565b60405180910390fd5b505050565b8260025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610e319190611fb8565b925050819055508373ffffffffffffffffffffffffffffffffffffffff167fa4c898e193f9b90ee1075eb2dc37474589a0bb45bb6307b47ba6d456b00010e8848484604051610e8293929190612017565b60405180910390a250505050565b610e98610a8a565b73ffffffffffffffffffffffffffffffffffffffff16610eb66105f0565b73ffffffffffffffffffffffffffffffffffffffff1614610f1557610ed9610a8a565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610f0c919061188e565b60405180910390fd5b565b5f610f20610fe8565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b61103e611119565b61104781611159565b50565b611052611119565b565b5f6110807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6111dd565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110b0826111e6565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561110c5761110682826112af565b50611115565b61111461132f565b5b5050565b61112161136b565b611157576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611161611119565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111d1575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111c8919061188e565b60405180910390fd5b6111da81610f17565b50565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361124157806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611238919061188e565b60405180910390fd5b8061126d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6111dd565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff16846040516112d8919061208b565b5f60405180830381855af49150503d805f8114611310576040519150601f19603f3d011682016040523d82523d5f602084013e611315565b606091505b5091509150611325858383611389565b9250505092915050565b5f341115611369576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f61137461100f565b5f0160089054906101000a900460ff16905090565b60608261139e5761139982611416565b61140e565b5f82511480156113c457505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561140657836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016113fd919061188e565b60405180910390fd5b81905061140f565b5b9392505050565b5f815111156114285780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f819050919050565b61146c8161145a565b82525050565b5f6020820190506114855f830184611463565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b6114ae8161149c565b81146114b8575f5ffd5b50565b5f813590506114c9816114a5565b92915050565b5f602082840312156114e4576114e3611494565b5b5f6114f1848285016114bb565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611523826114fa565b9050919050565b61153381611519565b811461153d575f5ffd5b50565b5f8135905061154e8161152a565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6115a28261155c565b810181811067ffffffffffffffff821117156115c1576115c061156c565b5b80604052505050565b5f6115d361148b565b90506115df8282611599565b919050565b5f67ffffffffffffffff8211156115fe576115fd61156c565b5b6116078261155c565b9050602081019050919050565b828183375f83830152505050565b5f61163461162f846115e4565b6115ca565b9050828152602081018484840111156116505761164f611558565b5b61165b848285611614565b509392505050565b5f82601f83011261167757611676611554565b5b8135611687848260208601611622565b91505092915050565b5f5f604083850312156116a6576116a5611494565b5b5f6116b385828601611540565b925050602083013567ffffffffffffffff8111156116d4576116d3611498565b5b6116e085828601611663565b9150509250929050565b5f5ffd5b5f5ffd5b5f5f83601f84011261170757611706611554565b5b8235905067ffffffffffffffff811115611724576117236116ea565b5b6020830191508360018202830111156117405761173f6116ee565b5b9250929050565b5f5f5f5f6060858703121561175f5761175e611494565b5b5f61176c87828801611540565b945050602061177d878288016114bb565b935050604085013567ffffffffffffffff81111561179e5761179d611498565b5b6117aa878288016116f2565b925092505092959194509250565b5f602082840312156117cd576117cc611494565b5b5f6117da84828501611540565b91505092915050565b6117ec8161149c565b82525050565b5f6020820190506118055f8301846117e3565b92915050565b5f819050919050565b5f61182e611829611824846114fa565b61180b565b6114fa565b9050919050565b5f61183f82611814565b9050919050565b5f61185082611835565b9050919050565b61186081611846565b82525050565b5f6020820190506118795f830184611857565b92915050565b61188881611519565b82525050565b5f6020820190506118a15f83018461187f565b92915050565b6118b08161145a565b81146118ba575f5ffd5b50565b5f813590506118cb816118a7565b92915050565b5f5f604083850312156118e7576118e6611494565b5b5f6118f485828601611540565b9250506020611905858286016118bd565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6119418261190f565b61194b8185611919565b935061195b818560208601611929565b6119648161155c565b840191505092915050565b5f6020820190508181035f8301526119878184611937565b905092915050565b5f5f83601f8401126119a4576119a3611554565b5b8235905067ffffffffffffffff8111156119c1576119c06116ea565b5b6020830191508360208202830111156119dd576119dc6116ee565b5b9250929050565b5f5f83601f8401126119f9576119f8611554565b5b8235905067ffffffffffffffff811115611a1657611a156116ea565b5b602083019150836020820283011115611a3257611a316116ee565b5b9250929050565b5f5f83601f840112611a4e57611a4d611554565b5b8235905067ffffffffffffffff811115611a6b57611a6a6116ea565b5b602083019150836020820283011115611a8757611a866116ee565b5b9250929050565b5f5f5f5f5f5f60608789031215611aa857611aa7611494565b5b5f87013567ffffffffffffffff811115611ac557611ac4611498565b5b611ad189828a0161198f565b9650965050602087013567ffffffffffffffff811115611af457611af3611498565b5b611b0089828a016119e4565b9450945050604087013567ffffffffffffffff811115611b2357611b22611498565b5b611b2f89828a01611a39565b92509250509295509295509295565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f611b72601483611919565b9150611b7d82611b3e565b602082019050919050565b5f6020820190508181035f830152611b9f81611b66565b9050919050565b7f496e73756666696369656e7420636f6e74726163742062616c616e63650000005f82015250565b5f611bda601d83611919565b9150611be582611ba6565b602082019050919050565b5f6020820190508181035f830152611c0781611bce565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611c458261149c565b9150611c508361149c565b9250828203905081811115611c6857611c67611c0e565b5b92915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f611ca4611c9f611c9a84611c6e565b61180b565b611c77565b9050919050565b611cb481611c8a565b82525050565b5f602082019050611ccd5f830184611cab565b92915050565b7f4465706f73697420616d6f756e74206d757374206265206772656174657220745f8201527f68616e207a65726f000000000000000000000000000000000000000000000000602082015250565b5f611d2d602883611919565b9150611d3882611cd3565b604082019050919050565b5f6020820190508181035f830152611d5a81611d21565b9050919050565b7f4172726179206c656e67746873206d69736d61746368000000000000000000005f82015250565b5f611d95601683611919565b9150611da082611d61565b602082019050919050565b5f6020820190508181035f830152611dc281611d89565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83356001602003843603038112611e1e57611e1d611df6565b5b80840192508235915067ffffffffffffffff821115611e4057611e3f611dfa565b5b602083019250600182023603831315611e5c57611e5b611dfe565b5b509250929050565b5f81519050611e72816118a7565b92915050565b5f60208284031215611e8d57611e8c611494565b5b5f611e9a84828501611e64565b91505092915050565b5f604082019050611eb65f830185611463565b611ec3602083018461187f565b9392505050565b5f8115159050919050565b611ede81611eca565b8114611ee8575f5ffd5b50565b5f81519050611ef981611ed5565b92915050565b5f60208284031215611f1457611f13611494565b5b5f611f2184828501611eeb565b91505092915050565b7f54687269766550726f746f636f6c3a206d75737420686176652061646d696e205f8201527f726f6c6500000000000000000000000000000000000000000000000000000000602082015250565b5f611f84602483611919565b9150611f8f82611f2a565b604082019050919050565b5f6020820190508181035f830152611fb181611f78565b9050919050565b5f611fc28261149c565b9150611fcd8361149c565b9250828201905080821115611fe557611fe4611c0e565b5b92915050565b5f611ff68385611919565b9350612003838584611614565b61200c8361155c565b840190509392505050565b5f60408201905061202a5f8301866117e3565b818103602083015261203d818486611feb565b9050949350505050565b5f81519050919050565b5f81905092915050565b5f61206582612047565b61206f8185612051565b935061207f818560208601611929565b80840191505092915050565b5f612096828461205b565b91508190509291505056fea2646970667358221220782151c08c5df9d2c69b0f965dc5a8a12197cdecf441b8c71b3c455b7e5980e064736f6c634300081c0033
Deployed Bytecode Sourcemap
46439:5134:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46646:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49053:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43227:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42760:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49643:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46672:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18379:103;;;;;;;;;;;;;:::i;:::-;;46584:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17644:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51323:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40825:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47231:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48406:121;;;:::i;:::-;;18637:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50079:466;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46646:19;;;;:::o;49053:359::-;49143:7;49116:9;:23;49126:12;:10;:12::i;:::-;49116:23;;;;;;;;;;;;;;;;:34;;49108:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49219:7;49194:21;:32;;49186:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49298:7;49271:9;:23;49281:12;:10;:12::i;:::-;49271:23;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;49324:12;:10;:12::i;:::-;49316:30;;:39;49347:7;49316:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49382:12;:10;:12::i;:::-;49371:33;;;49396:7;49371:33;;;;;;:::i;:::-;;;;;;;;49053:359;:::o;43227:217::-;41681:13;:11;:13::i;:::-;43343:36:::1;43361:17;43343;:36::i;:::-;43390:46;43412:17;43431:4;43390:21;:46::i;:::-;43227:217:::0;;:::o;42760:136::-;42829:7;41961:20;:18;:20::i;:::-;33564:66:::1;42856:32;;42849:39;;42760:136:::0;:::o;49643:187::-;48103:51;48137:4;;48143:10;48103:23;;;;;;;;;;;:33;;;;:51;;;;;:::i;:::-;49785:37:::1;49793:10;49805:7;49814;;49785;:37::i;:::-;49643:187:::0;;;;:::o;46672:44::-;;;;;;;;;;;;;;;;;:::o;18379:103::-;17530:13;:11;:13::i;:::-;18444:30:::1;18471:1;18444:18;:30::i;:::-;18379:103::o:0;46584:55::-;;;;;;;;;;;;;:::o;17644:147::-;17690:7;17710:24;17737:20;:18;:20::i;:::-;17710:47;;17775:1;:8;;;;;;;;;;;;17768:15;;;17644:147;:::o;51323:247::-;17530:13;:11;:13::i;:::-;51514:24:::1;51463:23;;:76;;;;;;;;;;;;;;;;;;51557:5;51550:4;:12;;;;51323:247:::0;;:::o;40825:58::-;;;;;;;;;;;;;;;;;;;:::o;47231:303::-;9126:30;9159:26;:24;:26::i;:::-;9126:59;;9250:19;9273:1;:15;;;;;;;;;;;;9272:16;9250:38;;9299:18;9320:1;:14;;;;;;;;;;;;9299:35;;9685:17;9720:1;9705:11;:16;;;:34;;;;;9725:14;9705:34;9685:54;;9750:17;9785:1;9770:11;:16;;;:50;;;;;9819:1;9798:4;9790:25;;;:30;9770:50;9750:70;;9838:12;9837:13;:30;;;;;9855:12;9854:13;9837:30;9833:93;;;9891:23;;;;;;;;;;;;;;9833:93;9953:1;9936;:14;;;:18;;;;;;;;;;;;;;;;;;9969:14;9965:69;;;10018:4;10000:1;:15;;;:22;;;;;;;;;;;;;;;;;;9965:69;47353:28:::1;47368:12;:10;:12::i;:::-;47353:14;:28::i;:::-;47392:24;:22;:24::i;:::-;47478;47427:23;;:76;;;;;;;;;;;;;;;;;;47521:5;47514:4;:12;;;;10060:14:::0;10056:104;;;10109:5;10091:1;:15;;;:23;;;;;;;;;;;;;;;;;;10134:14;10146:1;10134:14;;;;;;:::i;:::-;;;;;;;;10056:104;9058:1109;;;;;47231:303;;:::o;48406:121::-;48473:1;48461:9;:13;48453:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48406:121::o;18637:220::-;17530:13;:11;:13::i;:::-;18742:1:::1;18722:22;;:8;:22;;::::0;18718:93:::1;;18796:1;18768:31;;;;;;;;;;;:::i;:::-;;;;;;;;18718:93;18821:28;18840:8;18821:18;:28::i;:::-;18637:220:::0;:::o;50079:466::-;48103:51;48137:4;;48143:10;48103:23;;;;;;;;;;;:33;;;;:51;;;;;:::i;:::-;50296:8:::1;;:15;;50274:11;;:18;;:37;:78;;;;;50337:8;;:15;;50315:11;;:18;;:37;50274:78;50252:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;50418:9;50430:1;50418:13;;50413:125;50437:11;;:18;;50433:1;:22;50413:125;;;50477:49;50485:11;;50497:1;50485:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50501:8;;50510:1;50501:11;;;;;;;:::i;:::-;;;;;;;;50514:8;;50523:1;50514:11;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;50477:7;:49::i;:::-;50457:3;;;;;;;50413:125;;;;50079:466:::0;;;;;;:::o;14895:98::-;14948:7;14975:10;14968:17;;14895:98;:::o;43679:319::-;43770:6;43753:23;;43761:4;43753:23;;;:121;;;;43868:6;43832:42;;:32;:30;:32::i;:::-;:42;;;;43753:121;43735:256;;;43950:29;;;;;;;;;;;;;;43735:256;43679:319::o;47795:116::-;17530:13;:11;:13::i;:::-;47795:116;:::o;45173:548::-;45291:17;45273:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45269:445;;45684:17;45642:60;;;;;;;;;;;:::i;:::-;;;;;;;;45269:445;33564:66;45376:32;;45368:4;:40;45364:122;;45465:4;45436:34;;;;;;;;;;;:::i;:::-;;;;;;;;45364:122;45500:54;45530:17;45549:4;45500:29;:54::i;:::-;45326:240;45173:548;;:::o;44121:218::-;44205:6;44188:23;;44196:4;44188:23;;;44184:148;;44291:29;;;;;;;;;;;;;;44184:148;44121:218::o;45922:293::-;46100:23;:31;;;46132:4;46138;46100:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46078:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;45922:293;;;:::o;50797:225::-;50955:7;50930:9;:21;50940:10;50930:21;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;50985:10;50978:36;;;50997:7;51006;;50978:36;;;;;;;;:::i;:::-;;;;;;;;50797:225;;;;:::o;17869:166::-;17940:12;:10;:12::i;:::-;17929:23;;:7;:5;:7::i;:::-;:23;;;17925:103;;18003:12;:10;:12::i;:::-;17976:40;;;;;;;;;;;:::i;:::-;;;;;;;;17925:103;17869:166::o;19017:253::-;19091:24;19118:20;:18;:20::i;:::-;19091:47;;19149:16;19168:1;:8;;;;;;;;;;;;19149:27;;19198:8;19187:1;:8;;;:19;;;;;;;;;;;;;;;;;;19253:8;19222:40;;19243:8;19222:40;;;;;;;;;;;;19080:190;;19017:253;:::o;16352:163::-;16404:24;16475:22;16465:32;;16352:163;:::o;13822:174::-;13880:30;13957:21;13947:31;;13822:174;:::o;17028:129::-;11964:20;:18;:20::i;:::-;17111:38:::1;17136:12;17111:24;:38::i;:::-;17028:129:::0;:::o;42009:68::-;11964:20;:18;:20::i;:::-;42009:68::o;34219:140::-;34271:7;34298:47;33564:66;34325:19;;34298:26;:47::i;:::-;:53;;;;;;;;;;;;34291:60;;34219:140;:::o;35063:353::-;35155:37;35174:17;35155:18;:37::i;:::-;35226:17;35208:36;;;;;;;;;;;;35275:1;35261:4;:11;:15;35257:152;;;35293:53;35322:17;35341:4;35293:28;:53::i;:::-;;35257:152;;;35379:18;:16;:18::i;:::-;35257:152;35063:353;;:::o;12124:145::-;12192:17;:15;:17::i;:::-;12187:75;;12233:17;;;;;;;;;;;;;;12187:75;12124:145::o;17165:240::-;11964:20;:18;:20::i;:::-;17286:1:::1;17262:26;;:12;:26;;::::0;17258:97:::1;;17340:1;17312:31;;;;;;;;;;;:::i;:::-;;;;;;;;17258:97;17365:32;17384:12;17365:18;:32::i;:::-;17165:240:::0;:::o;30541:167::-;30602:21;30686:4;30676:14;;30541:167;;;:::o;34456:286::-;34567:1;34534:17;:29;;;:34;34530:121;;34621:17;34592:47;;;;;;;;;;;:::i;:::-;;;;;;;;34530:121;34717:17;34661:47;33564:66;34688:19;;34661:26;:47::i;:::-;:53;;;:73;;;;;;;;;;;;;;;;;;34456:286;:::o;26360:256::-;26443:12;26469;26483:23;26510:6;:19;;26530:4;26510:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26468:67;;;;26553:55;26580:6;26588:7;26597:10;26553:26;:55::i;:::-;26546:62;;;;26360:256;;;;:::o;39017:126::-;39080:1;39068:9;:13;39064:72;;;39105:19;;;;;;;;;;;;;;39064:72;39017:126::o;13564:122::-;13614:4;13638:26;:24;:26::i;:::-;:40;;;;;;;;;;;;13631:47;;13564:122;:::o;26891:597::-;27039:12;27069:7;27064:417;;27093:19;27101:10;27093:7;:19::i;:::-;27064:417;;;27342:1;27321:10;:17;:22;:49;;;;;27369:1;27347:6;:18;;;:23;27321:49;27317:121;;;27415:6;27398:24;;;;;;;;;;;:::i;:::-;;;;;;;;27317:121;27459:10;27452:17;;;;27064:417;26891:597;;;;;;:::o;28045:498::-;28198:1;28178:10;:17;:21;28174:362;;;28378:10;28372:17;28435:15;28422:10;28418:2;28414:19;28407:44;28174:362;28505:19;;;;;;;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:77;806:7;835:5;824:16;;769:77;;;:::o;852:122::-;925:24;943:5;925:24;:::i;:::-;918:5;915:35;905:63;;964:1;961;954:12;905:63;852:122;:::o;980:139::-;1026:5;1064:6;1051:20;1042:29;;1080:33;1107:5;1080:33;:::i;:::-;980:139;;;;:::o;1125:329::-;1184:6;1233:2;1221:9;1212:7;1208:23;1204:32;1201:119;;;1239:79;;:::i;:::-;1201:119;1359:1;1384:53;1429:7;1420:6;1409:9;1405:22;1384:53;:::i;:::-;1374:63;;1330:117;1125:329;;;;:::o;1460:126::-;1497:7;1537:42;1530:5;1526:54;1515:65;;1460:126;;;:::o;1592:96::-;1629:7;1658:24;1676:5;1658:24;:::i;:::-;1647:35;;1592:96;;;:::o;1694:122::-;1767:24;1785:5;1767:24;:::i;:::-;1760:5;1757:35;1747:63;;1806:1;1803;1796:12;1747:63;1694:122;:::o;1822:139::-;1868:5;1906:6;1893:20;1884:29;;1922:33;1949:5;1922:33;:::i;:::-;1822:139;;;;:::o;1967:117::-;2076:1;2073;2066:12;2090:117;2199:1;2196;2189:12;2213:102;2254:6;2305:2;2301:7;2296:2;2289:5;2285:14;2281:28;2271:38;;2213:102;;;:::o;2321:180::-;2369:77;2366:1;2359:88;2466:4;2463:1;2456:15;2490:4;2487:1;2480:15;2507:281;2590:27;2612:4;2590:27;:::i;:::-;2582:6;2578:40;2720:6;2708:10;2705:22;2684:18;2672:10;2669:34;2666:62;2663:88;;;2731:18;;:::i;:::-;2663:88;2771:10;2767:2;2760:22;2550:238;2507:281;;:::o;2794:129::-;2828:6;2855:20;;:::i;:::-;2845:30;;2884:33;2912:4;2904:6;2884:33;:::i;:::-;2794:129;;;:::o;2929:307::-;2990:4;3080:18;3072:6;3069:30;3066:56;;;3102:18;;:::i;:::-;3066:56;3140:29;3162:6;3140:29;:::i;:::-;3132:37;;3224:4;3218;3214:15;3206:23;;2929:307;;;:::o;3242:148::-;3340:6;3335:3;3330;3317:30;3381:1;3372:6;3367:3;3363:16;3356:27;3242:148;;;:::o;3396:423::-;3473:5;3498:65;3514:48;3555:6;3514:48;:::i;:::-;3498:65;:::i;:::-;3489:74;;3586:6;3579:5;3572:21;3624:4;3617:5;3613:16;3662:3;3653:6;3648:3;3644:16;3641:25;3638:112;;;3669:79;;:::i;:::-;3638:112;3759:54;3806:6;3801:3;3796;3759:54;:::i;:::-;3479:340;3396:423;;;;;:::o;3838:338::-;3893:5;3942:3;3935:4;3927:6;3923:17;3919:27;3909:122;;3950:79;;:::i;:::-;3909:122;4067:6;4054:20;4092:78;4166:3;4158:6;4151:4;4143:6;4139:17;4092:78;:::i;:::-;4083:87;;3899:277;3838:338;;;;:::o;4182:652::-;4259:6;4267;4316:2;4304:9;4295:7;4291:23;4287:32;4284:119;;;4322:79;;:::i;:::-;4284:119;4442:1;4467:53;4512:7;4503:6;4492:9;4488:22;4467:53;:::i;:::-;4457:63;;4413:117;4597:2;4586:9;4582:18;4569:32;4628:18;4620:6;4617:30;4614:117;;;4650:79;;:::i;:::-;4614:117;4755:62;4809:7;4800:6;4789:9;4785:22;4755:62;:::i;:::-;4745:72;;4540:287;4182:652;;;;;:::o;4840:117::-;4949:1;4946;4939:12;4963:117;5072:1;5069;5062:12;5100:553;5158:8;5168:6;5218:3;5211:4;5203:6;5199:17;5195:27;5185:122;;5226:79;;:::i;:::-;5185:122;5339:6;5326:20;5316:30;;5369:18;5361:6;5358:30;5355:117;;;5391:79;;:::i;:::-;5355:117;5505:4;5497:6;5493:17;5481:29;;5559:3;5551:4;5543:6;5539:17;5529:8;5525:32;5522:41;5519:128;;;5566:79;;:::i;:::-;5519:128;5100:553;;;;;:::o;5659:819::-;5748:6;5756;5764;5772;5821:2;5809:9;5800:7;5796:23;5792:32;5789:119;;;5827:79;;:::i;:::-;5789:119;5947:1;5972:53;6017:7;6008:6;5997:9;5993:22;5972:53;:::i;:::-;5962:63;;5918:117;6074:2;6100:53;6145:7;6136:6;6125:9;6121:22;6100:53;:::i;:::-;6090:63;;6045:118;6230:2;6219:9;6215:18;6202:32;6261:18;6253:6;6250:30;6247:117;;;6283:79;;:::i;:::-;6247:117;6396:65;6453:7;6444:6;6433:9;6429:22;6396:65;:::i;:::-;6378:83;;;;6173:298;5659:819;;;;;;;:::o;6484:329::-;6543:6;6592:2;6580:9;6571:7;6567:23;6563:32;6560:119;;;6598:79;;:::i;:::-;6560:119;6718:1;6743:53;6788:7;6779:6;6768:9;6764:22;6743:53;:::i;:::-;6733:63;;6689:117;6484:329;;;;:::o;6819:118::-;6906:24;6924:5;6906:24;:::i;:::-;6901:3;6894:37;6819:118;;:::o;6943:222::-;7036:4;7074:2;7063:9;7059:18;7051:26;;7087:71;7155:1;7144:9;7140:17;7131:6;7087:71;:::i;:::-;6943:222;;;;:::o;7171:60::-;7199:3;7220:5;7213:12;;7171:60;;;:::o;7237:142::-;7287:9;7320:53;7338:34;7347:24;7365:5;7347:24;:::i;:::-;7338:34;:::i;:::-;7320:53;:::i;:::-;7307:66;;7237:142;;;:::o;7385:126::-;7435:9;7468:37;7499:5;7468:37;:::i;:::-;7455:50;;7385:126;;;:::o;7517:158::-;7599:9;7632:37;7663:5;7632:37;:::i;:::-;7619:50;;7517:158;;;:::o;7681:195::-;7800:69;7863:5;7800:69;:::i;:::-;7795:3;7788:82;7681:195;;:::o;7882:286::-;8007:4;8045:2;8034:9;8030:18;8022:26;;8058:103;8158:1;8147:9;8143:17;8134:6;8058:103;:::i;:::-;7882:286;;;;:::o;8174:118::-;8261:24;8279:5;8261:24;:::i;:::-;8256:3;8249:37;8174:118;;:::o;8298:222::-;8391:4;8429:2;8418:9;8414:18;8406:26;;8442:71;8510:1;8499:9;8495:17;8486:6;8442:71;:::i;:::-;8298:222;;;;:::o;8526:122::-;8599:24;8617:5;8599:24;:::i;:::-;8592:5;8589:35;8579:63;;8638:1;8635;8628:12;8579:63;8526:122;:::o;8654:139::-;8700:5;8738:6;8725:20;8716:29;;8754:33;8781:5;8754:33;:::i;:::-;8654:139;;;;:::o;8799:474::-;8867:6;8875;8924:2;8912:9;8903:7;8899:23;8895:32;8892:119;;;8930:79;;:::i;:::-;8892:119;9050:1;9075:53;9120:7;9111:6;9100:9;9096:22;9075:53;:::i;:::-;9065:63;;9021:117;9177:2;9203:53;9248:7;9239:6;9228:9;9224:22;9203:53;:::i;:::-;9193:63;;9148:118;8799:474;;;;;:::o;9279:99::-;9331:6;9365:5;9359:12;9349:22;;9279:99;;;:::o;9384:169::-;9468:11;9502:6;9497:3;9490:19;9542:4;9537:3;9533:14;9518:29;;9384:169;;;;:::o;9559:139::-;9648:6;9643:3;9638;9632:23;9689:1;9680:6;9675:3;9671:16;9664:27;9559:139;;;:::o;9704:377::-;9792:3;9820:39;9853:5;9820:39;:::i;:::-;9875:71;9939:6;9934:3;9875:71;:::i;:::-;9868:78;;9955:65;10013:6;10008:3;10001:4;9994:5;9990:16;9955:65;:::i;:::-;10045:29;10067:6;10045:29;:::i;:::-;10040:3;10036:39;10029:46;;9796:285;9704:377;;;;:::o;10087:313::-;10200:4;10238:2;10227:9;10223:18;10215:26;;10287:9;10281:4;10277:20;10273:1;10262:9;10258:17;10251:47;10315:78;10388:4;10379:6;10315:78;:::i;:::-;10307:86;;10087:313;;;;:::o;10423:568::-;10496:8;10506:6;10556:3;10549:4;10541:6;10537:17;10533:27;10523:122;;10564:79;;:::i;:::-;10523:122;10677:6;10664:20;10654:30;;10707:18;10699:6;10696:30;10693:117;;;10729:79;;:::i;:::-;10693:117;10843:4;10835:6;10831:17;10819:29;;10897:3;10889:4;10881:6;10877:17;10867:8;10863:32;10860:41;10857:128;;;10904:79;;:::i;:::-;10857:128;10423:568;;;;;:::o;11014:::-;11087:8;11097:6;11147:3;11140:4;11132:6;11128:17;11124:27;11114:122;;11155:79;;:::i;:::-;11114:122;11268:6;11255:20;11245:30;;11298:18;11290:6;11287:30;11284:117;;;11320:79;;:::i;:::-;11284:117;11434:4;11426:6;11422:17;11410:29;;11488:3;11480:4;11472:6;11468:17;11458:8;11454:32;11451:41;11448:128;;;11495:79;;:::i;:::-;11448:128;11014:568;;;;;:::o;11604:580::-;11689:8;11699:6;11749:3;11742:4;11734:6;11730:17;11726:27;11716:122;;11757:79;;:::i;:::-;11716:122;11870:6;11857:20;11847:30;;11900:18;11892:6;11889:30;11886:117;;;11922:79;;:::i;:::-;11886:117;12036:4;12028:6;12024:17;12012:29;;12090:3;12082:4;12074:6;12070:17;12060:8;12056:32;12053:41;12050:128;;;12097:79;;:::i;:::-;12050:128;11604:580;;;;;:::o;12190:1333::-;12360:6;12368;12376;12384;12392;12400;12449:2;12437:9;12428:7;12424:23;12420:32;12417:119;;;12455:79;;:::i;:::-;12417:119;12603:1;12592:9;12588:17;12575:31;12633:18;12625:6;12622:30;12619:117;;;12655:79;;:::i;:::-;12619:117;12768:80;12840:7;12831:6;12820:9;12816:22;12768:80;:::i;:::-;12750:98;;;;12546:312;12925:2;12914:9;12910:18;12897:32;12956:18;12948:6;12945:30;12942:117;;;12978:79;;:::i;:::-;12942:117;13091:80;13163:7;13154:6;13143:9;13139:22;13091:80;:::i;:::-;13073:98;;;;12868:313;13248:2;13237:9;13233:18;13220:32;13279:18;13271:6;13268:30;13265:117;;;13301:79;;:::i;:::-;13265:117;13414:92;13498:7;13489:6;13478:9;13474:22;13414:92;:::i;:::-;13396:110;;;;13191:325;12190:1333;;;;;;;;:::o;13529:170::-;13669:22;13665:1;13657:6;13653:14;13646:46;13529:170;:::o;13705:366::-;13847:3;13868:67;13932:2;13927:3;13868:67;:::i;:::-;13861:74;;13944:93;14033:3;13944:93;:::i;:::-;14062:2;14057:3;14053:12;14046:19;;13705:366;;;:::o;14077:419::-;14243:4;14281:2;14270:9;14266:18;14258:26;;14330:9;14324:4;14320:20;14316:1;14305:9;14301:17;14294:47;14358:131;14484:4;14358:131;:::i;:::-;14350:139;;14077:419;;;:::o;14502:179::-;14642:31;14638:1;14630:6;14626:14;14619:55;14502:179;:::o;14687:366::-;14829:3;14850:67;14914:2;14909:3;14850:67;:::i;:::-;14843:74;;14926:93;15015:3;14926:93;:::i;:::-;15044:2;15039:3;15035:12;15028:19;;14687:366;;;:::o;15059:419::-;15225:4;15263:2;15252:9;15248:18;15240:26;;15312:9;15306:4;15302:20;15298:1;15287:9;15283:17;15276:47;15340:131;15466:4;15340:131;:::i;:::-;15332:139;;15059:419;;;:::o;15484:180::-;15532:77;15529:1;15522:88;15629:4;15626:1;15619:15;15653:4;15650:1;15643:15;15670:194;15710:4;15730:20;15748:1;15730:20;:::i;:::-;15725:25;;15764:20;15782:1;15764:20;:::i;:::-;15759:25;;15808:1;15805;15801:9;15793:17;;15832:1;15826:4;15823:11;15820:37;;;15837:18;;:::i;:::-;15820:37;15670:194;;;;:::o;15870:85::-;15915:7;15944:5;15933:16;;15870:85;;;:::o;15961:101::-;15997:7;16037:18;16030:5;16026:30;16015:41;;15961:101;;;:::o;16068:156::-;16125:9;16158:60;16175:42;16184:32;16210:5;16184:32;:::i;:::-;16175:42;:::i;:::-;16158:60;:::i;:::-;16145:73;;16068:156;;;:::o;16230:145::-;16324:44;16362:5;16324:44;:::i;:::-;16319:3;16312:57;16230:145;;:::o;16381:236::-;16481:4;16519:2;16508:9;16504:18;16496:26;;16532:78;16607:1;16596:9;16592:17;16583:6;16532:78;:::i;:::-;16381:236;;;;:::o;16623:227::-;16763:34;16759:1;16751:6;16747:14;16740:58;16832:10;16827:2;16819:6;16815:15;16808:35;16623:227;:::o;16856:366::-;16998:3;17019:67;17083:2;17078:3;17019:67;:::i;:::-;17012:74;;17095:93;17184:3;17095:93;:::i;:::-;17213:2;17208:3;17204:12;17197:19;;16856:366;;;:::o;17228:419::-;17394:4;17432:2;17421:9;17417:18;17409:26;;17481:9;17475:4;17471:20;17467:1;17456:9;17452:17;17445:47;17509:131;17635:4;17509:131;:::i;:::-;17501:139;;17228:419;;;:::o;17653:172::-;17793:24;17789:1;17781:6;17777:14;17770:48;17653:172;:::o;17831:366::-;17973:3;17994:67;18058:2;18053:3;17994:67;:::i;:::-;17987:74;;18070:93;18159:3;18070:93;:::i;:::-;18188:2;18183:3;18179:12;18172:19;;17831:366;;;:::o;18203:419::-;18369:4;18407:2;18396:9;18392:18;18384:26;;18456:9;18450:4;18446:20;18442:1;18431:9;18427:17;18420:47;18484:131;18610:4;18484:131;:::i;:::-;18476:139;;18203:419;;;:::o;18628:180::-;18676:77;18673:1;18666:88;18773:4;18770:1;18763:15;18797:4;18794:1;18787:15;18814:117;18923:1;18920;18913:12;18937:117;19046:1;19043;19036:12;19060:117;19169:1;19166;19159:12;19183:725;19261:4;19267:6;19323:11;19310:25;19423:1;19417:4;19413:12;19402:8;19386:14;19382:29;19378:48;19358:18;19354:73;19344:168;;19431:79;;:::i;:::-;19344:168;19543:18;19533:8;19529:33;19521:41;;19595:4;19582:18;19572:28;;19623:18;19615:6;19612:30;19609:117;;;19645:79;;:::i;:::-;19609:117;19753:2;19747:4;19743:13;19735:21;;19810:4;19802:6;19798:17;19782:14;19778:38;19772:4;19768:49;19765:136;;;19820:79;;:::i;:::-;19765:136;19274:634;19183:725;;;;;:::o;19914:143::-;19971:5;20002:6;19996:13;19987:22;;20018:33;20045:5;20018:33;:::i;:::-;19914:143;;;;:::o;20063:351::-;20133:6;20182:2;20170:9;20161:7;20157:23;20153:32;20150:119;;;20188:79;;:::i;:::-;20150:119;20308:1;20333:64;20389:7;20380:6;20369:9;20365:22;20333:64;:::i;:::-;20323:74;;20279:128;20063:351;;;;:::o;20420:332::-;20541:4;20579:2;20568:9;20564:18;20556:26;;20592:71;20660:1;20649:9;20645:17;20636:6;20592:71;:::i;:::-;20673:72;20741:2;20730:9;20726:18;20717:6;20673:72;:::i;:::-;20420:332;;;;;:::o;20758:90::-;20792:7;20835:5;20828:13;20821:21;20810:32;;20758:90;;;:::o;20854:116::-;20924:21;20939:5;20924:21;:::i;:::-;20917:5;20914:32;20904:60;;20960:1;20957;20950:12;20904:60;20854:116;:::o;20976:137::-;21030:5;21061:6;21055:13;21046:22;;21077:30;21101:5;21077:30;:::i;:::-;20976:137;;;;:::o;21119:345::-;21186:6;21235:2;21223:9;21214:7;21210:23;21206:32;21203:119;;;21241:79;;:::i;:::-;21203:119;21361:1;21386:61;21439:7;21430:6;21419:9;21415:22;21386:61;:::i;:::-;21376:71;;21332:125;21119:345;;;;:::o;21470:223::-;21610:34;21606:1;21598:6;21594:14;21587:58;21679:6;21674:2;21666:6;21662:15;21655:31;21470:223;:::o;21699:366::-;21841:3;21862:67;21926:2;21921:3;21862:67;:::i;:::-;21855:74;;21938:93;22027:3;21938:93;:::i;:::-;22056:2;22051:3;22047:12;22040:19;;21699:366;;;:::o;22071:419::-;22237:4;22275:2;22264:9;22260:18;22252:26;;22324:9;22318:4;22314:20;22310:1;22299:9;22295:17;22288:47;22352:131;22478:4;22352:131;:::i;:::-;22344:139;;22071:419;;;:::o;22496:191::-;22536:3;22555:20;22573:1;22555:20;:::i;:::-;22550:25;;22589:20;22607:1;22589:20;:::i;:::-;22584:25;;22632:1;22629;22625:9;22618:16;;22653:3;22650:1;22647:10;22644:36;;;22660:18;;:::i;:::-;22644:36;22496:191;;;;:::o;22717:317::-;22815:3;22836:71;22900:6;22895:3;22836:71;:::i;:::-;22829:78;;22917:56;22966:6;22961:3;22954:5;22917:56;:::i;:::-;22998:29;23020:6;22998:29;:::i;:::-;22993:3;22989:39;22982:46;;22717:317;;;;;:::o;23040:443::-;23191:4;23229:2;23218:9;23214:18;23206:26;;23242:71;23310:1;23299:9;23295:17;23286:6;23242:71;:::i;:::-;23360:9;23354:4;23350:20;23345:2;23334:9;23330:18;23323:48;23388:88;23471:4;23462:6;23454;23388:88;:::i;:::-;23380:96;;23040:443;;;;;;:::o;23489:98::-;23540:6;23574:5;23568:12;23558:22;;23489:98;;;:::o;23593:147::-;23694:11;23731:3;23716:18;;23593:147;;;;:::o;23746:386::-;23850:3;23878:38;23910:5;23878:38;:::i;:::-;23932:88;24013:6;24008:3;23932:88;:::i;:::-;23925:95;;24029:65;24087:6;24082:3;24075:4;24068:5;24064:16;24029:65;:::i;:::-;24119:6;24114:3;24110:16;24103:23;;23854:278;23746:386;;;;:::o;24138:271::-;24268:3;24290:93;24379:3;24370:6;24290:93;:::i;:::-;24283:100;;24400:3;24393:10;;24138:271;;;;:::o
Swarm Source
ipfs://782151c08c5df9d2c69b0f965dc5a8a12197cdecf441b8c71b3c455b7e5980e0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.