More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,763 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake Rewards | 21332708 | 11 days ago | IN | 0 ETH | 0.00104587 | ||||
Stake Rewards | 21268341 | 20 days ago | IN | 0 ETH | 0.00037404 | ||||
Claim Rewards | 21256643 | 21 days ago | IN | 0 ETH | 0.00073319 | ||||
Stake Rewards | 21255920 | 21 days ago | IN | 0 ETH | 0.0004312 | ||||
Withdraw | 21254146 | 22 days ago | IN | 0 ETH | 0.00136925 | ||||
Claim Rewards | 21244871 | 23 days ago | IN | 0 ETH | 0.00108945 | ||||
Withdraw | 21244868 | 23 days ago | IN | 0 ETH | 0.00144415 | ||||
Stake Rewards | 21207423 | 28 days ago | IN | 0 ETH | 0.00057074 | ||||
Stake Rewards | 21116902 | 41 days ago | IN | 0 ETH | 0.00039283 | ||||
Claim Rewards | 21059176 | 49 days ago | IN | 0 ETH | 0.00070146 | ||||
Deposit | 21011647 | 55 days ago | IN | 0 ETH | 0.00089892 | ||||
Claim Rewards | 20982881 | 60 days ago | IN | 0 ETH | 0.00096018 | ||||
Stake Rewards | 20781229 | 88 days ago | IN | 0 ETH | 0.00081993 | ||||
Stake Rewards | 20770954 | 89 days ago | IN | 0 ETH | 0.0006257 | ||||
Stake Rewards | 20597458 | 113 days ago | IN | 0 ETH | 0.00006853 | ||||
Claim Rewards | 20446946 | 134 days ago | IN | 0 ETH | 0.00020718 | ||||
Stake Rewards | 20439678 | 135 days ago | IN | 0 ETH | 0.00015582 | ||||
Withdraw | 20414510 | 139 days ago | IN | 0 ETH | 0.00037675 | ||||
Stake Rewards | 20370748 | 145 days ago | IN | 0 ETH | 0.00051283 | ||||
Stake Rewards | 20361167 | 146 days ago | IN | 0 ETH | 0.00027526 | ||||
Stake Rewards | 20303926 | 154 days ago | IN | 0 ETH | 0.00015813 | ||||
Stake Rewards | 20278407 | 158 days ago | IN | 0 ETH | 0.00034318 | ||||
Deposit | 20205206 | 168 days ago | IN | 0 ETH | 0.00053671 | ||||
Deposit | 20200822 | 169 days ago | IN | 0 ETH | 0.00052518 | ||||
Claim Rewards | 20184275 | 171 days ago | IN | 0 ETH | 0.00167741 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Deelance_Fluid_Staking
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-05 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // 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 { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.8.0-rc.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.4; contract Deelance_Fluid_Staking is Ownable, Initializable, ReentrancyGuard { IERC20 public s_rewardsToken; IERC20 public s_stakingToken; // Staker info struct Staker { // The deposited tokens of the Staker uint256 deposited; // Last time of details update for Deposit uint256 timeOfLastUpdate; // Calculated, but unclaimed rewards. These are calculated each time // a user writes to the contract. uint256 unclaimedRewards; } uint256 public rewardsPerHour = 171; // Minimum amount to stake uint256 public minStake = 800 * 10**18; uint256 public maxStake = 10000000000 * 10**18; uint256 public total_staked = 0; bool public isStakingActive = false; // Compounding frequency limit in seconds uint256 public compoundFreq = 14400; //4 hours // Mapping of address to Staker info mapping(address => Staker) internal stakers; event Staked(address indexed user, uint256 indexed amount); event WithdrewStake(address indexed user, uint256 indexed amount); event RewardsClaimed(address indexed user, uint256 indexed amount); // Constructor function constructor() { s_stakingToken = IERC20(0x7D60dE2E7D92Cb5C863bC82f8d59b37C59fC0A7A); s_rewardsToken = IERC20(0x7D60dE2E7D92Cb5C863bC82f8d59b37C59fC0A7A); } // If address has no Staker struct, initiate one. If address already was a stake, // calculate the rewards and add them to unclaimedRewards, reset the last time of // deposit and then add _amount to the already deposited amount. // stakes the amount staked. function deposit(uint256 _amount) external nonReentrant { require(isStakingActive != false, "Staking is not active"); require(_amount >= minStake, "Amount smaller than minimimum deposit"); require(_amount <= maxStake, "Amount is more than maximum deposit"); require( stakers[msg.sender].deposited <= maxStake, "Amount is more than maximum deposit"); require( IERC20(s_stakingToken).balanceOf(msg.sender) >= _amount, "Can't stake more than you own" ); if (stakers[msg.sender].deposited == 0) { stakers[msg.sender].deposited = _amount; stakers[msg.sender].timeOfLastUpdate = block.timestamp; } else { uint256 rewards = calculateRewards(msg.sender); stakers[msg.sender].unclaimedRewards += rewards; stakers[msg.sender].deposited += _amount; stakers[msg.sender].timeOfLastUpdate = block.timestamp; } emit Staked(msg.sender, _amount); s_stakingToken.transferFrom(msg.sender, address(this), _amount); total_staked = total_staked + _amount; } function setisStakingActive (bool value) external onlyOwner{ isStakingActive = value; } function setrewardPerhour (uint256 value) external onlyOwner{ rewardsPerHour = value; } function setcompoundFreq (uint256 value) external onlyOwner{ compoundFreq = value; } function setMinStakeamt (uint256 value) external onlyOwner{ minStake = value; } function setMaxStakeamt (uint256 value) external onlyOwner{ maxStake = value; } // Compound the rewards and reset the last time of update for Deposit info function stakeRewards() external nonReentrant { require(isStakingActive != false, "Staking is not active"); require(stakers[msg.sender].deposited > 0, "You have no deposit"); require( compoundRewardsTimer(msg.sender) == 0, "Tried to compound rewars too soon" ); uint256 rewards = calculateRewards(msg.sender) + stakers[msg.sender].unclaimedRewards; stakers[msg.sender].unclaimedRewards = 0; stakers[msg.sender].deposited += rewards; stakers[msg.sender].timeOfLastUpdate = block.timestamp; total_staked = total_staked + rewards; } // release rewards for msg.sender function claimRewards() external nonReentrant { uint256 rewards = calculateRewards(msg.sender) + stakers[msg.sender].unclaimedRewards; require(rewards > 0, "You have no rewards"); stakers[msg.sender].unclaimedRewards = 0; stakers[msg.sender].timeOfLastUpdate = block.timestamp; emit RewardsClaimed(msg.sender, rewards); s_rewardsToken.transfer(msg.sender, rewards); } // Withdraw specified amount of staked tokens function withdraw(uint256 _amount) external nonReentrant { require( stakers[msg.sender].deposited >= _amount, "Can't withdraw more than you have" ); uint256 _rewards = calculateRewards(msg.sender); stakers[msg.sender].deposited -= _amount; stakers[msg.sender].unclaimedRewards += _rewards; stakers[msg.sender].timeOfLastUpdate = block.timestamp; emit WithdrewStake(msg.sender, _amount); s_stakingToken.transfer(msg.sender, _amount); total_staked = total_staked - _amount; } // Function useful for fron-end that returns user stake and rewards by address function getDepositInfo(address _user) public view returns (uint256 _stake, uint256 _rewards) { _stake = stakers[_user].deposited; _rewards = calculateRewards(_user) + stakers[_user].unclaimedRewards; return (_stake, _rewards); } // Utility function that returns the timer for restaking rewards function compoundRewardsTimer(address _user) public view returns (uint256 _timer) { if (stakers[_user].timeOfLastUpdate + compoundFreq <= block.timestamp) { return 0; } else { return (stakers[_user].timeOfLastUpdate + compoundFreq) - block.timestamp; } } function recoverothertokens(address tokenAddress, uint256 tokenAmount) public onlyOwner { IERC20(tokenAddress).transfer(owner(), tokenAmount); } function recoveretoken(address payable destination) public onlyOwner { destination.transfer(address(this).balance); } // Calculate the rewards since the last update on Deposit info function calculateRewards(address _staker) internal view returns (uint256 rewards) { return (((((block.timestamp - stakers[_staker].timeOfLastUpdate) * stakers[_staker].deposited) * rewardsPerHour) / 3600) / 10000000); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrewStake","type":"event"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundFreq","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"compoundRewardsTimer","outputs":[{"internalType":"uint256","name":"_timer","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getDepositInfo","outputs":[{"internalType":"uint256","name":"_stake","type":"uint256"},{"internalType":"uint256","name":"_rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStakingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"destination","type":"address"}],"name":"recoveretoken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverothertokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsPerHour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxStakeamt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinStakeamt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcompoundFreq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setisStakingActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setrewardPerhour","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"total_staked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260ab600455682b5e3af16b188000006005556b204fce5e3e2502611000000060065560006007556000600860006101000a81548160ff0219169083151502179055506138406009553480156200005957600080fd5b506200007a6200006e6200013160201b60201c565b6200013960201b60201c565b60018081905550737d60de2e7d92cb5c863bc82f8d59b37c59fc0a7a600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737d60de2e7d92cb5c863bc82f8d59b37c59fc0a7a600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001fd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612622806200020d6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638e7271fa116100c3578063e6fce22a1161007c578063e6fce22a14610358578063e91eef2114610374578063ea1b28e014610390578063eab01768146103ae578063f121275f146103ca578063f2fde38b146103e657610158565b80638e7271fa146102bc578063adca9b72146102da578063af7568dd146102f8578063b6b55f2514610316578063c7d7d9dc14610332578063cf9d0b5f1461034e57610158565b8063372500ab11610115578063372500ab1461021d578063375b3c0a146102275780635287ce121461024557806361f6445714610276578063715018a6146102945780638da5cb5b1461029e57610158565b80630bd21c561461015d5780630d10c46f1461017b57806312e0a053146101975780631a121d54146101c75780632e1a7d4d146101e55780633651941114610201575b600080fd5b610165610402565b6040516101729190611bb7565b60405180910390f35b61019560048036038101906101909190611c0d565b610428565b005b6101b160048036038101906101ac9190611c78565b6104ae565b6040516101be9190611cb4565b60405180910390f35b6101cf610572565b6040516101dc9190611cb4565b60405180910390f35b6101ff60048036038101906101fa9190611c0d565b610578565b005b61021b60048036038101906102169190611c0d565b610854565b005b6102256108da565b005b61022f610b42565b60405161023c9190611cb4565b60405180910390f35b61025f600480360381019061025a9190611c78565b610b48565b60405161026d929190611ccf565b60405180910390f35b61027e610bed565b60405161028b9190611d13565b60405180910390f35b61029c610c00565b005b6102a6610c88565b6040516102b39190611d3d565b60405180910390f35b6102c4610cb1565b6040516102d19190611cb4565b60405180910390f35b6102e2610cb7565b6040516102ef9190611bb7565b60405180910390f35b610300610cdd565b60405161030d9190611cb4565b60405180910390f35b610330600480360381019061032b9190611c0d565b610ce3565b005b61034c60048036038101906103479190611d84565b61125f565b005b6103566112f8565b005b610372600480360381019061036d9190611c0d565b6115cb565b005b61038e60048036038101906103899190611c0d565b611651565b005b6103986116d7565b6040516103a59190611cb4565b60405180910390f35b6103c860048036038101906103c39190611def565b6116dd565b005b6103e460048036038101906103df9190611e1c565b6117a3565b005b61040060048036038101906103fb9190611c78565b6118a9565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104306119a0565b73ffffffffffffffffffffffffffffffffffffffff1661044e610c88565b73ffffffffffffffffffffffffffffffffffffffff16146104a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049b90611eb9565b60405180910390fd5b8060098190555050565b600042600954600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546105019190611f08565b1161050f576000905061056d565b42600954600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546105609190611f08565b61056a9190611f3c565b90505b919050565b60095481565b6002600154036105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490611fbc565b60405180910390fd5b600260018190555080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061204e565b60405180910390fd5b6000610655336119a8565b905081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546106a99190611f3c565b9250508190555080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546107029190611f08565b9250508190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550813373ffffffffffffffffffffffffffffffffffffffff167f4cb6da433ea55f6e302b7bdbfeed740816a42301cde7f5bac5dff2b34037637460405160405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016107f192919061206e565b6020604051808303816000875af1158015610810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083491906120ac565b50816007546108439190611f3c565b600781905550506001808190555050565b61085c6119a0565b73ffffffffffffffffffffffffffffffffffffffff1661087a610c88565b73ffffffffffffffffffffffffffffffffffffffff16146108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790611eb9565b60405180910390fd5b8060058190555050565b60026001540361091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690611fbc565b60405180910390fd5b60026001819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610975336119a8565b61097f9190611f08565b9050600081116109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90612125565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550803373ffffffffffffffffffffffffffffffffffffffff167ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe60405160405180910390a3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610af492919061206e565b6020604051808303816000875af1158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3791906120ac565b505060018081905550565b60055481565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549150600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610bdc846119a8565b610be69190611f08565b9050915091565b600860009054906101000a900460ff1681565b610c086119a0565b73ffffffffffffffffffffffffffffffffffffffff16610c26610c88565b73ffffffffffffffffffffffffffffffffffffffff1614610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390611eb9565b60405180910390fd5b610c866000611a74565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b600260015403610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90611fbc565b60405180910390fd5b600260018190555060001515600860009054906101000a900460ff16151503610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612191565b60405180910390fd5b600554811015610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290612223565b60405180910390fd5b600654811115610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906122b5565b60405180910390fd5b600654600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e906122b5565b60405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ef39190611d3d565b602060405180830381865afa158015610f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3491906122ea565b1015610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90612363565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154036110525780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061115a565b600061105d336119a8565b905080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546110b19190611f08565b9250508190555081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461110a9190611f08565b9250508190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b803373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d60405160405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016111fd93929190612383565b6020604051808303816000875af115801561121c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124091906120ac565b508060075461124f9190611f08565b6007819055506001808190555050565b6112676119a0565b73ffffffffffffffffffffffffffffffffffffffff16611285610c88565b73ffffffffffffffffffffffffffffffffffffffff16146112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d290611eb9565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b60026001540361133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490611fbc565b60405180910390fd5b600260018190555060001515600860009054906101000a900460ff1615150361139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290612191565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790612406565b60405180910390fd5b600061142b336104ae565b1461146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146290612498565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546114b9336119a8565b6114c39190611f08565b90506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461155f9190611f08565b9250508190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550806007546115bb9190611f08565b6007819055505060018081905550565b6115d36119a0565b73ffffffffffffffffffffffffffffffffffffffff166115f1610c88565b73ffffffffffffffffffffffffffffffffffffffff1614611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90611eb9565b60405180910390fd5b8060048190555050565b6116596119a0565b73ffffffffffffffffffffffffffffffffffffffff16611677610c88565b73ffffffffffffffffffffffffffffffffffffffff16146116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490611eb9565b60405180910390fd5b8060068190555050565b60065481565b6116e56119a0565b73ffffffffffffffffffffffffffffffffffffffff16611703610c88565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090611eb9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561179f573d6000803e3d6000fd5b5050565b6117ab6119a0565b73ffffffffffffffffffffffffffffffffffffffff166117c9610c88565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690611eb9565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611843610c88565b836040518363ffffffff1660e01b815260040161186192919061206e565b6020604051808303816000875af1158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a491906120ac565b505050565b6118b16119a0565b73ffffffffffffffffffffffffffffffffffffffff166118cf610c88565b73ffffffffffffffffffffffffffffffffffffffff1614611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90611eb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b9061252a565b60405180910390fd5b61199d81611a74565b50565b600033905090565b600062989680610e10600454600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015442611a459190611f3c565b611a4f919061254a565b611a59919061254a565b611a6391906125bb565b611a6d91906125bb565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000611b7d611b78611b7384611b38565b611b58565b611b38565b9050919050565b6000611b8f82611b62565b9050919050565b6000611ba182611b84565b9050919050565b611bb181611b96565b82525050565b6000602082019050611bcc6000830184611ba8565b92915050565b600080fd5b6000819050919050565b611bea81611bd7565b8114611bf557600080fd5b50565b600081359050611c0781611be1565b92915050565b600060208284031215611c2357611c22611bd2565b5b6000611c3184828501611bf8565b91505092915050565b6000611c4582611b38565b9050919050565b611c5581611c3a565b8114611c6057600080fd5b50565b600081359050611c7281611c4c565b92915050565b600060208284031215611c8e57611c8d611bd2565b5b6000611c9c84828501611c63565b91505092915050565b611cae81611bd7565b82525050565b6000602082019050611cc96000830184611ca5565b92915050565b6000604082019050611ce46000830185611ca5565b611cf16020830184611ca5565b9392505050565b60008115159050919050565b611d0d81611cf8565b82525050565b6000602082019050611d286000830184611d04565b92915050565b611d3781611c3a565b82525050565b6000602082019050611d526000830184611d2e565b92915050565b611d6181611cf8565b8114611d6c57600080fd5b50565b600081359050611d7e81611d58565b92915050565b600060208284031215611d9a57611d99611bd2565b5b6000611da884828501611d6f565b91505092915050565b6000611dbc82611b38565b9050919050565b611dcc81611db1565b8114611dd757600080fd5b50565b600081359050611de981611dc3565b92915050565b600060208284031215611e0557611e04611bd2565b5b6000611e1384828501611dda565b91505092915050565b60008060408385031215611e3357611e32611bd2565b5b6000611e4185828601611c63565b9250506020611e5285828601611bf8565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ea3602083611e5c565b9150611eae82611e6d565b602082019050919050565b60006020820190508181036000830152611ed281611e96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1382611bd7565b9150611f1e83611bd7565b9250828201905080821115611f3657611f35611ed9565b5b92915050565b6000611f4782611bd7565b9150611f5283611bd7565b9250828203905081811115611f6a57611f69611ed9565b5b92915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000611fa6601f83611e5c565b9150611fb182611f70565b602082019050919050565b60006020820190508181036000830152611fd581611f99565b9050919050565b7f43616e2774207769746864726177206d6f7265207468616e20796f752068617660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000612038602183611e5c565b915061204382611fdc565b604082019050919050565b600060208201905081810360008301526120678161202b565b9050919050565b60006040820190506120836000830185611d2e565b6120906020830184611ca5565b9392505050565b6000815190506120a681611d58565b92915050565b6000602082840312156120c2576120c1611bd2565b5b60006120d084828501612097565b91505092915050565b7f596f752068617665206e6f207265776172647300000000000000000000000000600082015250565b600061210f601383611e5c565b915061211a826120d9565b602082019050919050565b6000602082019050818103600083015261213e81612102565b9050919050565b7f5374616b696e67206973206e6f74206163746976650000000000000000000000600082015250565b600061217b601583611e5c565b915061218682612145565b602082019050919050565b600060208201905081810360008301526121aa8161216e565b9050919050565b7f416d6f756e7420736d616c6c6572207468616e206d696e696d696d756d20646560008201527f706f736974000000000000000000000000000000000000000000000000000000602082015250565b600061220d602583611e5c565b9150612218826121b1565b604082019050919050565b6000602082019050818103600083015261223c81612200565b9050919050565b7f416d6f756e74206973206d6f7265207468616e206d6178696d756d206465706f60008201527f7369740000000000000000000000000000000000000000000000000000000000602082015250565b600061229f602383611e5c565b91506122aa82612243565b604082019050919050565b600060208201905081810360008301526122ce81612292565b9050919050565b6000815190506122e481611be1565b92915050565b600060208284031215612300576122ff611bd2565b5b600061230e848285016122d5565b91505092915050565b7f43616e2774207374616b65206d6f7265207468616e20796f75206f776e000000600082015250565b600061234d601d83611e5c565b915061235882612317565b602082019050919050565b6000602082019050818103600083015261237c81612340565b9050919050565b60006060820190506123986000830186611d2e565b6123a56020830185611d2e565b6123b26040830184611ca5565b949350505050565b7f596f752068617665206e6f206465706f73697400000000000000000000000000600082015250565b60006123f0601383611e5c565b91506123fb826123ba565b602082019050919050565b6000602082019050818103600083015261241f816123e3565b9050919050565b7f547269656420746f20636f6d706f756e642072657761727320746f6f20736f6f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612482602183611e5c565b915061248d82612426565b604082019050919050565b600060208201905081810360008301526124b181612475565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612514602683611e5c565b915061251f826124b8565b604082019050919050565b6000602082019050818103600083015261254381612507565b9050919050565b600061255582611bd7565b915061256083611bd7565b925082820261256e81611bd7565b9150828204841483151761258557612584611ed9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125c682611bd7565b91506125d183611bd7565b9250826125e1576125e061258c565b5b82820490509291505056fea2646970667358221220592aee4f721b23017d0bc85ba8a3ea92302427db85a026d4d3662b09b71bb1b864736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638e7271fa116100c3578063e6fce22a1161007c578063e6fce22a14610358578063e91eef2114610374578063ea1b28e014610390578063eab01768146103ae578063f121275f146103ca578063f2fde38b146103e657610158565b80638e7271fa146102bc578063adca9b72146102da578063af7568dd146102f8578063b6b55f2514610316578063c7d7d9dc14610332578063cf9d0b5f1461034e57610158565b8063372500ab11610115578063372500ab1461021d578063375b3c0a146102275780635287ce121461024557806361f6445714610276578063715018a6146102945780638da5cb5b1461029e57610158565b80630bd21c561461015d5780630d10c46f1461017b57806312e0a053146101975780631a121d54146101c75780632e1a7d4d146101e55780633651941114610201575b600080fd5b610165610402565b6040516101729190611bb7565b60405180910390f35b61019560048036038101906101909190611c0d565b610428565b005b6101b160048036038101906101ac9190611c78565b6104ae565b6040516101be9190611cb4565b60405180910390f35b6101cf610572565b6040516101dc9190611cb4565b60405180910390f35b6101ff60048036038101906101fa9190611c0d565b610578565b005b61021b60048036038101906102169190611c0d565b610854565b005b6102256108da565b005b61022f610b42565b60405161023c9190611cb4565b60405180910390f35b61025f600480360381019061025a9190611c78565b610b48565b60405161026d929190611ccf565b60405180910390f35b61027e610bed565b60405161028b9190611d13565b60405180910390f35b61029c610c00565b005b6102a6610c88565b6040516102b39190611d3d565b60405180910390f35b6102c4610cb1565b6040516102d19190611cb4565b60405180910390f35b6102e2610cb7565b6040516102ef9190611bb7565b60405180910390f35b610300610cdd565b60405161030d9190611cb4565b60405180910390f35b610330600480360381019061032b9190611c0d565b610ce3565b005b61034c60048036038101906103479190611d84565b61125f565b005b6103566112f8565b005b610372600480360381019061036d9190611c0d565b6115cb565b005b61038e60048036038101906103899190611c0d565b611651565b005b6103986116d7565b6040516103a59190611cb4565b60405180910390f35b6103c860048036038101906103c39190611def565b6116dd565b005b6103e460048036038101906103df9190611e1c565b6117a3565b005b61040060048036038101906103fb9190611c78565b6118a9565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6104306119a0565b73ffffffffffffffffffffffffffffffffffffffff1661044e610c88565b73ffffffffffffffffffffffffffffffffffffffff16146104a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049b90611eb9565b60405180910390fd5b8060098190555050565b600042600954600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546105019190611f08565b1161050f576000905061056d565b42600954600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546105609190611f08565b61056a9190611f3c565b90505b919050565b60095481565b6002600154036105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490611fbc565b60405180910390fd5b600260018190555080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061204e565b60405180910390fd5b6000610655336119a8565b905081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546106a99190611f3c565b9250508190555080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546107029190611f08565b9250508190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550813373ffffffffffffffffffffffffffffffffffffffff167f4cb6da433ea55f6e302b7bdbfeed740816a42301cde7f5bac5dff2b34037637460405160405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016107f192919061206e565b6020604051808303816000875af1158015610810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083491906120ac565b50816007546108439190611f3c565b600781905550506001808190555050565b61085c6119a0565b73ffffffffffffffffffffffffffffffffffffffff1661087a610c88565b73ffffffffffffffffffffffffffffffffffffffff16146108d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c790611eb9565b60405180910390fd5b8060058190555050565b60026001540361091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091690611fbc565b60405180910390fd5b60026001819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610975336119a8565b61097f9190611f08565b9050600081116109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb90612125565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550803373ffffffffffffffffffffffffffffffffffffffff167ffc30cddea38e2bf4d6ea7d3f9ed3b6ad7f176419f4963bd81318067a4aee73fe60405160405180910390a3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610af492919061206e565b6020604051808303816000875af1158015610b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3791906120ac565b505060018081905550565b60055481565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549150600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610bdc846119a8565b610be69190611f08565b9050915091565b600860009054906101000a900460ff1681565b610c086119a0565b73ffffffffffffffffffffffffffffffffffffffff16610c26610c88565b73ffffffffffffffffffffffffffffffffffffffff1614610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7390611eb9565b60405180910390fd5b610c866000611a74565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b600260015403610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90611fbc565b60405180910390fd5b600260018190555060001515600860009054906101000a900460ff16151503610d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7d90612191565b60405180910390fd5b600554811015610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290612223565b60405180910390fd5b600654811115610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906122b5565b60405180910390fd5b600654600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e906122b5565b60405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ef39190611d3d565b602060405180830381865afa158015610f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3491906122ea565b1015610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90612363565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154036110525780600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061115a565b600061105d336119a8565b905080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008282546110b19190611f08565b9250508190555081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461110a9190611f08565b9250508190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b803373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d60405160405180910390a3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016111fd93929190612383565b6020604051808303816000875af115801561121c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124091906120ac565b508060075461124f9190611f08565b6007819055506001808190555050565b6112676119a0565b73ffffffffffffffffffffffffffffffffffffffff16611285610c88565b73ffffffffffffffffffffffffffffffffffffffff16146112db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d290611eb9565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b60026001540361133d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133490611fbc565b60405180910390fd5b600260018190555060001515600860009054906101000a900460ff1615150361139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290612191565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141790612406565b60405180910390fd5b600061142b336104ae565b1461146b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146290612498565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546114b9336119a8565b6114c39190611f08565b90506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461155f9190611f08565b9250508190555042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550806007546115bb9190611f08565b6007819055505060018081905550565b6115d36119a0565b73ffffffffffffffffffffffffffffffffffffffff166115f1610c88565b73ffffffffffffffffffffffffffffffffffffffff1614611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90611eb9565b60405180910390fd5b8060048190555050565b6116596119a0565b73ffffffffffffffffffffffffffffffffffffffff16611677610c88565b73ffffffffffffffffffffffffffffffffffffffff16146116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490611eb9565b60405180910390fd5b8060068190555050565b60065481565b6116e56119a0565b73ffffffffffffffffffffffffffffffffffffffff16611703610c88565b73ffffffffffffffffffffffffffffffffffffffff1614611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090611eb9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561179f573d6000803e3d6000fd5b5050565b6117ab6119a0565b73ffffffffffffffffffffffffffffffffffffffff166117c9610c88565b73ffffffffffffffffffffffffffffffffffffffff161461181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690611eb9565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611843610c88565b836040518363ffffffff1660e01b815260040161186192919061206e565b6020604051808303816000875af1158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a491906120ac565b505050565b6118b16119a0565b73ffffffffffffffffffffffffffffffffffffffff166118cf610c88565b73ffffffffffffffffffffffffffffffffffffffff1614611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90611eb9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198b9061252a565b60405180910390fd5b61199d81611a74565b50565b600033905090565b600062989680610e10600454600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015442611a459190611f3c565b611a4f919061254a565b611a59919061254a565b611a6391906125bb565b611a6d91906125bb565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000611b7d611b78611b7384611b38565b611b58565b611b38565b9050919050565b6000611b8f82611b62565b9050919050565b6000611ba182611b84565b9050919050565b611bb181611b96565b82525050565b6000602082019050611bcc6000830184611ba8565b92915050565b600080fd5b6000819050919050565b611bea81611bd7565b8114611bf557600080fd5b50565b600081359050611c0781611be1565b92915050565b600060208284031215611c2357611c22611bd2565b5b6000611c3184828501611bf8565b91505092915050565b6000611c4582611b38565b9050919050565b611c5581611c3a565b8114611c6057600080fd5b50565b600081359050611c7281611c4c565b92915050565b600060208284031215611c8e57611c8d611bd2565b5b6000611c9c84828501611c63565b91505092915050565b611cae81611bd7565b82525050565b6000602082019050611cc96000830184611ca5565b92915050565b6000604082019050611ce46000830185611ca5565b611cf16020830184611ca5565b9392505050565b60008115159050919050565b611d0d81611cf8565b82525050565b6000602082019050611d286000830184611d04565b92915050565b611d3781611c3a565b82525050565b6000602082019050611d526000830184611d2e565b92915050565b611d6181611cf8565b8114611d6c57600080fd5b50565b600081359050611d7e81611d58565b92915050565b600060208284031215611d9a57611d99611bd2565b5b6000611da884828501611d6f565b91505092915050565b6000611dbc82611b38565b9050919050565b611dcc81611db1565b8114611dd757600080fd5b50565b600081359050611de981611dc3565b92915050565b600060208284031215611e0557611e04611bd2565b5b6000611e1384828501611dda565b91505092915050565b60008060408385031215611e3357611e32611bd2565b5b6000611e4185828601611c63565b9250506020611e5285828601611bf8565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ea3602083611e5c565b9150611eae82611e6d565b602082019050919050565b60006020820190508181036000830152611ed281611e96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f1382611bd7565b9150611f1e83611bd7565b9250828201905080821115611f3657611f35611ed9565b5b92915050565b6000611f4782611bd7565b9150611f5283611bd7565b9250828203905081811115611f6a57611f69611ed9565b5b92915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000611fa6601f83611e5c565b9150611fb182611f70565b602082019050919050565b60006020820190508181036000830152611fd581611f99565b9050919050565b7f43616e2774207769746864726177206d6f7265207468616e20796f752068617660008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000612038602183611e5c565b915061204382611fdc565b604082019050919050565b600060208201905081810360008301526120678161202b565b9050919050565b60006040820190506120836000830185611d2e565b6120906020830184611ca5565b9392505050565b6000815190506120a681611d58565b92915050565b6000602082840312156120c2576120c1611bd2565b5b60006120d084828501612097565b91505092915050565b7f596f752068617665206e6f207265776172647300000000000000000000000000600082015250565b600061210f601383611e5c565b915061211a826120d9565b602082019050919050565b6000602082019050818103600083015261213e81612102565b9050919050565b7f5374616b696e67206973206e6f74206163746976650000000000000000000000600082015250565b600061217b601583611e5c565b915061218682612145565b602082019050919050565b600060208201905081810360008301526121aa8161216e565b9050919050565b7f416d6f756e7420736d616c6c6572207468616e206d696e696d696d756d20646560008201527f706f736974000000000000000000000000000000000000000000000000000000602082015250565b600061220d602583611e5c565b9150612218826121b1565b604082019050919050565b6000602082019050818103600083015261223c81612200565b9050919050565b7f416d6f756e74206973206d6f7265207468616e206d6178696d756d206465706f60008201527f7369740000000000000000000000000000000000000000000000000000000000602082015250565b600061229f602383611e5c565b91506122aa82612243565b604082019050919050565b600060208201905081810360008301526122ce81612292565b9050919050565b6000815190506122e481611be1565b92915050565b600060208284031215612300576122ff611bd2565b5b600061230e848285016122d5565b91505092915050565b7f43616e2774207374616b65206d6f7265207468616e20796f75206f776e000000600082015250565b600061234d601d83611e5c565b915061235882612317565b602082019050919050565b6000602082019050818103600083015261237c81612340565b9050919050565b60006060820190506123986000830186611d2e565b6123a56020830185611d2e565b6123b26040830184611ca5565b949350505050565b7f596f752068617665206e6f206465706f73697400000000000000000000000000600082015250565b60006123f0601383611e5c565b91506123fb826123ba565b602082019050919050565b6000602082019050818103600083015261241f816123e3565b9050919050565b7f547269656420746f20636f6d706f756e642072657761727320746f6f20736f6f60008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000612482602183611e5c565b915061248d82612426565b604082019050919050565b600060208201905081810360008301526124b181612475565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612514602683611e5c565b915061251f826124b8565b604082019050919050565b6000602082019050818103600083015261254381612507565b9050919050565b600061255582611bd7565b915061256083611bd7565b925082820261256e81611bd7565b9150828204841483151761258557612584611ed9565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125c682611bd7565b91506125d183611bd7565b9250826125e1576125e061258c565b5b82820490509291505056fea2646970667358221220592aee4f721b23017d0bc85ba8a3ea92302427db85a026d4d3662b09b71bb1b864736f6c63430008120033
Deployed Bytecode Sourcemap
49120:6775:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49204:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52187:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54848:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49956:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53774:585;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52293:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53276:439;;;:::i;:::-;;49725:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54451:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;49865:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20685:103;;;:::i;:::-;;20034:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49648:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49239:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49825:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50809:1152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51969:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52575:654;;;:::i;:::-;;52078:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52394:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49770:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55406:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55234:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20943:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49204:28;;;;;;;;;;;;;:::o;52187:98::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52272:5:::1;52257:12;:20;;;;52187:98:::0;:::o;54848:378::-;54941:14;55027:15;55011:12;;54977:7;:14;54985:5;54977:14;;;;;;;;;;;;;;;:31;;;:46;;;;:::i;:::-;:65;54973:246;;55066:1;55059:8;;;;54973:246;55192:15;55159:12;;55125:7;:14;55133:5;55125:14;;;;;;;;;;;;;;;:31;;;:46;;;;:::i;:::-;55124:83;;;;:::i;:::-;55100:107;;54848:378;;;;:::o;49956:35::-;;;;:::o;53774:585::-;1849:1;2447:7;;:19;2439:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1849:1;2580:7;:18;;;;53897:7:::1;53864;:19;53872:10;53864:19;;;;;;;;;;;;;;;:29;;;:40;;53842:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;53976:16;53995:28;54012:10;53995:16;:28::i;:::-;53976:47;;54067:7;54034;:19;54042:10;54034:19;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;54125:8;54085:7;:19;54093:10;54085:19;;;;;;;;;;;;;;;:36;;;:48;;;;;;;:::i;:::-;;;;;;;;54183:15;54144:7;:19;54152:10;54144:19;;;;;;;;;;;;;;;:36;;:54;;;;54240:7;54228:10;54214:34;;;;;;;;;;;;54259:14;;;;;;;;;;;:23;;;54283:10;54295:7;54259:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54344:7;54329:12;;:22;;;;:::i;:::-;54314:12;:37;;;;53831:528;1805:1:::0;2759:7;:22;;;;53774:585;:::o;52293:93::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52373:5:::1;52362:8;:16;;;;52293:93:::0;:::o;53276:439::-;1849:1;2447:7;;:19;2439:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1849:1;2580:7;:18;;;;53333:15:::1;53395:7;:19;53403:10;53395:19;;;;;;;;;;;;;;;:36;;;53351:28;53368:10;53351:16;:28::i;:::-;:80;;;;:::i;:::-;53333:98;;53460:1;53450:7;:11;53442:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;53535:1;53496:7;:19;53504:10;53496:19;;;;;;;;;;;;;;;:36;;:40;;;;53586:15;53547:7;:19;53555:10;53547:19;;;;;;;;;;;;;;;:36;;:54;;;;53644:7;53632:10;53617:35;;;;;;;;;;;;53663:14;;;;;;;;;;;:23;;;53687:10;53699:7;53663:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53322:393;1805:1:::0;2759:7;:22;;;;53276:439::o;49725:38::-;;;;:::o;54451:319::-;54538:14;54554:16;54597:7;:14;54605:5;54597:14;;;;;;;;;;;;;;;:24;;;54588:33;;54695:7;:14;54703:5;54695:14;;;;;;;;;;;;;;;:31;;;54656:23;54673:5;54656:16;:23::i;:::-;:70;;;;:::i;:::-;54632:94;;54451:319;;;:::o;49865:35::-;;;;;;;;;;;;;:::o;20685:103::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20750:30:::1;20777:1;20750:18;:30::i;:::-;20685:103::o:0;20034:87::-;20080:7;20107:6;;;;;;;;;;;20100:13;;20034:87;:::o;49648:35::-;;;;:::o;49239:28::-;;;;;;;;;;;;;:::o;49825:31::-;;;;:::o;50809:1152::-;1849:1;2447:7;;:19;2439:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1849:1;2580:7;:18;;;;50903:5:::1;50884:24;;:15;;;;;;;;;;;:24;;::::0;50876:58:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50964:8;;50953:7;:19;;50945:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51044:8;;51033:7;:19;;51025:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51145:8;;51112:7;:19;51120:10;51112:19;;;;;;;;;;;;;;;:29;;;:41;;51103:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;51274:7;51233:14;;;;;;;;;;;51226:32;;;51259:10;51226:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;51204:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;51386:1;51353:7;:19;51361:10;51353:19;;;;;;;;;;;;;;;:29;;;:34:::0;51349:440:::1;;51436:7;51404;:19;51412:10;51404:19;;;;;;;;;;;;;;;:29;;:39;;;;51497:15;51458:7;:19;51466:10;51458:19;;;;;;;;;;;;;;;:36;;:54;;;;51349:440;;;51545:15;51563:28;51580:10;51563:16;:28::i;:::-;51545:46;;51646:7;51606;:19;51614:10;51606:19;;;;;;;;;;;;;;;:36;;;:47;;;;;;;:::i;:::-;;;;;;;;51701:7;51668;:19;51676:10;51668:19;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;51762:15;51723:7;:19;51731:10;51723:19;;;;;;;;;;;;;;;:36;;:54;;;;51530:259;51349:440;51823:7;51811:10;51804:27;;;;;;;;;;;;51842:14;;;;;;;;;;;:27;;;51870:10;51890:4;51897:7;51842:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51946:7;51931:12;;:22;;;;:::i;:::-;51916:12;:37;;;;1805:1:::0;2759:7;:22;;;;50809:1152;:::o;51969:101::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52057:5:::1;52039:15;;:23;;;;;;;;;;;;;;;;;;51969:101:::0;:::o;52575:654::-;1849:1;2447:7;;:19;2439:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1849:1;2580:7;:18;;;;52659:5:::1;52640:24;;:15;;;;;;;;;;;:24;;::::0;52632:58:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;52741:1;52709:7;:19;52717:10;52709:19;;;;;;;;;;;;;;;:29;;;:33;52701:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52835:1;52799:32;52820:10;52799:20;:32::i;:::-;:37;52777:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;52908:15;52970:7;:19;52978:10;52970:19;;;;;;;;;;;;;;;:36;;;52926:28;52943:10;52926:16;:28::i;:::-;:80;;;;:::i;:::-;52908:98;;53056:1;53017:7;:19;53025:10;53017:19;;;;;;;;;;;;;;;:36;;:40;;;;53101:7;53068;:19;53076:10;53068:19;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;53158:15;53119:7;:19;53127:10;53119:19;;;;;;;;;;;;;;;:36;;:54;;;;53214:7;53199:12;;:22;;;;:::i;:::-;53184:12;:37;;;;52621:608;1805:1:::0;2759:7;:22;;;;52575:654::o;52078:101::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52166:5:::1;52149:14;:22;;;;52078:101:::0;:::o;52394:93::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52474:5:::1;52463:8;:16;;;;52394:93:::0;:::o;49770:46::-;;;;:::o;55406:131::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55486:11:::1;:20;;:43;55507:21;55486:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55406:131:::0;:::o;55234:159::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55341:12:::1;55334:29;;;55364:7;:5;:7::i;:::-;55373:11;55334:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55234:159:::0;;:::o;20943:201::-;20265:12;:10;:12::i;:::-;20254:23;;:7;:5;:7::i;:::-;:23;;;20246:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21052:1:::1;21032:22;;:8;:22;;::::0;21024:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21108:28;21127:8;21108:18;:28::i;:::-;20943:201:::0;:::o;18758:98::-;18811:7;18838:10;18831:17;;18758:98;:::o;55613:279::-;55706:15;55875:8;55867:4;55849:14;;55819:7;:16;55827:7;55819:16;;;;;;;;;;;;;;;:26;;;55769:7;:16;55777:7;55769:16;;;;;;;;;;;;;;;:33;;;55751:15;:51;;;;:::i;:::-;55750:95;;;;:::i;:::-;55749:114;;;;:::i;:::-;55748:123;;;;:::i;:::-;55747:136;;;;:::i;:::-;55739:145;;55613:279;;;:::o;21304:191::-;21378:16;21397:6;;;;;;;;;;;21378:25;;21423:8;21414:6;;:17;;;;;;;;;;;;;;;;;;21478:8;21447:40;;21468:8;21447:40;;;;;;;;;;;;21367:128;21304:191;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:60::-;167:3;188:5;181:12;;139:60;;;:::o;205:142::-;255:9;288:53;306:34;315:24;333:5;315:24;:::i;:::-;306:34;:::i;:::-;288:53;:::i;:::-;275:66;;205:142;;;:::o;353:126::-;403:9;436:37;467:5;436:37;:::i;:::-;423:50;;353:126;;;:::o;485:140::-;549:9;582:37;613:5;582:37;:::i;:::-;569:50;;485:140;;;:::o;631:159::-;732:51;777:5;732:51;:::i;:::-;727:3;720:64;631:159;;:::o;796:250::-;903:4;941:2;930:9;926:18;918:26;;954:85;1036:1;1025:9;1021:17;1012:6;954:85;:::i;:::-;796:250;;;;:::o;1133:117::-;1242:1;1239;1232:12;1379:77;1416:7;1445:5;1434:16;;1379:77;;;:::o;1462:122::-;1535:24;1553:5;1535:24;:::i;:::-;1528:5;1525:35;1515:63;;1574:1;1571;1564:12;1515:63;1462:122;:::o;1590:139::-;1636:5;1674:6;1661:20;1652:29;;1690:33;1717:5;1690:33;:::i;:::-;1590:139;;;;:::o;1735:329::-;1794:6;1843:2;1831:9;1822:7;1818:23;1814:32;1811:119;;;1849:79;;:::i;:::-;1811:119;1969:1;1994:53;2039:7;2030:6;2019:9;2015:22;1994:53;:::i;:::-;1984:63;;1940:117;1735:329;;;;:::o;2070:96::-;2107:7;2136:24;2154:5;2136:24;:::i;:::-;2125:35;;2070:96;;;:::o;2172:122::-;2245:24;2263:5;2245:24;:::i;:::-;2238:5;2235:35;2225:63;;2284:1;2281;2274:12;2225:63;2172:122;:::o;2300:139::-;2346:5;2384:6;2371:20;2362:29;;2400:33;2427:5;2400:33;:::i;:::-;2300:139;;;;:::o;2445:329::-;2504:6;2553:2;2541:9;2532:7;2528:23;2524:32;2521:119;;;2559:79;;:::i;:::-;2521:119;2679:1;2704:53;2749:7;2740:6;2729:9;2725:22;2704:53;:::i;:::-;2694:63;;2650:117;2445:329;;;;:::o;2780:118::-;2867:24;2885:5;2867:24;:::i;:::-;2862:3;2855:37;2780:118;;:::o;2904:222::-;2997:4;3035:2;3024:9;3020:18;3012:26;;3048:71;3116:1;3105:9;3101:17;3092:6;3048:71;:::i;:::-;2904:222;;;;:::o;3132:332::-;3253:4;3291:2;3280:9;3276:18;3268:26;;3304:71;3372:1;3361:9;3357:17;3348:6;3304:71;:::i;:::-;3385:72;3453:2;3442:9;3438:18;3429:6;3385:72;:::i;:::-;3132:332;;;;;:::o;3470:90::-;3504:7;3547:5;3540:13;3533:21;3522:32;;3470:90;;;:::o;3566:109::-;3647:21;3662:5;3647:21;:::i;:::-;3642:3;3635:34;3566:109;;:::o;3681:210::-;3768:4;3806:2;3795:9;3791:18;3783:26;;3819:65;3881:1;3870:9;3866:17;3857:6;3819:65;:::i;:::-;3681:210;;;;:::o;3897:118::-;3984:24;4002:5;3984:24;:::i;:::-;3979:3;3972:37;3897:118;;:::o;4021:222::-;4114:4;4152:2;4141:9;4137:18;4129:26;;4165:71;4233:1;4222:9;4218:17;4209:6;4165:71;:::i;:::-;4021:222;;;;:::o;4249:116::-;4319:21;4334:5;4319:21;:::i;:::-;4312:5;4309:32;4299:60;;4355:1;4352;4345:12;4299:60;4249:116;:::o;4371:133::-;4414:5;4452:6;4439:20;4430:29;;4468:30;4492:5;4468:30;:::i;:::-;4371:133;;;;:::o;4510:323::-;4566:6;4615:2;4603:9;4594:7;4590:23;4586:32;4583:119;;;4621:79;;:::i;:::-;4583:119;4741:1;4766:50;4808:7;4799:6;4788:9;4784:22;4766:50;:::i;:::-;4756:60;;4712:114;4510:323;;;;:::o;4839:104::-;4884:7;4913:24;4931:5;4913:24;:::i;:::-;4902:35;;4839:104;;;:::o;4949:138::-;5030:32;5056:5;5030:32;:::i;:::-;5023:5;5020:43;5010:71;;5077:1;5074;5067:12;5010:71;4949:138;:::o;5093:155::-;5147:5;5185:6;5172:20;5163:29;;5201:41;5236:5;5201:41;:::i;:::-;5093:155;;;;:::o;5254:345::-;5321:6;5370:2;5358:9;5349:7;5345:23;5341:32;5338:119;;;5376:79;;:::i;:::-;5338:119;5496:1;5521:61;5574:7;5565:6;5554:9;5550:22;5521:61;:::i;:::-;5511:71;;5467:125;5254:345;;;;:::o;5605:474::-;5673:6;5681;5730:2;5718:9;5709:7;5705:23;5701:32;5698:119;;;5736:79;;:::i;:::-;5698:119;5856:1;5881:53;5926:7;5917:6;5906:9;5902:22;5881:53;:::i;:::-;5871:63;;5827:117;5983:2;6009:53;6054:7;6045:6;6034:9;6030:22;6009:53;:::i;:::-;5999:63;;5954:118;5605:474;;;;;:::o;6085:169::-;6169:11;6203:6;6198:3;6191:19;6243:4;6238:3;6234:14;6219:29;;6085:169;;;;:::o;6260:182::-;6400:34;6396:1;6388:6;6384:14;6377:58;6260:182;:::o;6448:366::-;6590:3;6611:67;6675:2;6670:3;6611:67;:::i;:::-;6604:74;;6687:93;6776:3;6687:93;:::i;:::-;6805:2;6800:3;6796:12;6789:19;;6448:366;;;:::o;6820:419::-;6986:4;7024:2;7013:9;7009:18;7001:26;;7073:9;7067:4;7063:20;7059:1;7048:9;7044:17;7037:47;7101:131;7227:4;7101:131;:::i;:::-;7093:139;;6820:419;;;:::o;7245:180::-;7293:77;7290:1;7283:88;7390:4;7387:1;7380:15;7414:4;7411:1;7404:15;7431:191;7471:3;7490:20;7508:1;7490:20;:::i;:::-;7485:25;;7524:20;7542:1;7524:20;:::i;:::-;7519:25;;7567:1;7564;7560:9;7553:16;;7588:3;7585:1;7582:10;7579:36;;;7595:18;;:::i;:::-;7579:36;7431:191;;;;:::o;7628:194::-;7668:4;7688:20;7706:1;7688:20;:::i;:::-;7683:25;;7722:20;7740:1;7722:20;:::i;:::-;7717:25;;7766:1;7763;7759:9;7751:17;;7790:1;7784:4;7781:11;7778:37;;;7795:18;;:::i;:::-;7778:37;7628:194;;;;:::o;7828:181::-;7968:33;7964:1;7956:6;7952:14;7945:57;7828:181;:::o;8015:366::-;8157:3;8178:67;8242:2;8237:3;8178:67;:::i;:::-;8171:74;;8254:93;8343:3;8254:93;:::i;:::-;8372:2;8367:3;8363:12;8356:19;;8015:366;;;:::o;8387:419::-;8553:4;8591:2;8580:9;8576:18;8568:26;;8640:9;8634:4;8630:20;8626:1;8615:9;8611:17;8604:47;8668:131;8794:4;8668:131;:::i;:::-;8660:139;;8387:419;;;:::o;8812:220::-;8952:34;8948:1;8940:6;8936:14;8929:58;9021:3;9016:2;9008:6;9004:15;8997:28;8812:220;:::o;9038:366::-;9180:3;9201:67;9265:2;9260:3;9201:67;:::i;:::-;9194:74;;9277:93;9366:3;9277:93;:::i;:::-;9395:2;9390:3;9386:12;9379:19;;9038:366;;;:::o;9410:419::-;9576:4;9614:2;9603:9;9599:18;9591:26;;9663:9;9657:4;9653:20;9649:1;9638:9;9634:17;9627:47;9691:131;9817:4;9691:131;:::i;:::-;9683:139;;9410:419;;;:::o;9835:332::-;9956:4;9994:2;9983:9;9979:18;9971:26;;10007:71;10075:1;10064:9;10060:17;10051:6;10007:71;:::i;:::-;10088:72;10156:2;10145:9;10141:18;10132:6;10088:72;:::i;:::-;9835:332;;;;;:::o;10173:137::-;10227:5;10258:6;10252:13;10243:22;;10274:30;10298:5;10274:30;:::i;:::-;10173:137;;;;:::o;10316:345::-;10383:6;10432:2;10420:9;10411:7;10407:23;10403:32;10400:119;;;10438:79;;:::i;:::-;10400:119;10558:1;10583:61;10636:7;10627:6;10616:9;10612:22;10583:61;:::i;:::-;10573:71;;10529:125;10316:345;;;;:::o;10667:169::-;10807:21;10803:1;10795:6;10791:14;10784:45;10667:169;:::o;10842:366::-;10984:3;11005:67;11069:2;11064:3;11005:67;:::i;:::-;10998:74;;11081:93;11170:3;11081:93;:::i;:::-;11199:2;11194:3;11190:12;11183:19;;10842:366;;;:::o;11214:419::-;11380:4;11418:2;11407:9;11403:18;11395:26;;11467:9;11461:4;11457:20;11453:1;11442:9;11438:17;11431:47;11495:131;11621:4;11495:131;:::i;:::-;11487:139;;11214:419;;;:::o;11639:171::-;11779:23;11775:1;11767:6;11763:14;11756:47;11639:171;:::o;11816:366::-;11958:3;11979:67;12043:2;12038:3;11979:67;:::i;:::-;11972:74;;12055:93;12144:3;12055:93;:::i;:::-;12173:2;12168:3;12164:12;12157:19;;11816:366;;;:::o;12188:419::-;12354:4;12392:2;12381:9;12377:18;12369:26;;12441:9;12435:4;12431:20;12427:1;12416:9;12412:17;12405:47;12469:131;12595:4;12469:131;:::i;:::-;12461:139;;12188:419;;;:::o;12613:224::-;12753:34;12749:1;12741:6;12737:14;12730:58;12822:7;12817:2;12809:6;12805:15;12798:32;12613:224;:::o;12843:366::-;12985:3;13006:67;13070:2;13065:3;13006:67;:::i;:::-;12999:74;;13082:93;13171:3;13082:93;:::i;:::-;13200:2;13195:3;13191:12;13184:19;;12843:366;;;:::o;13215:419::-;13381:4;13419:2;13408:9;13404:18;13396:26;;13468:9;13462:4;13458:20;13454:1;13443:9;13439:17;13432:47;13496:131;13622:4;13496:131;:::i;:::-;13488:139;;13215:419;;;:::o;13640:222::-;13780:34;13776:1;13768:6;13764:14;13757:58;13849:5;13844:2;13836:6;13832:15;13825:30;13640:222;:::o;13868:366::-;14010:3;14031:67;14095:2;14090:3;14031:67;:::i;:::-;14024:74;;14107:93;14196:3;14107:93;:::i;:::-;14225:2;14220:3;14216:12;14209:19;;13868:366;;;:::o;14240:419::-;14406:4;14444:2;14433:9;14429:18;14421:26;;14493:9;14487:4;14483:20;14479:1;14468:9;14464:17;14457:47;14521:131;14647:4;14521:131;:::i;:::-;14513:139;;14240:419;;;:::o;14665:143::-;14722:5;14753:6;14747:13;14738:22;;14769:33;14796:5;14769:33;:::i;:::-;14665:143;;;;:::o;14814:351::-;14884:6;14933:2;14921:9;14912:7;14908:23;14904:32;14901:119;;;14939:79;;:::i;:::-;14901:119;15059:1;15084:64;15140:7;15131:6;15120:9;15116:22;15084:64;:::i;:::-;15074:74;;15030:128;14814:351;;;;:::o;15171:179::-;15311:31;15307:1;15299:6;15295:14;15288:55;15171:179;:::o;15356:366::-;15498:3;15519:67;15583:2;15578:3;15519:67;:::i;:::-;15512:74;;15595:93;15684:3;15595:93;:::i;:::-;15713:2;15708:3;15704:12;15697:19;;15356:366;;;:::o;15728:419::-;15894:4;15932:2;15921:9;15917:18;15909:26;;15981:9;15975:4;15971:20;15967:1;15956:9;15952:17;15945:47;16009:131;16135:4;16009:131;:::i;:::-;16001:139;;15728:419;;;:::o;16153:442::-;16302:4;16340:2;16329:9;16325:18;16317:26;;16353:71;16421:1;16410:9;16406:17;16397:6;16353:71;:::i;:::-;16434:72;16502:2;16491:9;16487:18;16478:6;16434:72;:::i;:::-;16516;16584:2;16573:9;16569:18;16560:6;16516:72;:::i;:::-;16153:442;;;;;;:::o;16601:169::-;16741:21;16737:1;16729:6;16725:14;16718:45;16601:169;:::o;16776:366::-;16918:3;16939:67;17003:2;16998:3;16939:67;:::i;:::-;16932:74;;17015:93;17104:3;17015:93;:::i;:::-;17133:2;17128:3;17124:12;17117:19;;16776:366;;;:::o;17148:419::-;17314:4;17352:2;17341:9;17337:18;17329:26;;17401:9;17395:4;17391:20;17387:1;17376:9;17372:17;17365:47;17429:131;17555:4;17429:131;:::i;:::-;17421:139;;17148:419;;;:::o;17573:220::-;17713:34;17709:1;17701:6;17697:14;17690:58;17782:3;17777:2;17769:6;17765:15;17758:28;17573:220;:::o;17799:366::-;17941:3;17962:67;18026:2;18021:3;17962:67;:::i;:::-;17955:74;;18038:93;18127:3;18038:93;:::i;:::-;18156:2;18151:3;18147:12;18140:19;;17799:366;;;:::o;18171:419::-;18337:4;18375:2;18364:9;18360:18;18352:26;;18424:9;18418:4;18414:20;18410:1;18399:9;18395:17;18388:47;18452:131;18578:4;18452:131;:::i;:::-;18444:139;;18171:419;;;:::o;18596:225::-;18736:34;18732:1;18724:6;18720:14;18713:58;18805:8;18800:2;18792:6;18788:15;18781:33;18596:225;:::o;18827:366::-;18969:3;18990:67;19054:2;19049:3;18990:67;:::i;:::-;18983:74;;19066:93;19155:3;19066:93;:::i;:::-;19184:2;19179:3;19175:12;19168:19;;18827:366;;;:::o;19199:419::-;19365:4;19403:2;19392:9;19388:18;19380:26;;19452:9;19446:4;19442:20;19438:1;19427:9;19423:17;19416:47;19480:131;19606:4;19480:131;:::i;:::-;19472:139;;19199:419;;;:::o;19624:410::-;19664:7;19687:20;19705:1;19687:20;:::i;:::-;19682:25;;19721:20;19739:1;19721:20;:::i;:::-;19716:25;;19776:1;19773;19769:9;19798:30;19816:11;19798:30;:::i;:::-;19787:41;;19977:1;19968:7;19964:15;19961:1;19958:22;19938:1;19931:9;19911:83;19888:139;;20007:18;;:::i;:::-;19888:139;19672:362;19624:410;;;;:::o;20040:180::-;20088:77;20085:1;20078:88;20185:4;20182:1;20175:15;20209:4;20206:1;20199:15;20226:185;20266:1;20283:20;20301:1;20283:20;:::i;:::-;20278:25;;20317:20;20335:1;20317:20;:::i;:::-;20312:25;;20356:1;20346:35;;20361:18;;:::i;:::-;20346:35;20403:1;20400;20396:9;20391:14;;20226:185;;;;:::o
Swarm Source
ipfs://592aee4f721b23017d0bc85ba8a3ea92302427db85a026d4d3662b09b71bb1b8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.