More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 246 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 22217366 | 15 days ago | IN | 0 ETH | 0.00057533 | ||||
Get Reward | 22217362 | 15 days ago | IN | 0 ETH | 0.00060823 | ||||
Get Reward | 22175545 | 21 days ago | IN | 0 ETH | 0.00031359 | ||||
Withdraw | 22175542 | 21 days ago | IN | 0 ETH | 0.00033559 | ||||
Withdraw | 22146283 | 25 days ago | IN | 0 ETH | 0.0003227 | ||||
Get Reward | 22146277 | 25 days ago | IN | 0 ETH | 0.00040365 | ||||
Withdraw | 22108390 | 30 days ago | IN | 0 ETH | 0.00025691 | ||||
Withdraw | 21810417 | 72 days ago | IN | 0 ETH | 0.00030624 | ||||
Get Reward | 21810408 | 72 days ago | IN | 0 ETH | 0.00030249 | ||||
Withdraw | 21418332 | 127 days ago | IN | 0 ETH | 0.00160099 | ||||
Withdraw | 21413965 | 127 days ago | IN | 0 ETH | 0.00069973 | ||||
Get Reward | 21413965 | 127 days ago | IN | 0 ETH | 0.00073674 | ||||
Get Reward | 21357300 | 135 days ago | IN | 0 ETH | 0.00086534 | ||||
Withdraw | 21357291 | 135 days ago | IN | 0 ETH | 0.00107068 | ||||
Withdraw | 21349955 | 136 days ago | IN | 0 ETH | 0.00131895 | ||||
Get Reward | 21349950 | 136 days ago | IN | 0 ETH | 0.00153706 | ||||
Get Reward | 21116325 | 169 days ago | IN | 0 ETH | 0.00076931 | ||||
Withdraw | 21116321 | 169 days ago | IN | 0 ETH | 0.00080944 | ||||
Get Reward | 20540036 | 249 days ago | IN | 0 ETH | 0.0003637 | ||||
Withdraw | 19711670 | 365 days ago | IN | 0 ETH | 0.00297586 | ||||
Get Reward | 19711640 | 365 days ago | IN | 0 ETH | 0.00232202 | ||||
Get Reward | 19703001 | 366 days ago | IN | 0 ETH | 0.00094491 | ||||
Get Reward | 19693512 | 368 days ago | IN | 0 ETH | 0.00084666 | ||||
Withdraw | 19693504 | 368 days ago | IN | 0 ETH | 0.00099533 | ||||
Get Reward | 19693502 | 368 days ago | IN | 0 ETH | 0.000883 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
sombra_staking
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // 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/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/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // 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/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: staking_locking/smbr_staking7_special.sol pragma solidity ^0.8.4; interface SINS { function balanceOf(address) external view returns (uint256); } interface NftLocker { function balanceOf(address) external view returns (uint256); } contract sombra_staking is Context, AccessControl, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ IERC20 public rewardsToken; IERC20 public stakingToken; uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public rewardsDuration = 7 days; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; uint256 private _totalSupply; mapping(address => uint256) private _balances; mapping(uint256 => uint256) private _tiers; // mapping(address => uint256) public bonuses; uint256 public bonus_denominator = 100000; // // Roles bytes32 public constant PAUSER_ROLE = keccak256('PAUSER_ROLE'); bytes32 public constant OPERATOR_ROLE = keccak256('OPERATOR_ROLE'); bytes32 public constant DISTRIBUTION_ROLE = keccak256("DISTRIBUTION_ROLE"); bytes32 public constant BONUS_ROLE = keccak256("BONUS_ROLE"); // SINS address public nft_address; address public nft_locker_address; // /* ========== CONSTRUCTOR ========== */ constructor( address _rewardsToken, address _stakingToken ){ rewardsToken = IERC20(_rewardsToken); stakingToken = IERC20(_stakingToken); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(OPERATOR_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); _setupRole(DISTRIBUTION_ROLE, _msgSender()); _setupRole(BONUS_ROLE, _msgSender()); } modifier onlyOperator() { require( hasRole(OPERATOR_ROLE, _msgSender()), 'must have operator role to use this function' ); _; } modifier onlyDistribution() { require( hasRole(DISTRIBUTION_ROLE, _msgSender()), 'must have operator role to use this function' ); _; } /* ========== VIEWS ========== */ function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balances[account]; } function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp < periodFinish ? block.timestamp : periodFinish; } function getBonus(address account) external view returns (uint256) { return bonuses[account]; } function rewardPerToken() public view returns (uint256) { if (_totalSupply == 0) { return rewardPerTokenStored; } return rewardPerTokenStored + (((lastTimeRewardApplicable() - lastUpdateTime) * rewardRate * 1e18) / _totalSupply); } function earned(address account) public view returns (uint256) { return ((_balances[account] * (rewardPerToken() - userRewardPerTokenPaid[account])) / 1e18) + rewards[account]; } function getRewardForDuration() external view returns (uint256) { return rewardRate * rewardsDuration; } function getDuration() external view returns (uint256) { return rewardsDuration; } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(uint256 amount) external nonReentrant whenNotPaused() updateReward(_msgSender()) { SINS nft_required = SINS(nft_address); NftLocker nft_locker_address_required = NftLocker(nft_locker_address); require(nft_required.balanceOf(_msgSender()) > 0 || nft_locker_address_required.balanceOf(_msgSender()) > 0, "you need to own a special NFT to stake"); require(amount > 0, "Cannot stake 0"); _totalSupply = _totalSupply + amount; _balances[_msgSender()] = _balances[_msgSender()] + (amount); stakingToken.safeTransferFrom(_msgSender(), address(this), amount); emit Staked(_msgSender(), amount); } function withdraw(uint256 amount) public nonReentrant updateReward(_msgSender()) { require(amount > 0, "Cannot withdraw 0"); _totalSupply = _totalSupply - amount; _balances[_msgSender()] = _balances[_msgSender()] - (amount); stakingToken.safeTransfer(_msgSender(), amount); emit Withdrawn(_msgSender(), amount); } function getReward() public nonReentrant updateReward(_msgSender()) { uint256 reward = rewards[_msgSender()]; // adding bonus uint256 bonus = bonuses[_msgSender()]; reward = (reward * (bonus_denominator + bonus)) / bonus_denominator; // if (reward > 0) { rewards[_msgSender()] = 0; rewardsToken.safeTransfer(_msgSender(), reward); emit RewardPaid(_msgSender(), reward); } } function exit() external { withdraw(_balances[_msgSender()]); getReward(); } /* ========== RESTRICTED FUNCTIONS ========== */ function updateRewardsNow(uint256 reward) external onlyDistribution updateReward(address(0)) { uint balance = rewardsToken.balanceOf(address(this)) - _totalSupply; require(reward > rewardsDuration,"required that reward is greater than rewardsDuration"); if (block.timestamp >= periodFinish) { rewardRate = reward / (rewardsDuration); } else { uint256 remaining = periodFinish - (block.timestamp); uint256 leftover = remaining * (rewardRate); rewardRate = (reward + leftover) / (rewardsDuration); } // reward > duration otherwise wierd stuff happens // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow. // uint balance = rewardsToken.balanceOf(address(this)) - _totalSupply; require(rewardRate <= balance / (rewardsDuration), "Provided reward too high"); lastUpdateTime = block.timestamp; periodFinish = block.timestamp + (rewardsDuration); emit RewardAdded(reward); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOperator { IERC20(tokenAddress).safeTransfer(_msgSender(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } function setRewardsDuration(uint256 _rewardsDuration) external onlyOperator { require( block.timestamp > periodFinish, "Previous period must complete before changing for the new period" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } function setTier(uint256 tier, uint256 threshold) public onlyOperator() { _tiers[tier] = threshold; } function howMuchStaked(address account) public view returns(uint256) { uint256 staked = _balances[account]; return staked; } function hasTier(address account, uint256 tier) public view returns(bool){ uint256 staked = howMuchStaked(account); uint256 threshold = _tiers[tier]; if (staked >= threshold){ return true; } return false; } /* ========== MODIFIERS ========== */ function setNftRequired(address new_nft) public { // initialize new nft require( hasRole(OPERATOR_ROLE, _msgSender()), 'must have operator role to use this function' ); nft_address = new_nft; // nft_required = SINS(nft_address); } function setLockerRequired(address new_locker) public { // initialize new nft locker require( hasRole(OPERATOR_ROLE, _msgSender()), 'must have operator role to use this function' ); nft_locker_address = new_locker; // nft_locker_address_required = NftLocker(nft_address); } /// /// bonus set/get function setBonusDenominator(uint256 denominator) public { require( hasRole(BONUS_ROLE, _msgSender()), 'must have bonus role to use this function' ); bonus_denominator = denominator; } function addBonus(address user, uint256 bonus) public { require( hasRole(BONUS_ROLE, _msgSender()), 'must have bonus role to use this function' ); bonuses[user] += bonus; } function removeBonus(address user, uint256 bonus) public { require( hasRole(BONUS_ROLE, _msgSender()), 'must have bonus role to use this function' ); if(bonuses[user] != 0){ bonuses[user] -= bonus; } } /// modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); event RewardsDurationUpdated(uint256 newDuration); event Recovered(address token, uint256 amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"BONUS_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISTRIBUTION_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"addBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonus_denominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bonuses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tier","type":"uint256"}],"name":"hasTier","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"howMuchStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft_locker_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"removeBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"setBonusDenominator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_locker","type":"address"}],"name":"setLockerRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_nft","type":"address"}],"name":"setNftRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"updateRewardsNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600555600060065562093a80600755620186a06010553480156200002957600080fd5b50604051620023dd380380620023dd8339810160408190526200004c9162000222565b6001805460ff19168155600255600380546001600160a01b038085166001600160a01b03199283161790925560048054928416929091169190911790556200009d6000620000973390565b62000155565b620000c97f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293362000155565b620000f57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000155565b620001217fb7b0a8b00357f0e4c4a4839008cf90d61a23fe1c55511ea70753532d8bab02c53362000155565b6200014d7fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893362000155565b50506200025a565b62000161828262000165565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000161576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001c13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b03811681146200021d57600080fd5b919050565b600080604083850312156200023657600080fd5b620002418362000205565b9150620002516020840162000205565b90509250929050565b612173806200026a6000396000f3fe608060405234801561001057600080fd5b506004361061031f5760003560e01c80638996dded116101a7578063cd3daf9d116100ee578063e63ab1e911610097578063f5b541a611610071578063f5b541a6146106b8578063f742d3ac146106df578063f9ffc8b91461070657600080fd5b8063e63ab1e914610680578063e9fad8ee146106a7578063ebe2b12b146106af57600080fd5b8063d547741f116100c8578063d547741f14610651578063dede87cb14610664578063df136d651461067757600080fd5b8063cd3daf9d1461060f578063d134c13614610617578063d1af0c7d1461063e57600080fd5b8063a694fc3a11610150578063c78de7091161012a578063c78de709146105e0578063c8f33c91146105f3578063cc1a378f146105fc57600080fd5b8063a694fc3a146105b2578063ad2e8c9b146105c5578063c5480a61146105cd57600080fd5b8063a05ad03411610181578063a05ad034146104ac578063a217fddf14610597578063a34e59901461059f57600080fd5b80638996dded146105375780638b8763471461054057806391d148541461056057600080fd5b8063386a95251161026b57806370a08231116102145780637dd160cb116101ee5780637dd160cb1461050957806380faa57d1461051c5780638980f11f1461052457600080fd5b806370a08231146104ac57806372f702f3146104d55780637b0a47ee1461050057600080fd5b80635a93cc8f116102455780635a93cc8f1461047b5780635c975abb1461048e5780636cc8df011461049957600080fd5b8063386a9525146104415780633a740a631461044a5780633d18b9121461047357600080fd5b806318160ddd116102cd5780632e1a7d4d116102a75780632e1a7d4d146104085780632f2ff15d1461041b57806336568abe1461042e57600080fd5b806318160ddd146103d55780631c1f78eb146103dd578063248a9ca3146103e557600080fd5b80630430fb4b116102fe5780630430fb4b146103805780630700037d146103a05780630d822c74146103c057600080fd5b80628cc2621461032457806301a035331461034a57806301ffc9a71461036d575b600080fd5b610337610332366004611e1b565b610719565b6040519081526020015b60405180910390f35b61035d610358366004611e36565b610796565b6040519015158152602001610341565b61035d61037b366004611ec7565b6107da565b61033761038e366004611e1b565b600f6020526000908152604090205481565b6103376103ae366004611e1b565b600b6020526000908152604090205481565b6103d36103ce366004611e82565b61080f565b005b600c54610337565b610337610ac8565b6103376103f3366004611e82565b60009081526020819052604090206001015490565b6103d3610416366004611e82565b610adf565b6103d3610429366004611e9b565b610c76565b6103d361043c366004611e9b565b610ca1565b61033760075481565b610337610458366004611e1b565b6001600160a01b03166000908152600f602052604090205490565b6103d3610d2d565b6103d3610489366004611e36565b610e8c565b60015460ff1661035d565b6103d36104a7366004611e36565b610f45565b6103376104ba366004611e1b565b6001600160a01b03166000908152600d602052604090205490565b6004546104e8906001600160a01b031681565b6040516001600160a01b039091168152602001610341565b61033760065481565b6103d3610517366004611e1b565b611013565b610337611088565b6103d3610532366004611e36565b61109f565b61033760105481565b61033761054e366004611e1b565b600a6020526000908152604090205481565b61035d61056e366004611e9b565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610337600081565b6103d36105ad366004611f0a565b61113f565b6103d36105c0366004611e82565b611197565b600754610337565b6103d36105db366004611e1b565b611504565b6011546104e8906001600160a01b031681565b61033760085481565b6103d361060a366004611e82565b611579565b610337611673565b6103377fb7b0a8b00357f0e4c4a4839008cf90d61a23fe1c55511ea70753532d8bab02c581565b6003546104e8906001600160a01b031681565b6103d361065f366004611e9b565b6116d5565b6012546104e8906001600160a01b031681565b61033760095481565b6103377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6103d36116fb565b61033760055481565b6103377f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b6103377fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab8981565b6103d3610714366004611e82565b61171e565b6001600160a01b0381166000908152600b6020908152604080832054600a909252822054670de0b6b3a76400009061074f611673565b61075991906120a1565b6001600160a01b0385166000908152600d602052604090205461077c9190612082565b6107869190612060565b6107909190612048565b92915050565b6001600160a01b0382166000908152600d6020908152604080832054848452600e9092528220548082106107cf57600192505050610790565b506000949350505050565b60006001600160e01b03198216637965db0b60e01b148061079057506301ffc9a760e01b6001600160e01b0319831614610790565b6108397fb7b0a8b00357f0e4c4a4839008cf90d61a23fe1c55511ea70753532d8bab02c53361056e565b61085e5760405162461bcd60e51b815260040161085590611ffc565b60405180910390fd5b6000610868611673565b600955610873611088565b6008556001600160a01b038116156108ba5761088e81610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b600c546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b15801561090257600080fd5b505afa158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093a9190611ef1565b61094491906120a1565b905060075483116109bd5760405162461bcd60e51b815260206004820152603460248201527f726571756972656420746861742072657761726420697320677265617465722060448201527f7468616e20726577617264734475726174696f6e0000000000000000000000006064820152608401610855565b60055442106109db576007546109d39084612060565b600655610a1d565b6000426005546109eb91906120a1565b90506000600654826109fd9190612082565b600754909150610a0d8287612048565b610a179190612060565b60065550505b600754610a2a9082612060565b6006541115610a7b5760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f206869676800000000000000006044820152606401610855565b426008819055600754610a8d91612048565b6005556040518381527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a1505050565b6000600754600654610ada9190612082565b905090565b600280541415610b315760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002805533610b3e611673565b600955610b49611088565b6008556001600160a01b03811615610b9057610b6481610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610be05760405162461bcd60e51b815260206004820152601160248201527f43616e6e6f7420776974686472617720300000000000000000000000000000006044820152606401610855565b81600c54610bee91906120a1565b600c55336000908152600d6020526040902054610c0c9083906120a1565b336000818152600d6020526040902091909155600454610c38916001600160a01b0390911690846117ab565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250506001600255565b600082815260208190526040902060010154610c928133611823565b610c9c83836118a1565b505050565b6001600160a01b0381163314610d1f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610855565b610d29828261193f565b5050565b600280541415610d7f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002805533610d8c611673565b600955610d97611088565b6008556001600160a01b03811615610dde57610db281610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b336000908152600b6020908152604080832054600f90925290912054601054610e078282612048565b610e119084612082565b610e1b9190612060565b91508115610e8257336000818152600b6020526040812055600354610e4c916001600160a01b0390911690846117ab565b60405182815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b5050600160025550565b610eb67fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893361056e565b610f145760405162461bcd60e51b815260206004820152602960248201527f6d757374206861766520626f6e757320726f6c6520746f20757365207468697360448201526810333ab731ba34b7b760b91b6064820152608401610855565b6001600160a01b0382166000908152600f602052604081208054839290610f3c908490612048565b90915550505050565b610f6f7fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893361056e565b610fcd5760405162461bcd60e51b815260206004820152602960248201527f6d757374206861766520626f6e757320726f6c6520746f20757365207468697360448201526810333ab731ba34b7b760b91b6064820152608401610855565b6001600160a01b0382166000908152600f602052604090205415610d29576001600160a01b0382166000908152600f602052604081208054839290610f3c9084906120a1565b61103d7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6110595760405162461bcd60e51b815260040161085590611ffc565b6011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000600554421061109a575060055490565b504290565b6110c97f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6110e55760405162461bcd60e51b815260040161085590611ffc565b6110f96001600160a01b03831633836117ab565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b6111697f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6111855760405162461bcd60e51b815260040161085590611ffc565b6000918252600e602052604090912055565b6002805414156111e95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002805560015460ff16156112405760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610855565b33611249611673565b600955611254611088565b6008556001600160a01b0381161561129b5761126f81610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b6011546012546001600160a01b0391821691166000826370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156112f657600080fd5b505afa15801561130a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132e9190611ef1565b11806113c0575060006001600160a01b0382166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561138657600080fd5b505afa15801561139a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113be9190611ef1565b115b61141b5760405162461bcd60e51b815260206004820152602660248201527f796f75206e65656420746f206f776e2061207370656369616c204e465420746f604482015265207374616b6560d01b6064820152608401610855565b6000841161146b5760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b6520300000000000000000000000000000000000006044820152606401610855565b83600c546114799190612048565b600c55336000908152600d6020526040902054611497908590612048565b336000818152600d60205260409020919091556004546114c4916001600160a01b039091169030876119be565b60405184815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a2505060016002555050565b61152e7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b61154a5760405162461bcd60e51b815260040161085590611ffc565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6115a37f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6115bf5760405162461bcd60e51b815260040161085590611ffc565b6005544211611638576040805162461bcd60e51b81526020600482015260248101919091527f50726576696f757320706572696f64206d75737420636f6d706c65746520626560448201527f666f7265206368616e67696e6720666f7220746865206e657720706572696f646064820152608401610855565b60078190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d39060200160405180910390a150565b6000600c5460001415611687575060095490565b600c54600654600854611698611088565b6116a291906120a1565b6116ac9190612082565b6116be90670de0b6b3a7640000612082565b6116c89190612060565b600954610ada9190612048565b6000828152602081905260409020600101546116f18133611823565b610c9c838361193f565b336000908152600d602052604090205461171490610adf565b61171c610d2d565b565b6117487fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893361056e565b6117a65760405162461bcd60e51b815260206004820152602960248201527f6d757374206861766520626f6e757320726f6c6520746f20757365207468697360448201526810333ab731ba34b7b760b91b6064820152608401610855565b601055565b6040516001600160a01b038316602482015260448101829052610c9c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909316929092179091526119fc565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610d295761185f816001600160a01b03166014611ace565b61186a836020611ace565b60405160200161187b929190611f48565b60408051601f198184030181529082905262461bcd60e51b825261085591600401611fc9565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610d29576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556118fb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610d29576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526119f69085906323b872dd60e01b906084016117d7565b50505050565b6000611a51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c7e9092919063ffffffff16565b805190915015610c9c5780806020019051810190611a6f9190611e60565b610c9c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610855565b60606000611add836002612082565b611ae8906002612048565b67ffffffffffffffff811115611b0057611b00612127565b6040519080825280601f01601f191660200182016040528015611b2a576020820181803683370190505b509050600360fc1b81600081518110611b4557611b45612111565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b7457611b74612111565b60200101906001600160f81b031916908160001a9053506000611b98846002612082565b611ba3906001612048565b90505b6001811115611c28577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611be457611be4612111565b1a60f81b828281518110611bfa57611bfa612111565b60200101906001600160f81b031916908160001a90535060049490941c93611c21816120e4565b9050611ba6565b508315611c775760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610855565b9392505050565b6060611c8d8484600085611c95565b949350505050565b606082471015611cf65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610855565b6001600160a01b0385163b611d4d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610855565b600080866001600160a01b03168587604051611d699190611f2c565b60006040518083038185875af1925050503d8060008114611da6576040519150601f19603f3d011682016040523d82523d6000602084013e611dab565b606091505b5091509150611dbb828286611dc6565b979650505050505050565b60608315611dd5575081611c77565b825115611de55782518084602001fd5b8160405162461bcd60e51b81526004016108559190611fc9565b80356001600160a01b0381168114611e1657600080fd5b919050565b600060208284031215611e2d57600080fd5b611c7782611dff565b60008060408385031215611e4957600080fd5b611e5283611dff565b946020939093013593505050565b600060208284031215611e7257600080fd5b81518015158114611c7757600080fd5b600060208284031215611e9457600080fd5b5035919050565b60008060408385031215611eae57600080fd5b82359150611ebe60208401611dff565b90509250929050565b600060208284031215611ed957600080fd5b81356001600160e01b031981168114611c7757600080fd5b600060208284031215611f0357600080fd5b5051919050565b60008060408385031215611f1d57600080fd5b50508035926020909101359150565b60008251611f3e8184602087016120b8565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611f808160178501602088016120b8565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611fbd8160288401602088016120b8565b01602801949350505050565b6020815260008251806020840152611fe88160408501602087016120b8565b601f01601f19169190910160400192915050565b6020808252602c908201527f6d7573742068617665206f70657261746f7220726f6c6520746f20757365207460408201526b3434b990333ab731ba34b7b760a11b606082015260800190565b6000821982111561205b5761205b6120fb565b500190565b60008261207d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561209c5761209c6120fb565b500290565b6000828210156120b3576120b36120fb565b500390565b60005b838110156120d35781810151838201526020016120bb565b838111156119f65750506000910152565b6000816120f3576120f36120fb565b506000190190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212207b19cd2b9437c8aaa047e0646d21bedeb00025bef352d5702ac6dbd25939cb8564736f6c6343000807003300000000000000000000000016b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd00000000000000000000000016b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061031f5760003560e01c80638996dded116101a7578063cd3daf9d116100ee578063e63ab1e911610097578063f5b541a611610071578063f5b541a6146106b8578063f742d3ac146106df578063f9ffc8b91461070657600080fd5b8063e63ab1e914610680578063e9fad8ee146106a7578063ebe2b12b146106af57600080fd5b8063d547741f116100c8578063d547741f14610651578063dede87cb14610664578063df136d651461067757600080fd5b8063cd3daf9d1461060f578063d134c13614610617578063d1af0c7d1461063e57600080fd5b8063a694fc3a11610150578063c78de7091161012a578063c78de709146105e0578063c8f33c91146105f3578063cc1a378f146105fc57600080fd5b8063a694fc3a146105b2578063ad2e8c9b146105c5578063c5480a61146105cd57600080fd5b8063a05ad03411610181578063a05ad034146104ac578063a217fddf14610597578063a34e59901461059f57600080fd5b80638996dded146105375780638b8763471461054057806391d148541461056057600080fd5b8063386a95251161026b57806370a08231116102145780637dd160cb116101ee5780637dd160cb1461050957806380faa57d1461051c5780638980f11f1461052457600080fd5b806370a08231146104ac57806372f702f3146104d55780637b0a47ee1461050057600080fd5b80635a93cc8f116102455780635a93cc8f1461047b5780635c975abb1461048e5780636cc8df011461049957600080fd5b8063386a9525146104415780633a740a631461044a5780633d18b9121461047357600080fd5b806318160ddd116102cd5780632e1a7d4d116102a75780632e1a7d4d146104085780632f2ff15d1461041b57806336568abe1461042e57600080fd5b806318160ddd146103d55780631c1f78eb146103dd578063248a9ca3146103e557600080fd5b80630430fb4b116102fe5780630430fb4b146103805780630700037d146103a05780630d822c74146103c057600080fd5b80628cc2621461032457806301a035331461034a57806301ffc9a71461036d575b600080fd5b610337610332366004611e1b565b610719565b6040519081526020015b60405180910390f35b61035d610358366004611e36565b610796565b6040519015158152602001610341565b61035d61037b366004611ec7565b6107da565b61033761038e366004611e1b565b600f6020526000908152604090205481565b6103376103ae366004611e1b565b600b6020526000908152604090205481565b6103d36103ce366004611e82565b61080f565b005b600c54610337565b610337610ac8565b6103376103f3366004611e82565b60009081526020819052604090206001015490565b6103d3610416366004611e82565b610adf565b6103d3610429366004611e9b565b610c76565b6103d361043c366004611e9b565b610ca1565b61033760075481565b610337610458366004611e1b565b6001600160a01b03166000908152600f602052604090205490565b6103d3610d2d565b6103d3610489366004611e36565b610e8c565b60015460ff1661035d565b6103d36104a7366004611e36565b610f45565b6103376104ba366004611e1b565b6001600160a01b03166000908152600d602052604090205490565b6004546104e8906001600160a01b031681565b6040516001600160a01b039091168152602001610341565b61033760065481565b6103d3610517366004611e1b565b611013565b610337611088565b6103d3610532366004611e36565b61109f565b61033760105481565b61033761054e366004611e1b565b600a6020526000908152604090205481565b61035d61056e366004611e9b565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610337600081565b6103d36105ad366004611f0a565b61113f565b6103d36105c0366004611e82565b611197565b600754610337565b6103d36105db366004611e1b565b611504565b6011546104e8906001600160a01b031681565b61033760085481565b6103d361060a366004611e82565b611579565b610337611673565b6103377fb7b0a8b00357f0e4c4a4839008cf90d61a23fe1c55511ea70753532d8bab02c581565b6003546104e8906001600160a01b031681565b6103d361065f366004611e9b565b6116d5565b6012546104e8906001600160a01b031681565b61033760095481565b6103377f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6103d36116fb565b61033760055481565b6103377f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b6103377fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab8981565b6103d3610714366004611e82565b61171e565b6001600160a01b0381166000908152600b6020908152604080832054600a909252822054670de0b6b3a76400009061074f611673565b61075991906120a1565b6001600160a01b0385166000908152600d602052604090205461077c9190612082565b6107869190612060565b6107909190612048565b92915050565b6001600160a01b0382166000908152600d6020908152604080832054848452600e9092528220548082106107cf57600192505050610790565b506000949350505050565b60006001600160e01b03198216637965db0b60e01b148061079057506301ffc9a760e01b6001600160e01b0319831614610790565b6108397fb7b0a8b00357f0e4c4a4839008cf90d61a23fe1c55511ea70753532d8bab02c53361056e565b61085e5760405162461bcd60e51b815260040161085590611ffc565b60405180910390fd5b6000610868611673565b600955610873611088565b6008556001600160a01b038116156108ba5761088e81610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b600c546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b15801561090257600080fd5b505afa158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093a9190611ef1565b61094491906120a1565b905060075483116109bd5760405162461bcd60e51b815260206004820152603460248201527f726571756972656420746861742072657761726420697320677265617465722060448201527f7468616e20726577617264734475726174696f6e0000000000000000000000006064820152608401610855565b60055442106109db576007546109d39084612060565b600655610a1d565b6000426005546109eb91906120a1565b90506000600654826109fd9190612082565b600754909150610a0d8287612048565b610a179190612060565b60065550505b600754610a2a9082612060565b6006541115610a7b5760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f206869676800000000000000006044820152606401610855565b426008819055600754610a8d91612048565b6005556040518381527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a1505050565b6000600754600654610ada9190612082565b905090565b600280541415610b315760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002805533610b3e611673565b600955610b49611088565b6008556001600160a01b03811615610b9057610b6481610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b60008211610be05760405162461bcd60e51b815260206004820152601160248201527f43616e6e6f7420776974686472617720300000000000000000000000000000006044820152606401610855565b81600c54610bee91906120a1565b600c55336000908152600d6020526040902054610c0c9083906120a1565b336000818152600d6020526040902091909155600454610c38916001600160a01b0390911690846117ab565b60405182815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250506001600255565b600082815260208190526040902060010154610c928133611823565b610c9c83836118a1565b505050565b6001600160a01b0381163314610d1f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610855565b610d29828261193f565b5050565b600280541415610d7f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002805533610d8c611673565b600955610d97611088565b6008556001600160a01b03811615610dde57610db281610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b336000908152600b6020908152604080832054600f90925290912054601054610e078282612048565b610e119084612082565b610e1b9190612060565b91508115610e8257336000818152600b6020526040812055600354610e4c916001600160a01b0390911690846117ab565b60405182815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b5050600160025550565b610eb67fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893361056e565b610f145760405162461bcd60e51b815260206004820152602960248201527f6d757374206861766520626f6e757320726f6c6520746f20757365207468697360448201526810333ab731ba34b7b760b91b6064820152608401610855565b6001600160a01b0382166000908152600f602052604081208054839290610f3c908490612048565b90915550505050565b610f6f7fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893361056e565b610fcd5760405162461bcd60e51b815260206004820152602960248201527f6d757374206861766520626f6e757320726f6c6520746f20757365207468697360448201526810333ab731ba34b7b760b91b6064820152608401610855565b6001600160a01b0382166000908152600f602052604090205415610d29576001600160a01b0382166000908152600f602052604081208054839290610f3c9084906120a1565b61103d7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6110595760405162461bcd60e51b815260040161085590611ffc565b6011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000600554421061109a575060055490565b504290565b6110c97f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6110e55760405162461bcd60e51b815260040161085590611ffc565b6110f96001600160a01b03831633836117ab565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28910160405180910390a15050565b6111697f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6111855760405162461bcd60e51b815260040161085590611ffc565b6000918252600e602052604090912055565b6002805414156111e95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610855565b6002805560015460ff16156112405760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610855565b33611249611673565b600955611254611088565b6008556001600160a01b0381161561129b5761126f81610719565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020555b6011546012546001600160a01b0391821691166000826370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156112f657600080fd5b505afa15801561130a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132e9190611ef1565b11806113c0575060006001600160a01b0382166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561138657600080fd5b505afa15801561139a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113be9190611ef1565b115b61141b5760405162461bcd60e51b815260206004820152602660248201527f796f75206e65656420746f206f776e2061207370656369616c204e465420746f604482015265207374616b6560d01b6064820152608401610855565b6000841161146b5760405162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b6520300000000000000000000000000000000000006044820152606401610855565b83600c546114799190612048565b600c55336000908152600d6020526040902054611497908590612048565b336000818152600d60205260409020919091556004546114c4916001600160a01b039091169030876119be565b60405184815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a2505060016002555050565b61152e7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b61154a5760405162461bcd60e51b815260040161085590611ffc565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6115a37f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361056e565b6115bf5760405162461bcd60e51b815260040161085590611ffc565b6005544211611638576040805162461bcd60e51b81526020600482015260248101919091527f50726576696f757320706572696f64206d75737420636f6d706c65746520626560448201527f666f7265206368616e67696e6720666f7220746865206e657720706572696f646064820152608401610855565b60078190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d39060200160405180910390a150565b6000600c5460001415611687575060095490565b600c54600654600854611698611088565b6116a291906120a1565b6116ac9190612082565b6116be90670de0b6b3a7640000612082565b6116c89190612060565b600954610ada9190612048565b6000828152602081905260409020600101546116f18133611823565b610c9c838361193f565b336000908152600d602052604090205461171490610adf565b61171c610d2d565b565b6117487fd99a276d3c337fbea4d37315f4ad1f85ce840bccf4423ca46176bd392434ab893361056e565b6117a65760405162461bcd60e51b815260206004820152602960248201527f6d757374206861766520626f6e757320726f6c6520746f20757365207468697360448201526810333ab731ba34b7b760b91b6064820152608401610855565b601055565b6040516001600160a01b038316602482015260448101829052610c9c90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909316929092179091526119fc565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610d295761185f816001600160a01b03166014611ace565b61186a836020611ace565b60405160200161187b929190611f48565b60408051601f198184030181529082905262461bcd60e51b825261085591600401611fc9565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610d29576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556118fb3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610d29576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040516001600160a01b03808516602483015283166044820152606481018290526119f69085906323b872dd60e01b906084016117d7565b50505050565b6000611a51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c7e9092919063ffffffff16565b805190915015610c9c5780806020019051810190611a6f9190611e60565b610c9c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610855565b60606000611add836002612082565b611ae8906002612048565b67ffffffffffffffff811115611b0057611b00612127565b6040519080825280601f01601f191660200182016040528015611b2a576020820181803683370190505b509050600360fc1b81600081518110611b4557611b45612111565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611b7457611b74612111565b60200101906001600160f81b031916908160001a9053506000611b98846002612082565b611ba3906001612048565b90505b6001811115611c28577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611be457611be4612111565b1a60f81b828281518110611bfa57611bfa612111565b60200101906001600160f81b031916908160001a90535060049490941c93611c21816120e4565b9050611ba6565b508315611c775760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610855565b9392505050565b6060611c8d8484600085611c95565b949350505050565b606082471015611cf65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610855565b6001600160a01b0385163b611d4d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610855565b600080866001600160a01b03168587604051611d699190611f2c565b60006040518083038185875af1925050503d8060008114611da6576040519150601f19603f3d011682016040523d82523d6000602084013e611dab565b606091505b5091509150611dbb828286611dc6565b979650505050505050565b60608315611dd5575081611c77565b825115611de55782518084602001fd5b8160405162461bcd60e51b81526004016108559190611fc9565b80356001600160a01b0381168114611e1657600080fd5b919050565b600060208284031215611e2d57600080fd5b611c7782611dff565b60008060408385031215611e4957600080fd5b611e5283611dff565b946020939093013593505050565b600060208284031215611e7257600080fd5b81518015158114611c7757600080fd5b600060208284031215611e9457600080fd5b5035919050565b60008060408385031215611eae57600080fd5b82359150611ebe60208401611dff565b90509250929050565b600060208284031215611ed957600080fd5b81356001600160e01b031981168114611c7757600080fd5b600060208284031215611f0357600080fd5b5051919050565b60008060408385031215611f1d57600080fd5b50508035926020909101359150565b60008251611f3e8184602087016120b8565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611f808160178501602088016120b8565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611fbd8160288401602088016120b8565b01602801949350505050565b6020815260008251806020840152611fe88160408501602087016120b8565b601f01601f19169190910160400192915050565b6020808252602c908201527f6d7573742068617665206f70657261746f7220726f6c6520746f20757365207460408201526b3434b990333ab731ba34b7b760a11b606082015260800190565b6000821982111561205b5761205b6120fb565b500190565b60008261207d57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561209c5761209c6120fb565b500290565b6000828210156120b3576120b36120fb565b500390565b60005b838110156120d35781810151838201526020016120bb565b838111156119f65750506000910152565b6000816120f3576120f36120fb565b506000190190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212207b19cd2b9437c8aaa047e0646d21bedeb00025bef352d5702ac6dbd25939cb8564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000016b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd00000000000000000000000016b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x16B3E050e9e2f0Ac4f1BEA1b3E4fdc43d7f062Dd
Arg [1] : _stakingToken (address): 0x16B3E050e9e2f0Ac4f1BEA1b3E4fdc43d7f062Dd
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000016b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd
Arg [1] : 00000000000000000000000016b3e050e9e2f0ac4f1bea1b3e4fdc43d7f062dd
Deployed Bytecode Sourcemap
36310:10077:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39288:219;;;;;;:::i;:::-;;:::i;:::-;;;4653:25:1;;;4641:2;4626:18;39288:219:0;;;;;;;;43838:269;;;;;;:::i;:::-;;:::i;:::-;;;4480:14:1;;4473:22;4455:41;;4443:2;4428:18;43838:269:0;4315:187:1;31047:204:0;;;;;;:::i;:::-;;:::i;37013:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;36812;;;;;;:::i;:::-;;;;;;;;;;;;;;41531:1328;;;;;;:::i;:::-;;:::i;:::-;;38474:93;38547:12;;38474:93;;39515:118;;;:::i;32474:131::-;;;;;;:::i;:::-;32548:7;32575:12;;;;;;;;;;:22;;;;32474:131;40505:363;;;;;;:::i;:::-;;:::i;32867:147::-;;;;;;:::i;:::-;;:::i;33915:218::-;;;;;;:::i;:::-;;:::i;36622:39::-;;;;;;38858:110;;;;;;:::i;:::-;-1:-1:-1;;;;;38943:16:0;38916:7;38943:16;;;:7;:16;;;;;;;38858:110;40880:480;;;:::i;45121:230::-;;;;;;:::i;:::-;;:::i;24229:86::-;24300:7;;;;24229:86;;45359:305;;;;;;:::i;:::-;;:::i;38575:112::-;;;;;;:::i;:::-;-1:-1:-1;;;;;38661:18:0;38634:7;38661:18;;;:9;:18;;;;;;;38575:112;36515:26;;;;;-1:-1:-1;;;;;36515:26:0;;;;;;-1:-1:-1;;;;;3543:55:1;;;3525:74;;3513:2;3498:18;36515:26:0;3379:226:1;36586:29:0;;;;;;44162:306;;;;;;:::i;:::-;;:::i;38695:155::-;;;:::i;42974:228::-;;;;;;:::i;:::-;;:::i;37064:41::-;;;;;;36748:57;;;;;;:::i;:::-;;;;;;;;;;;;;;31343:147;;;;;;:::i;:::-;31429:4;31453:12;;;;;;;;;;;-1:-1:-1;;;;;31453:29:0;;;;;;;;;;;;;;;31343:147;30434:49;;30479:4;30434:49;;43558:115;;;;;;:::i;:::-;;:::i;39807:690::-;;;;;;:::i;:::-;;:::i;39641:96::-;39714:15;;39641:96;;44476:351;;;;;;:::i;:::-;;:::i;37453:26::-;;;;;-1:-1:-1;;;;;37453:26:0;;;36668:29;;;;;;43210:339;;;;;;:::i;:::-;;:::i;38978:302::-;;;:::i;37284:74::-;;37328:30;37284:74;;36482:26;;;;;-1:-1:-1;;;;;36482:26:0;;;33259:149;;;;;;:::i;:::-;;:::i;37488:33::-;;;;;-1:-1:-1;;;;;37488:33:0;;;36704:35;;;;;;37142:62;;37180:24;37142:62;;41368:99;;;:::i;36548:31::-;;;;;;37211:66;;37251:26;37211:66;;37367:60;;37404:23;37367:60;;44871:242;;;;;;:::i;:::-;;:::i;39288:219::-;-1:-1:-1;;;;;39483:16:0;;39342:7;39483:16;;;:7;:16;;;;;;;;;39430:22;:31;;;;;;39466:4;;39411:16;:14;:16::i;:::-;:50;;;;:::i;:::-;-1:-1:-1;;;;;39380:18:0;;;;;;:9;:18;;;;;;:82;;;;:::i;:::-;39379:91;;;;:::i;:::-;39378:121;;;;:::i;:::-;39362:137;39288:219;-1:-1:-1;;39288:219:0:o;43838:269::-;-1:-1:-1;;;;;43780:18:0;;43906:4;43780:18;;;:9;:18;;;;;;;;;43992:12;;;:6;:12;;;;;;44019:19;;;44015:62;;44061:4;44054:11;;;;;;44015:62;-1:-1:-1;44094:5:0;;43838:269;-1:-1:-1;;;;43838:269:0:o;31047:204::-;31132:4;-1:-1:-1;;;;;;31156:47:0;;-1:-1:-1;;;31156:47:0;;:87;;-1:-1:-1;;;;;;;;;;20025:40:0;;;31207:36;19916:157;41531:1328;38293:40;37328:30;22963:10;31343:147;:::i;38293:40::-;38271:134;;;;-1:-1:-1;;;38271:134:0;;;;;;;:::i;:::-;;;;;;;;;41620:1:::1;45756:16;:14;:16::i;:::-;45733:20;:39:::0;45800:26:::1;:24;:26::i;:::-;45783:14;:43:::0;-1:-1:-1;;;;;45841:21:0;::::1;::::0;45837:157:::1;;45898:15;45905:7;45898:6;:15::i;:::-;-1:-1:-1::0;;;;;45879:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;45962:20:::1;::::0;45928:22:::1;:31:::0;;;;;;:54;45837:157:::1;41690:12:::2;::::0;41650::::2;::::0;:37:::2;::::0;-1:-1:-1;;;41650:37:0;;41681:4:::2;41650:37;::::0;::::2;3525:74:1::0;41635:12:0::2;::::0;41690;-1:-1:-1;;;;;41650:12:0::2;::::0;:22:::2;::::0;3498:18:1;;41650:37:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;41635:67;;41732:15;;41723:6;:24;41715:88;;;::::0;-1:-1:-1;;;41715:88:0;;5885:2:1;41715:88:0::2;::::0;::::2;5867:21:1::0;5924:2;5904:18;;;5897:30;5963:34;5943:18;;;5936:62;6034:22;6014:18;;;6007:50;6074:19;;41715:88:0::2;5683:416:1::0;41715:88:0::2;41839:12;;41820:15;:31;41816:313;;41891:15;::::0;41881:26:::2;::::0;:6;:26:::2;:::i;:::-;41868:10;:39:::0;41816:313:::2;;;41940:17;41976:15;41960:12;;:32;;;;:::i;:::-;41940:52;;42007:16;42039:10;;42026:9;:24;;;;:::i;:::-;42101:15;::::0;42007:43;;-1:-1:-1;42079:17:0::2;42007:43:::0;42079:6;:17:::2;:::i;:::-;42078:39;;;;:::i;:::-;42065:10;:52:::0;-1:-1:-1;;41816:313:0::2;42665:15;::::0;42654:27:::2;::::0;:7;:27:::2;:::i;:::-;42640:10;;:41;;42632:78;;;::::0;-1:-1:-1;;;42632:78:0;;9003:2:1;42632:78:0::2;::::0;::::2;8985:21:1::0;9042:2;9022:18;;;9015:30;9081:26;9061:18;;;9054:54;9125:18;;42632:78:0::2;8801:348:1::0;42632:78:0::2;42740:15;42723:14;:32:::0;;;42800:15:::2;::::0;42781:35:::2;::::0;::::2;:::i;:::-;42766:12;:50:::0;42832:19:::2;::::0;4653:25:1;;;42832:19:0::2;::::0;4641:2:1;4626:18;42832:19:0::2;;;;;;;41624:1235;38416:1:::1;41531:1328:::0;:::o;39515:118::-;39570:7;39610:15;;39597:10;;:28;;;;:::i;:::-;39590:35;;39515:118;:::o;40505:363::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;10125:2:1;2402:63:0;;;10107:21:1;10164:2;10144:18;;;10137:30;10203:33;10183:18;;;10176:61;10254:18;;2402:63:0;9923:355:1;2402:63:0;1812:1;2543:18;;22963:10;45756:16:::1;:14;:16::i;:::-;45733:20;:39:::0;45800:26:::1;:24;:26::i;:::-;45783:14;:43:::0;-1:-1:-1;;;;;45841:21:0;::::1;::::0;45837:157:::1;;45898:15;45905:7;45898:6;:15::i;:::-;-1:-1:-1::0;;;;;45879:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;45962:20:::1;::::0;45928:22:::1;:31:::0;;;;;;:54;45837:157:::1;40614:1:::2;40605:6;:10;40597:40;;;::::0;-1:-1:-1;;;40597:40:0;;8224:2:1;40597:40:0::2;::::0;::::2;8206:21:1::0;8263:2;8243:18;;;8236:30;8302:19;8282:18;;;8275:47;8339:18;;40597:40:0::2;8022:341:1::0;40597:40:0::2;40678:6;40663:12;;:21;;;;:::i;:::-;40648:12;:36:::0;22963:10;40721:23:::2;::::0;;;:9:::2;:23;::::0;;;;;:34:::2;::::0;40748:6;;40721:34:::2;:::i;:::-;22963:10:::0;40695:23:::2;::::0;;;:9:::2;:23;::::0;;;;:60;;;;40766:12:::2;::::0;:47:::2;::::0;-1:-1:-1;;;;;40766:12:0;;::::2;::::0;40806:6;40766:25:::2;:47::i;:::-;40829:31;::::0;4653:25:1;;;22963:10:0;;40829:31:::2;::::0;4641:2:1;4626:18;40829:31:0::2;;;;;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;40505:363::o;32867:147::-;32548:7;32575:12;;;;;;;;;;:22;;;30925:30;30936:4;22963:10;30925;:30::i;:::-;32981:25:::1;32992:4;32998:7;32981:10;:25::i;:::-;32867:147:::0;;;:::o;33915:218::-;-1:-1:-1;;;;;34011:23:0;;22963:10;34011:23;34003:83;;;;-1:-1:-1;;;34003:83:0;;10892:2:1;34003:83:0;;;10874:21:1;10931:2;10911:18;;;10904:30;10970:34;10950:18;;;10943:62;11041:17;11021:18;;;11014:45;11076:19;;34003:83:0;10690:411:1;34003:83:0;34099:26;34111:4;34117:7;34099:11;:26::i;:::-;33915:218;;:::o;40880:480::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;10125:2:1;2402:63:0;;;10107:21:1;10164:2;10144:18;;;10137:30;10203:33;10183:18;;;10176:61;10254:18;;2402:63:0;9923:355:1;2402:63:0;1812:1;2543:18;;22963:10;45756:16:::1;:14;:16::i;:::-;45733:20;:39:::0;45800:26:::1;:24;:26::i;:::-;45783:14;:43:::0;-1:-1:-1;;;;;45841:21:0;::::1;::::0;45837:157:::1;;45898:15;45905:7;45898:6;:15::i;:::-;-1:-1:-1::0;;;;;45879:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:34;;;;45962:20:::1;::::0;45928:22:::1;:31:::0;;;;;;:54;45837:157:::1;22963:10:::0;40959:14:::2;40976:21:::0;;;:7:::2;:21;::::0;;;;;;;;41049:7:::2;:21:::0;;;;;;;41131:17:::2;::::0;41101:25:::2;41049:21:::0;41131:17;41101:25:::2;:::i;:::-;41091:36;::::0;:6;:36:::2;:::i;:::-;41090:58;;;;:::i;:::-;41081:67:::0;-1:-1:-1;41175:10:0;;41171:182:::2;;22963:10:::0;41226:1:::2;41202:21:::0;;;:7:::2;:21;::::0;;;;:25;41242:12:::2;::::0;:47:::2;::::0;-1:-1:-1;;;;;41242:12:0;;::::2;::::0;41282:6;41242:25:::2;:47::i;:::-;41309:32;::::0;4653:25:1;;;22963:10:0;;41309:32:::2;::::0;4641:2:1;4626:18;41309:32:0::2;;;;;;;41171:182;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;40880:480:0:o;45121:230::-;45208:33;37404:23;22963:10;31343:147;:::i;45208:33::-;45186:124;;;;-1:-1:-1;;;45186:124:0;;7062:2:1;45186:124:0;;;7044:21:1;7101:2;7081:18;;;7074:30;7140:34;7120:18;;;7113:62;-1:-1:-1;;;7191:18:1;;;7184:39;7240:19;;45186:124:0;6860:405:1;45186:124:0;-1:-1:-1;;;;;45321:13:0;;;;;;:7;:13;;;;;:22;;45338:5;;45321:13;:22;;45338:5;;45321:22;:::i;:::-;;;;-1:-1:-1;;;;45121:230:0:o;45359:305::-;45449:33;37404:23;22963:10;31343:147;:::i;45449:33::-;45427:124;;;;-1:-1:-1;;;45427:124:0;;7062:2:1;45427:124:0;;;7044:21:1;7101:2;7081:18;;;7074:30;7140:34;7120:18;;;7113:62;-1:-1:-1;;;7191:18:1;;;7184:39;7240:19;;45427:124:0;6860:405:1;45427:124:0;-1:-1:-1;;;;;45575:13:0;;;;;;:7;:13;;;;;;:18;45572:71;;-1:-1:-1;;;;;45609:13:0;;;;;;:7;:13;;;;;:22;;45626:5;;45609:13;:22;;45626:5;;45609:22;:::i;44162:306::-;44274:36;37251:26;22963:10;31343:147;:::i;44274:36::-;44252:130;;;;-1:-1:-1;;;44252:130:0;;;;;;;:::i;:::-;44393:11;:21;;-1:-1:-1;;44393:21:0;-1:-1:-1;;;;;44393:21:0;;;;;;;;;;44162:306::o;38695:155::-;38752:7;38797:12;;38779:15;:30;:63;;-1:-1:-1;38830:12:0;;;39515:118::o;38779:63::-;-1:-1:-1;38812:15:0;;38695:155::o;42974:228::-;38096:36;37251:26;22963:10;31343:147;:::i;38096:36::-;38074:130;;;;-1:-1:-1;;;38074:130:0;;;;;;;:::i;:::-;43082:60:::1;-1:-1:-1::0;;;;;43082:33:0;::::1;22963:10:::0;43130:11;43082:33:::1;:60::i;:::-;43158:36;::::0;;-1:-1:-1;;;;;4205:55:1;;4187:74;;4292:2;4277:18;;4270:34;;;43158:36:0::1;::::0;4160:18:1;43158:36:0::1;;;;;;;42974:228:::0;;:::o;43558:115::-;38096:36;37251:26;22963:10;31343:147;:::i;38096:36::-;38074:130;;;;-1:-1:-1;;;38074:130:0;;;;;;;:::i;:::-;43641:12:::1;::::0;;;:6:::1;:12;::::0;;;;;:24;43558:115::o;39807:690::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;10125:2:1;2402:63:0;;;10107:21:1;10164:2;10144:18;;;10137:30;10203:33;10183:18;;;10176:61;10254:18;;2402:63:0;9923:355:1;2402:63:0;1812:1;2543:18;;24300:7;;;;24554:9:::1;24546:38;;;::::0;-1:-1:-1;;;24546:38:0;;7879:2:1;24546:38:0::1;::::0;::::1;7861:21:1::0;7918:2;7898:18;;;7891:30;7957:18;7937;;;7930:46;7993:18;;24546:38:0::1;7677:340:1::0;24546:38:0::1;22963:10:::0;45756:16:::2;:14;:16::i;:::-;45733:20;:39:::0;45800:26:::2;:24;:26::i;:::-;45783:14;:43:::0;-1:-1:-1;;;;;45841:21:0;::::2;::::0;45837:157:::2;;45898:15;45905:7;45898:6;:15::i;:::-;-1:-1:-1::0;;;;;45879:16:0;::::2;;::::0;;;:7:::2;:16;::::0;;;;;;;:34;;;;45962:20:::2;::::0;45928:22:::2;:31:::0;;;;;;:54;45837:157:::2;39939:11:::3;::::0;40012:18:::3;::::0;-1:-1:-1;;;;;39939:11:0;;::::3;::::0;40012:18:::3;39914:17;39939:11:::0;40050:22:::3;22963:10:::0;40050:36:::3;::::0;-1:-1:-1;;;;;;40050:36:0::3;::::0;;;;;;-1:-1:-1;;;;;3543:55:1;;;40050:36:0::3;::::0;::::3;3525:74:1::0;3498:18;;40050:36:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;:109;;;-1:-1:-1::0;40158:1:0::3;-1:-1:-1::0;;;;;40104:37:0;::::3;;22963:10:::0;40104:51:::3;::::0;-1:-1:-1;;;;;;40104:51:0::3;::::0;;;;;;-1:-1:-1;;;;;3543:55:1;;;40104:51:0::3;::::0;::::3;3525:74:1::0;3498:18;;40104:51:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;40050:109;40042:160;;;::::0;-1:-1:-1;;;40042:160:0;;10485:2:1;40042:160:0::3;::::0;::::3;10467:21:1::0;10524:2;10504:18;;;10497:30;10563:34;10543:18;;;10536:62;-1:-1:-1;;;10614:18:1;;;10607:36;10660:19;;40042:160:0::3;10283:402:1::0;40042:160:0::3;40230:1;40221:6;:10;40213:37;;;::::0;-1:-1:-1;;;40213:37:0;;6306:2:1;40213:37:0::3;::::0;::::3;6288:21:1::0;6345:2;6325:18;;;6318:30;6384:16;6364:18;;;6357:44;6418:18;;40213:37:0::3;6104:338:1::0;40213:37:0::3;40291:6;40276:12;;:21;;;;:::i;:::-;40261:12;:36:::0;22963:10;40334:23:::3;::::0;;;:9:::3;:23;::::0;;;;;:34:::3;::::0;40361:6;;40334:34:::3;:::i;:::-;22963:10:::0;40308:23:::3;::::0;;;:9:::3;:23;::::0;;;;:60;;;;40379:12:::3;::::0;:66:::3;::::0;-1:-1:-1;;;;;40379:12:0;;::::3;::::0;40431:4:::3;40438:6:::0;40379:29:::3;:66::i;:::-;40461:28;::::0;4653:25:1;;;22963:10:0;;40461:28:::3;::::0;4641:2:1;4626:18;40461:28:0::3;;;;;;;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;;39807:690:0:o;44476:351::-;44601:36;37251:26;22963:10;31343:147;:::i;44601:36::-;44579:130;;;;-1:-1:-1;;;44579:130:0;;;;;;;:::i;:::-;44720:18;:31;;-1:-1:-1;;44720:31:0;-1:-1:-1;;;;;44720:31:0;;;;;;;;;;44476:351::o;43210:339::-;38096:36;37251:26;22963:10;31343:147;:::i;38096:36::-;38074:130;;;;-1:-1:-1;;;38074:130:0;;;;;;;:::i;:::-;43337:12:::1;;43319:15;:30;43297:144;;;::::0;;-1:-1:-1;;;43297:144:0;;8570:2:1;43297:144:0::1;::::0;::::1;8552:21:1::0;8589:18;;;8582:30;;;;8648:34;8628:18;;;8621:62;8719:34;8699:18;;;8692:62;8771:19;;43297:144:0::1;8368:428:1::0;43297:144:0::1;43452:15;:34:::0;;;43502:39:::1;::::0;4653:25:1;;;43502:39:0::1;::::0;4641:2:1;4626:18;43502:39:0::1;;;;;;;43210:339:::0;:::o;38978:302::-;39025:7;39049:12;;39065:1;39049:17;39045:77;;;-1:-1:-1;39090:20:0;;;38978:302::o;39045:77::-;39259:12;;39238:10;;39220:14;;39191:26;:24;:26::i;:::-;:43;;;;:::i;:::-;39190:58;;;;:::i;:::-;:65;;39251:4;39190:65;:::i;:::-;39189:82;;;;:::i;:::-;39152:20;;:120;;;;:::i;33259:149::-;32548:7;32575:12;;;;;;;;;;:22;;;30925:30;30936:4;22963:10;30925;:30::i;:::-;33374:26:::1;33386:4;33392:7;33374:11;:26::i;41368:99::-:0;22963:10;41413:23;;;;:9;:23;;;;;;41404:33;;:8;:33::i;:::-;41448:11;:9;:11::i;:::-;41368:99::o;44871:242::-;44961:33;37404:23;22963:10;31343:147;:::i;44961:33::-;44939:124;;;;-1:-1:-1;;;44939:124:0;;7062:2:1;44939:124:0;;;7044:21:1;7101:2;7081:18;;;7074:30;7140:34;7120:18;;;7113:62;-1:-1:-1;;;7191:18:1;;;7184:39;7240:19;;44939:124:0;6860:405:1;44939:124:0;45074:17;:31;44871:242::o;14838:211::-;14982:58;;-1:-1:-1;;;;;4205:55:1;;14982:58:0;;;4187:74:1;4277:18;;;4270:34;;;14955:86:0;;14975:5;;-1:-1:-1;;;15005:23:0;4160:18:1;;14982:58:0;;;;-1:-1:-1;;14982:58:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14982:58:0;;;;;;;;;;14955:19;:86::i;31780:505::-;31429:4;31453:12;;;;;;;;;;;-1:-1:-1;;;;;31453:29:0;;;;;;;;;;;;31864:414;;32057:41;32085:7;-1:-1:-1;;;;;32057:41:0;32095:2;32057:19;:41::i;:::-;32171:38;32199:4;32206:2;32171:19;:38::i;:::-;31962:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31962:270:0;;;;;;;;;;-1:-1:-1;;;31908:358:0;;;;;;;:::i;35416:238::-;31429:4;31453:12;;;;;;;;;;;-1:-1:-1;;;;;31453:29:0;;;;;;;;;;;;35495:152;;35539:6;:12;;;;;;;;;;;-1:-1:-1;;;;;35539:29:0;;;;;;;;;:36;;-1:-1:-1;;35539:36:0;35571:4;35539:36;;;35622:12;22963:10;;22883:98;35622:12;-1:-1:-1;;;;;35595:40:0;35613:7;-1:-1:-1;;;;;35595:40:0;35607:4;35595:40;;;;;;;;;;35416:238;;:::o;35786:239::-;31429:4;31453:12;;;;;;;;;;;-1:-1:-1;;;;;31453:29:0;;;;;;;;;;;;35866:152;;;35941:5;35909:12;;;;;;;;;;;-1:-1:-1;;;;;35909:29:0;;;;;;;;;;:37;;-1:-1:-1;;35909:37:0;;;35966:40;22963:10;;35909:12;;35966:40;;35941:5;35966:40;35786:239;;:::o;15057:248::-;15228:68;;-1:-1:-1;;;;;3891:15:1;;;15228:68:0;;;3873:34:1;3943:15;;3923:18;;;3916:43;3975:18;;;3968:34;;;15201:96:0;;15221:5;;-1:-1:-1;;;15251:27:0;3785:18:1;;15228:68:0;3610:398:1;15201:96:0;15057:248;;;;:::o;17411:716::-;17835:23;17861:69;17889:4;17861:69;;;;;;;;;;;;;;;;;17869:5;-1:-1:-1;;;;;17861:27:0;;;:69;;;;;:::i;:::-;17945:17;;17835:95;;-1:-1:-1;17945:21:0;17941:179;;18042:10;18031:30;;;;;;;;;;;;:::i;:::-;18023:85;;;;-1:-1:-1;;;18023:85:0;;9714:2:1;18023:85:0;;;9696:21:1;9753:2;9733:18;;;9726:30;9792:34;9772:18;;;9765:62;-1:-1:-1;;;9843:18:1;;;9836:40;9893:19;;18023:85:0;9512:406:1;21746:451:0;21821:13;21847:19;21879:10;21883:6;21879:1;:10;:::i;:::-;:14;;21892:1;21879:14;:::i;:::-;21869:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21869:25:0;;21847:47;;-1:-1:-1;;;21905:6:0;21912:1;21905:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;21905:15:0;;;;;;;;;-1:-1:-1;;;21931:6:0;21938:1;21931:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;21931:15:0;;;;;;;;-1:-1:-1;21962:9:0;21974:10;21978:6;21974:1;:10;:::i;:::-;:14;;21987:1;21974:14;:::i;:::-;21962:26;;21957:135;21994:1;21990;:5;21957:135;;;22029:12;22042:5;22050:3;22042:11;22029:25;;;;;;;:::i;:::-;;;;22017:6;22024:1;22017:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;22017:37:0;;;;;;;;-1:-1:-1;22079:1:0;22069:11;;;;;21997:3;;;:::i;:::-;;;21957:135;;;-1:-1:-1;22110:10:0;;22102:55;;;;-1:-1:-1;;;22102:55:0;;5524:2:1;22102:55:0;;;5506:21:1;;;5543:18;;;5536:30;5602:34;5582:18;;;5575:62;5654:18;;22102:55:0;5322:356:1;22102:55:0;22182:6;21746:451;-1:-1:-1;;;21746:451:0:o;6737:229::-;6874:12;6906:52;6928:6;6936:4;6942:1;6945:12;6906:21;:52::i;:::-;6899:59;6737:229;-1:-1:-1;;;;6737:229:0:o;7857:510::-;8027:12;8085:5;8060:21;:30;;8052:81;;;;-1:-1:-1;;;8052:81:0;;7472:2:1;8052:81:0;;;7454:21:1;7511:2;7491:18;;;7484:30;7550:34;7530:18;;;7523:62;-1:-1:-1;;;7601:18:1;;;7594:36;7647:19;;8052:81:0;7270:402:1;8052:81:0;-1:-1:-1;;;;;4287:19:0;;;8144:60;;;;-1:-1:-1;;;8144:60:0;;9356:2:1;8144:60:0;;;9338:21:1;9395:2;9375:18;;;9368:30;9434:31;9414:18;;;9407:59;9483:18;;8144:60:0;9154:353:1;8144:60:0;8218:12;8232:23;8259:6;-1:-1:-1;;;;;8259:11:0;8278:5;8285:4;8259:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8217:73;;;;8308:51;8325:7;8334:10;8346:12;8308:16;:51::i;:::-;8301:58;7857:510;-1:-1:-1;;;;;;;7857:510:0:o;10543:712::-;10693:12;10722:7;10718:530;;;-1:-1:-1;10753:10:0;10746:17;;10718:530;10867:17;;:21;10863:374;;11065:10;11059:17;11126:15;11113:10;11109:2;11105:19;11098:44;10863:374;11208:12;11201:20;;-1:-1:-1;;;11201:20:0;;;;;;;;:::i;14:196:1:-;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:254::-;474:6;482;535:2;523:9;514:7;510:23;506:32;503:52;;;551:1;548;541:12;503:52;574:29;593:9;574:29;:::i;:::-;564:39;650:2;635:18;;;;622:32;;-1:-1:-1;;;406:254:1:o;665:277::-;732:6;785:2;773:9;764:7;760:23;756:32;753:52;;;801:1;798;791:12;753:52;833:9;827:16;886:5;879:13;872:21;865:5;862:32;852:60;;908:1;905;898:12;947:180;1006:6;1059:2;1047:9;1038:7;1034:23;1030:32;1027:52;;;1075:1;1072;1065:12;1027:52;-1:-1:-1;1098:23:1;;947:180;-1:-1:-1;947:180:1:o;1132:254::-;1200:6;1208;1261:2;1249:9;1240:7;1236:23;1232:32;1229:52;;;1277:1;1274;1267:12;1229:52;1313:9;1300:23;1290:33;;1342:38;1376:2;1365:9;1361:18;1342:38;:::i;:::-;1332:48;;1132:254;;;;;:::o;1391:286::-;1449:6;1502:2;1490:9;1481:7;1477:23;1473:32;1470:52;;;1518:1;1515;1508:12;1470:52;1544:23;;-1:-1:-1;;;;;;1596:32:1;;1586:43;;1576:71;;1643:1;1640;1633:12;1867:184;1937:6;1990:2;1978:9;1969:7;1965:23;1961:32;1958:52;;;2006:1;2003;1996:12;1958:52;-1:-1:-1;2029:16:1;;1867:184;-1:-1:-1;1867:184:1:o;2056:248::-;2124:6;2132;2185:2;2173:9;2164:7;2160:23;2156:32;2153:52;;;2201:1;2198;2191:12;2153:52;-1:-1:-1;;2224:23:1;;;2294:2;2279:18;;;2266:32;;-1:-1:-1;2056:248:1:o;2309:274::-;2438:3;2476:6;2470:13;2492:53;2538:6;2533:3;2526:4;2518:6;2514:17;2492:53;:::i;:::-;2561:16;;;;;2309:274;-1:-1:-1;;2309:274:1:o;2588:786::-;2999:25;2994:3;2987:38;2969:3;3054:6;3048:13;3070:62;3125:6;3120:2;3115:3;3111:12;3104:4;3096:6;3092:17;3070:62;:::i;:::-;3196:19;3191:2;3151:16;;;3183:11;;;3176:40;3241:13;;3263:63;3241:13;3312:2;3304:11;;3297:4;3285:17;;3263:63;:::i;:::-;3346:17;3365:2;3342:26;;2588:786;-1:-1:-1;;;;2588:786:1:o;4934:383::-;5083:2;5072:9;5065:21;5046:4;5115:6;5109:13;5158:6;5153:2;5142:9;5138:18;5131:34;5174:66;5233:6;5228:2;5217:9;5213:18;5208:2;5200:6;5196:15;5174:66;:::i;:::-;5301:2;5280:15;-1:-1:-1;;5276:29:1;5261:45;;;;5308:2;5257:54;;4934:383;-1:-1:-1;;4934:383:1:o;6447:408::-;6649:2;6631:21;;;6688:2;6668:18;;;6661:30;6727:34;6722:2;6707:18;;6700:62;-1:-1:-1;;;6793:2:1;6778:18;;6771:42;6845:3;6830:19;;6447:408::o;11288:128::-;11328:3;11359:1;11355:6;11352:1;11349:13;11346:39;;;11365:18;;:::i;:::-;-1:-1:-1;11401:9:1;;11288:128::o;11421:217::-;11461:1;11487;11477:132;;11531:10;11526:3;11522:20;11519:1;11512:31;11566:4;11563:1;11556:15;11594:4;11591:1;11584:15;11477:132;-1:-1:-1;11623:9:1;;11421:217::o;11643:168::-;11683:7;11749:1;11745;11741:6;11737:14;11734:1;11731:21;11726:1;11719:9;11712:17;11708:45;11705:71;;;11756:18;;:::i;:::-;-1:-1:-1;11796:9:1;;11643:168::o;11816:125::-;11856:4;11884:1;11881;11878:8;11875:34;;;11889:18;;:::i;:::-;-1:-1:-1;11926:9:1;;11816:125::o;11946:258::-;12018:1;12028:113;12042:6;12039:1;12036:13;12028:113;;;12118:11;;;12112:18;12099:11;;;12092:39;12064:2;12057:10;12028:113;;;12159:6;12156:1;12153:13;12150:48;;;-1:-1:-1;;12194:1:1;12176:16;;12169:27;11946:258::o;12209:136::-;12248:3;12276:5;12266:39;;12285:18;;:::i;:::-;-1:-1:-1;;;12321:18:1;;12209:136::o;12350:127::-;12411:10;12406:3;12402:20;12399:1;12392:31;12442:4;12439:1;12432:15;12466:4;12463:1;12456:15;12482:127;12543:10;12538:3;12534:20;12531:1;12524:31;12574:4;12571:1;12564:15;12598:4;12595:1;12588:15;12614:127;12675:10;12670:3;12666:20;12663:1;12656:31;12706:4;12703:1;12696:15;12730:4;12727:1;12720:15
Swarm Source
ipfs://7b19cd2b9437c8aaa047e0646d21bedeb00025bef352d5702ac6dbd25939cb85
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.006279 | 2,103,047.6079 | $13,205.5 |
Loading...
Loading
Loading...
Loading
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.