Overview
S Balance
352.883979307907343675 S
S Value
-More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Grant Role | 140243 | 12 days ago | IN | 0 S | 0.00005718 | ||||
Grant Role | 140149 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 140113 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 140091 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 140067 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 140043 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 140014 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 139908 | 12 days ago | IN | 0 S | 0.0000572 | ||||
Grant Role | 139813 | 12 days ago | IN | 0 S | 0.00005677 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
650428 | 4 mins ago | 0.25449375 S | ||||
649807 | 14 mins ago | 0.53200443 S | ||||
648846 | 24 mins ago | 1.73501516 S | ||||
648256 | 34 mins ago | 0.23072998 S | ||||
647640 | 44 mins ago | 0.27023365 S | ||||
646995 | 54 mins ago | 0.58364156 S | ||||
646309 | 1 hr ago | 0.77702278 S | ||||
645625 | 1 hr ago | 0.46061683 S | ||||
644921 | 1 hr ago | 0.26809037 S | ||||
643730 | 1 hr ago | 0.33471734 S | ||||
642601 | 1 hr ago | 0.41384214 S | ||||
641910 | 1 hr ago | 0.64892677 S | ||||
641172 | 2 hrs ago | 0.45347933 S | ||||
640457 | 2 hrs ago | 0.7453249 S | ||||
639722 | 2 hrs ago | 0.6517 S | ||||
639043 | 2 hrs ago | 0.79931132 S | ||||
638408 | 2 hrs ago | 0.64474026 S | ||||
637809 | 2 hrs ago | 0.96874607 S | ||||
636885 | 3 hrs ago | 0.37774488 S | ||||
635459 | 3 hrs ago | 0.51280847 S | ||||
634567 | 3 hrs ago | 1.14233816 S | ||||
633679 | 3 hrs ago | 0.47264062 S | ||||
632786 | 3 hrs ago | 3.27036577 S | ||||
631937 | 3 hrs ago | 3.75362236 S | ||||
631208 | 4 hrs ago | 0.3278433 S |
Loading...
Loading
Contract Name:
GasMonetization
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2024-12-11 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library 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 functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // 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); } // 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; } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // 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; } // 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; } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // OpenZeppelin Contracts (last updated v4.8.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); _; } /** * @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 `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @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(account), " 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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ 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`. * * May emit a {RoleRevoked} event. */ 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. * * May emit a {RoleGranted} event. * * [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. * * May emit a {RoleGranted} event. */ 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. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } pragma solidity ^0.8.1; interface ISfc { function currentEpoch() external view returns (uint256); function currentSealedEpoch() external view returns (uint256); } pragma solidity ^0.8.1; contract GasMonetization is AccessControl { using Address for address payable; event FundsAdded(address indexed funder, uint256 amount); event FundsWithdrawn(address indexed recipient, uint256 amount); event ProjectAdded( uint256 indexed projectId, address indexed owner, address indexed rewardsRecipient, string metadataUri, uint256 activeFromEpoch, address[] contracts ); event ProjectSuspended(uint256 indexed projectId, uint256 suspendedOnEpochNumber); event ProjectEnabled(uint256 indexed projectId, uint256 enabledOnEpochNumber); event ProjectContractAdded(uint256 indexed projectId, address indexed contractAddress); event ProjectContractRemoved(uint256 indexed projectId, address indexed contractAddress); event ProjectMetadataUriUpdated(uint256 indexed projectId, string metadataUri); event ProjectRewardsRecipientUpdated(uint256 indexed projectId, address recipient); event ProjectOwnerUpdated(uint256 indexed projectId, address owner); event RewardClaimRequested(uint256 indexed projectId, uint256 requestEpochNumber); event RewardClaimCompleted(uint256 indexed projectId, uint256 epochNumber, uint256 amount); event RewardClaimCanceled(uint256 indexed projectId, uint256 epochNumber); event InvalidRewardClaimAmount( uint256 indexed projectId, uint256 requestEpochNumber, uint256 amount, uint256 diffAmount ); event RewardClaimEpochsLimitUpdated(uint256 limit); event RewardClaimConfirmationsLimitUpdated(uint256 limit); event SfcAddressUpdated(address sfcAddress); event ContractDeployed( address sfcAddress, uint256 rewardClaimEpochsFrequencyLimit, uint256 rewardClaimRequiredConfirmations ); /** * @notice Accounts with this role are eligible to fund this contract. */ bytes32 public constant FUNDER_ROLE = keccak256("FUNDER"); /** * @notice Accounts with this role are eligible to handle funds of this contract. */ bytes32 public constant FUNDS_MANAGER_ROLE = keccak256("FUNDS_MANAGER"); /** * @notice Accounts with this role are eligible to manage projects. */ bytes32 public constant PROJECTS_MANAGER_ROLE = keccak256("PROJECTS_MANAGER"); /** * @notice Accounts with this role are eligible to provide data related to reward claims. */ bytes32 public constant REWARDS_ORACLE_ROLE = keccak256("REWARDS_ORACLE"); /** * @notice Project represents a project that is eligible to claim rewards. This structure consists * of project's metadata uri and all related contracts, which will be used to calculate rewards. */ struct Project { address owner; address rewardsRecipient; string metadataUri; uint256 lastClaimEpoch; uint256 activeFromEpoch; // Used for disabled projects, when value is 0, then project has no expiration. uint256 activeToEpoch; } /** * @dev Registry of projects implemented as "project id" => "project" mapping. */ mapping(uint256 => Project) public projects; /** * @dev Registry of contracts and assigned projects implemented as "contract address" => "project id" mapping. */ mapping(address => uint256) public contracts; /** * @dev Sfc contract used for obtaining current epoch. */ ISfc public sfc; /** * @dev Restricts reward claims frequency by specified epochs number. */ uint256 public minEpochsBetweenClaims; /** * @dev Restricts how many confirmations we need to make reward claim. */ uint256 public requiredRewardClaimConfirmations; /** * @dev Last epoch id when contract was funded. */ uint256 public lastFundedEpoch = 0; /** * @notice PendingRewardClaimRequest represents a pending reward claim of a project. */ struct PendingRewardClaimRequest { uint256 requestedOnEpoch; uint256 confirmationsCount; uint256 confirmedAmount; // Array of addresses providing confirmation to prevent obtaining confirmations from single address. // Mapping can not be used, because it won't get deleted when request is deleted. // From solidity docs (https://docs.soliditylang.org/en/develop/types.html#delete): // Delete has no effect on whole mappings (as the keys of mappings may be arbitrary and are generally unknown). // So if you delete a struct, it will reset all members that are not mappings and also recurse into the members // unless they are mappings. However, individual keys and what they map to can be deleted. address[] confirmedBy; } /** * @dev Registry of pending reward claims implemented as "project id" => "pending reward claim" mapping. */ mapping(uint256 => PendingRewardClaimRequest) public pendingRewardClaims; /** * @dev Internal counter for identifiers of projects. */ uint256 public lastProjectId = 0; /** * @notice Contract constructor. It assigns to the creator admin role. Addresses with `DEFAULT_ADMIN_ROLE` * are eligible to grant and revoke memberships in particular roles. * @param sfcAddress Address of SFC contract. * @param rewardClaimEpochsFrequencyLimit Limits how often withdrawals can be done. * @param rewardClaimRequiredConfirmations Required confirmations to make claim. */ constructor( address sfcAddress, uint256 rewardClaimEpochsFrequencyLimit, uint256 rewardClaimRequiredConfirmations ) public { sfc = ISfc(sfcAddress); minEpochsBetweenClaims = rewardClaimEpochsFrequencyLimit; requiredRewardClaimConfirmations = rewardClaimRequiredConfirmations; _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); // set sfc as funder by default _grantRole(FUNDER_ROLE, sfcAddress); // set funds manager role by default to sender _grantRole(FUNDS_MANAGER_ROLE, _msgSender()); emit ContractDeployed(sfcAddress, rewardClaimEpochsFrequencyLimit, rewardClaimRequiredConfirmations); } /** * @notice New reward claim. Only project owner can request. * @param projectId Id of project. */ function newRewardClaim(uint256 projectId) external { require(projects[projectId].owner == _msgSender(), "GasMonetization: not owner"); require(pendingRewardClaims[projectId].requestedOnEpoch == 0, "GasMonetization: has pending claim"); require( projects[projectId].activeToEpoch == 0 || projects[projectId].lastClaimEpoch < projects[projectId].activeToEpoch, "GasMonetization: project disabled" ); uint256 epoch = sfc.currentSealedEpoch(); uint256 lastProjectClaimEpoch = projects[projectId].lastClaimEpoch; require( lastProjectClaimEpoch < lastFundedEpoch && epoch - lastProjectClaimEpoch > minEpochsBetweenClaims, "GasMonetization: must wait to claim" ); // prepare new claim pendingRewardClaims[projectId].requestedOnEpoch = epoch; emit RewardClaimRequested(projectId, epoch); } /** * @notice Confirm reward claim. * @param projectId Id of project. * @param epochNumber Number of epoch when request was made. * @param amount Amount that owner should receive. */ function confirmRewardClaim(uint256 projectId, uint256 epochNumber, uint256 amount) external { require(hasRole(REWARDS_ORACLE_ROLE, _msgSender()), "GasMonetization: not rewards oracle"); require(hasPendingRewardClaim(projectId, epochNumber), "GasMonetization: no claim request"); require(amount > 0, "GasMonetization: no amount to claim"); PendingRewardClaimRequest storage request = pendingRewardClaims[projectId]; // set amount when it is first confirmation if (request.confirmationsCount == 0) { request.confirmedAmount = amount; } else if (request.confirmedAmount != amount) { // otherwise if amount is different, invalidate data we obtained so far // and emit event, so next attempt can be made emit InvalidRewardClaimAmount(projectId, epochNumber, request.confirmedAmount, amount); delete pendingRewardClaims[projectId]; request.requestedOnEpoch = epochNumber; return; } // validate that provider has not already provided data for (uint256 i = 0; i < request.confirmedBy.length; ++i) { require(request.confirmedBy[i] != _msgSender(), "GasMonetization: already provided"); } // send amount if confirmations threshold is reached and delete request if (request.confirmationsCount + 1 >= requiredRewardClaimConfirmations) { delete pendingRewardClaims[projectId]; projects[projectId].lastClaimEpoch = epochNumber; payable(projects[projectId].rewardsRecipient).sendValue(amount); emit RewardClaimCompleted(projectId, epochNumber, amount); return; } // gas optimization request.confirmedBy.push(_msgSender()); request.confirmationsCount++; } /** * @notice Cancel reward claim request. * @param projectId Id of project. * @param epochNumber Epoch number of claim request. */ function cancelRewardClaim(uint256 projectId, uint256 epochNumber) external { require(hasPendingRewardClaim(projectId, epochNumber), "GasMonetization: no claim request"); PendingRewardClaimRequest storage request = pendingRewardClaims[projectId]; // only owner or data provider can cancel claim request if (projects[projectId].owner == _msgSender()) { // also owner must wait to cancel claim request until claim epoch limit is reached require( sfc.currentEpoch() - request.requestedOnEpoch > minEpochsBetweenClaims, "GasMonetization: must wait to cancel" ); } else { require(hasRole(REWARDS_ORACLE_ROLE, _msgSender()), "GasMonetization: not reward oracle or owner"); } delete pendingRewardClaims[projectId]; emit RewardClaimCanceled(projectId, epochNumber); } /** * @notice Add project into registry. * @param owner Address of project owner. * @param rewardsRecipient Address of rewards receiver. * @param metadataUri Uri of project's metadata. * @param projectContracts Array of related contracts. */ function addProject( address owner, address rewardsRecipient, string calldata metadataUri, address[] calldata projectContracts ) external { require(hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager"); require(bytes(metadataUri).length > 0, "GasMonetization: empty metadata uri"); lastProjectId++; projects[lastProjectId] = Project({ owner: owner, rewardsRecipient: rewardsRecipient, metadataUri: metadataUri, lastClaimEpoch: 0, activeFromEpoch: sfc.currentEpoch(), activeToEpoch: 0 }); for (uint256 i = 0; i < projectContracts.length; ++i) { require(contracts[projectContracts[i]] == 0, "GasMonetization: contract already registered"); contracts[projectContracts[i]] = lastProjectId; } emit ProjectAdded( lastProjectId, projects[lastProjectId].owner, projects[lastProjectId].rewardsRecipient, projects[lastProjectId].metadataUri, projects[lastProjectId].activeFromEpoch, projectContracts ); } /** * @notice Suspend project from receiving rewards. * @param projectId Id of project. */ function suspendProject(uint256 projectId) external { require(hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager"); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); require(projects[projectId].activeToEpoch == 0, "GasMonetization: project suspended"); projects[projectId].activeToEpoch = sfc.currentEpoch(); emit ProjectSuspended(projectId, projects[projectId].activeToEpoch); } /** * @notice Enable project to receive rewards. * @param projectId Id of project. */ function enableProject(uint256 projectId) external { require(hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager"); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); require(projects[projectId].activeToEpoch != 0, "GasMonetization: project active"); projects[projectId].activeFromEpoch = sfc.currentEpoch(); projects[projectId].activeToEpoch = 0; emit ProjectEnabled(projectId, projects[projectId].activeFromEpoch); } /** * @notice Add project contract into registry. * @param projectId Id of project. * @param contractAddress Address of project's contract. */ function addProjectContract(uint256 projectId, address contractAddress) external { require(hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager"); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); require(contracts[contractAddress] == 0, "GasMonetization: contract already registered"); contracts[contractAddress] = projectId; emit ProjectContractAdded(projectId, contractAddress); } /** * @notice Remove project contract from registry. * @param projectId Id of project. * @param contractAddress Address of contract. */ function removeProjectContract(uint256 projectId, address contractAddress) external { require(hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager"); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); require(contracts[contractAddress] == projectId, "GasMonetization: contract not registered"); delete contracts[contractAddress]; emit ProjectContractRemoved(projectId, contractAddress); } /** * @notice Update project's metadata uri. * @param projectId Id of project. * @param metadataUri Uri of project's metadata. */ function updateProjectMetadataUri(uint256 projectId, string calldata metadataUri) external { require(hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager"); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); require(bytes(metadataUri).length > 0, "GasMonetization: empty metadata uri"); projects[projectId].metadataUri = metadataUri; emit ProjectMetadataUriUpdated(projectId, metadataUri); } /** * @notice Update project's rewards recipient. * @param projectId Id of project. * @param recipient Address of recipient. */ function updateProjectRewardsRecipient(uint256 projectId, address recipient) external { require( projects[projectId].owner == _msgSender() || hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager or owner" ); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); projects[projectId].rewardsRecipient = recipient; emit ProjectRewardsRecipientUpdated(projectId, recipient); } /** * @notice Update project's owner. * @param projectId Id of project. * @param owner Address of owner. */ function updateProjectOwner(uint256 projectId, address owner) external { require( projects[projectId].owner == _msgSender() || hasRole(PROJECTS_MANAGER_ROLE, _msgSender()), "GasMonetization: not projects manager or owner" ); require(projects[projectId].owner != address(0), "GasMonetization: project does not exist"); projects[projectId].owner = owner; emit ProjectOwnerUpdated(projectId, owner); } /** * @notice Add funds. */ function addFunds() public payable { require(hasRole(FUNDER_ROLE, _msgSender()), "GasMonetization: not funder"); require(msg.value > 0, "GasMonetization: no funds sent"); lastFundedEpoch = sfc.currentSealedEpoch(); emit FundsAdded(_msgSender(), msg.value); } /** * @notice Withdraw funds. * @param recipient Address of recipient. * @param amount Amount to be withdrawn. */ function withdrawFunds(address payable recipient, uint256 amount) external { require(hasRole(FUNDS_MANAGER_ROLE, _msgSender()), "GasMonetization: not funds manager"); recipient.sendValue(amount); emit FundsWithdrawn(recipient, amount); } /** * @notice Withdraw all funds. * @param recipient Address of recipient. */ function withdrawAllFunds(address payable recipient) external { require(hasRole(FUNDS_MANAGER_ROLE, _msgSender()), "GasMonetization: not funds manager"); uint256 balance = address(this).balance; recipient.sendValue(balance); emit FundsWithdrawn(recipient, balance); } /** * @notice Update reward claim epochs frequency limit. * @param limit New limit. */ function updateRewardClaimEpochsFrequencyLimit(uint256 limit) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "GasMonetization: not admin"); minEpochsBetweenClaims = limit; emit RewardClaimEpochsLimitUpdated(limit); } /** * @notice Update reward claim required confirmations. * @param limit New limit. */ function updateRewardClaimRequiredConfirmations(uint256 limit) public { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "GasMonetization: not admin"); requiredRewardClaimConfirmations = limit; emit RewardClaimConfirmationsLimitUpdated(limit); } /** * @notice Update sfc address. * @param newSfc New sfc address. */ function updateSfcAddress(address newSfc) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "GasMonetization: not admin"); sfc = ISfc(newSfc); emit SfcAddressUpdated(newSfc); } /** * @notice Check owner has pending reward claim on given epoch id. * @param projectId Id of project. * @param epochId Id of epoch when request was made. */ function hasPendingRewardClaim(uint256 projectId, uint256 epochId) public view returns(bool) { return pendingRewardClaims[projectId].requestedOnEpoch == epochId; } /** * @notice Get project owner. * @param projectId Project id. */ function getProjectOwner(uint256 projectId) external view returns(address) { return projects[projectId].owner; } /** * @notice Get project rewards recipient. * @param projectId Project id. */ function getProjectRewardsRecipient(uint256 projectId) external view returns(address) { return projects[projectId].rewardsRecipient; } /** * @notice Get project metadata uri. * @param projectId Project id. */ function getProjectMetadataUri(uint256 projectId) external view returns(string memory) { return projects[projectId].metadataUri; } /** * @notice Get project last claim epoch. * @param projectId Project id. */ function getProjectLastClaimEpoch(uint256 projectId) external view returns(uint256) { return projects[projectId].lastClaimEpoch; } /** * @notice Get project active from epoch. * @param projectId Project id. */ function getProjectActiveFromEpoch(uint256 projectId) external view returns(uint256) { return projects[projectId].activeFromEpoch; } /** * @notice Get project active to epoch. * @param projectId Project id. */ function getProjectActiveToEpoch(uint256 projectId) external view returns(uint256) { return projects[projectId].activeToEpoch; } /** * @notice Get project id of given contract. * @param contractAddress Address of a contract. */ function getProjectIdOfContract(address contractAddress) external view returns(uint256) { return contracts[contractAddress]; } /** * @notice Get epoch of pending reward claim for given project id. * @param projectId Project id. */ function getPendingRewardClaimEpoch(uint256 projectId) external view returns(uint256) { return pendingRewardClaims[projectId].requestedOnEpoch; } /** * @notice Get pending reward claim confirmations count. * @param projectId Project id. */ function getPendingRewardClaimConfirmationsCount(uint256 projectId) public view returns(uint256) { return pendingRewardClaims[projectId].confirmationsCount; } /** * @notice Get pending reward claim confirmed amount. * @param projectId Project id. */ function getPendingRewardClaimConfirmedAmount(uint256 projectId) public view returns(uint256) { return pendingRewardClaims[projectId].confirmedAmount; } /** * @notice Get pending reward claim addresses confirming current claim. * @param projectId Project id. */ function getPendingRewardClaimConfirmedBy(uint256 projectId) public view returns(address[] memory) { return pendingRewardClaims[projectId].confirmedBy; } /** * @notice Receive function implementation to handle adding funds directly via "send" or "transfer" methods. */ receive() external payable { addFunds(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"sfcAddress","type":"address"},{"internalType":"uint256","name":"rewardClaimEpochsFrequencyLimit","type":"uint256"},{"internalType":"uint256","name":"rewardClaimRequiredConfirmations","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sfcAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardClaimEpochsFrequencyLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardClaimRequiredConfirmations","type":"uint256"}],"name":"ContractDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestEpochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"diffAmount","type":"uint256"}],"name":"InvalidRewardClaimAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsRecipient","type":"address"},{"indexed":false,"internalType":"string","name":"metadataUri","type":"string"},{"indexed":false,"internalType":"uint256","name":"activeFromEpoch","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"contracts","type":"address[]"}],"name":"ProjectAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ProjectContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ProjectContractRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"enabledOnEpochNumber","type":"uint256"}],"name":"ProjectEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"string","name":"metadataUri","type":"string"}],"name":"ProjectMetadataUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"ProjectOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ProjectRewardsRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"suspendedOnEpochNumber","type":"uint256"}],"name":"ProjectSuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"RewardClaimCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaimCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"RewardClaimConfirmationsLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"RewardClaimEpochsLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestEpochNumber","type":"uint256"}],"name":"RewardClaimRequested","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":false,"internalType":"address","name":"sfcAddress","type":"address"}],"name":"SfcAddressUpdated","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FUNDER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FUNDS_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROJECTS_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDS_ORACLE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addFunds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"rewardsRecipient","type":"address"},{"internalType":"string","name":"metadataUri","type":"string"},{"internalType":"address[]","name":"projectContracts","type":"address[]"}],"name":"addProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"addProjectContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"epochNumber","type":"uint256"}],"name":"cancelRewardClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"epochNumber","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"confirmRewardClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contracts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"enableProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getPendingRewardClaimConfirmationsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getPendingRewardClaimConfirmedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getPendingRewardClaimConfirmedBy","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getPendingRewardClaimEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectActiveFromEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectActiveToEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getProjectIdOfContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectLastClaimEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"getProjectRewardsRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint256","name":"projectId","type":"uint256"},{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"hasPendingRewardClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"lastFundedEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minEpochsBetweenClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"newRewardClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingRewardClaims","outputs":[{"internalType":"uint256","name":"requestedOnEpoch","type":"uint256"},{"internalType":"uint256","name":"confirmationsCount","type":"uint256"},{"internalType":"uint256","name":"confirmedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projects","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"rewardsRecipient","type":"address"},{"internalType":"string","name":"metadataUri","type":"string"},{"internalType":"uint256","name":"lastClaimEpoch","type":"uint256"},{"internalType":"uint256","name":"activeFromEpoch","type":"uint256"},{"internalType":"uint256","name":"activeToEpoch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"removeProjectContract","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":[],"name":"requiredRewardClaimConfirmations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sfc","outputs":[{"internalType":"contract ISfc","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":[{"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"suspendProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"string","name":"metadataUri","type":"string"}],"name":"updateProjectMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"updateProjectOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"updateProjectRewardsRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"updateRewardClaimEpochsFrequencyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"updateRewardClaimRequiredConfirmations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSfc","type":"address"}],"name":"updateSfcAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawAllFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600060065560006008553480156200001b57600080fd5b5060405162003469380380620034698339810160408190526200003e91620001c3565b600380546001600160a01b0319166001600160a01b03851617905560048290556005819055620000776000620000713390565b62000122565b620000a37f4f506ac322e467a10b006ee5ecfc5b7781c5c43d2ffbc468de868900d27b99458462000122565b620000cf7f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c3362000122565b604080516001600160a01b0385168152602081018490529081018290527f841dc6a6c60372f7a25ab4e5cb947a19940954c4364b1badbc999dc6f57048689060600160405180910390a150505062000208565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001bf576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200017e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600060608486031215620001d957600080fd5b83516001600160a01b0381168114620001f157600080fd5b602085015160409095015190969495509392505050565b61325180620002186000396000f3fe6080604052600436106102975760003560e01c806386350b751161015a578063c4707a83116100c1578063cbb9d8c91161007a578063cbb9d8c914610934578063cd84835114610954578063d3063c7d14610981578063d547741f14610997578063f6847c4b146109b7578063fdd02f4b146109d757600080fd5b8063c4707a831461080f578063c4d33f0714610843578063c655bd6614610863578063c7dee245146108ba578063c904cfe8146108da578063ca87bfb4146108fa57600080fd5b8063a217fddf11610113578063a217fddf14610756578063a26759cb1461076b578063a2f4f2a014610773578063bf03e8cb146107a0578063c02d2179146107c0578063c1075329146107ef57600080fd5b806386350b75146106685780638992229f146106885780639186f692146106c057806391d14854146106e057806392256aec1461070057806392cf316b1461073657600080fd5b8063449b817b116101fe57806369d1a186116101b757806369d1a1861461059557806369dc9ff3146105b55780637135e8d7146105e257806376268130146105f85780638098ac4c14610628578063818fa6ce1461064857600080fd5b8063449b817b146104aa57806350664ea9146104c0578063571e8697146104ed5780635afd14991461050f5780635c7449991461053f57806366328a0a1461057557600080fd5b80632c6929be116102505780632c6929be146103c65780632f2ff15d146103f657806332dee40b1461041657806334aedecd1461043657806334bfce4b1461046a57806336568abe1461048a57600080fd5b806301ffc9a7146102ab5780630d7d6b87146102e05780630e9644651461031e578063107046bd14610334578063229df0b414610366578063248a9ca31461039657600080fd5b366102a6576102a4610a0b565b005b600080fd5b3480156102b757600080fd5b506102cb6102c6366004612800565b610b87565b60405190151581526020015b60405180910390f35b3480156102ec57600080fd5b506103106102fb36600461282a565b60009081526007602052604090206002015490565b6040519081526020016102d7565b34801561032a57600080fd5b5061031060085481565b34801561034057600080fd5b5061035461034f36600461282a565b610bbe565b6040516102d796959493929190612893565b34801561037257600080fd5b5061031061038136600461282a565b60009081526001602052604090206003015490565b3480156103a257600080fd5b506103106103b136600461282a565b60009081526020819052604090206001015490565b3480156103d257600080fd5b506103106103e136600461282a565b60009081526007602052604090206001015490565b34801561040257600080fd5b506102a46104113660046128f2565b610c8a565b34801561042257600080fd5b506102a4610431366004612922565b610cb4565b34801561044257600080fd5b506103107f4f506ac322e467a10b006ee5ecfc5b7781c5c43d2ffbc468de868900d27b994581565b34801561047657600080fd5b506102a46104853660046128f2565b610d55565b34801561049657600080fd5b506102a46104a53660046128f2565b610e3a565b3480156104b657600080fd5b5061031060055481565b3480156104cc57600080fd5b506104e06104db36600461282a565b610eb8565b6040516102d7919061293f565b3480156104f957600080fd5b506103106000805160206131fc83398151915281565b34801561051b57600080fd5b5061031061052a36600461282a565b60009081526001602052604090206004015490565b34801561054b57600080fd5b5061031061055a366004612922565b6001600160a01b031660009081526002602052604090205490565b34801561058157600080fd5b506102a46105903660046128f2565b610f27565b3480156105a157600080fd5b506102a46105b036600461282a565b61100b565b3480156105c157600080fd5b506103106105d0366004612922565b60026020526000908152604090205481565b3480156105ee57600080fd5b5061031060045481565b34801561060457600080fd5b5061031061061336600461282a565b60009081526001602052604090206005015490565b34801561063457600080fd5b506102a46106433660046129d5565b6111a3565b34801561065457600080fd5b506102a461066336600461282a565b611284565b34801561067457600080fd5b506102a4610683366004612a21565b611414565b34801561069457600080fd5b506003546106a8906001600160a01b031681565b6040516001600160a01b0390911681526020016102d7565b3480156106cc57600080fd5b506102a46106db366004612ae5565b611714565b3480156106ec57600080fd5b506102cb6106fb3660046128f2565b61193e565b34801561070c57600080fd5b506106a861071b36600461282a565b6000908152600160205260409020546001600160a01b031690565b34801561074257600080fd5b506102a46107513660046128f2565b611967565b34801561076257600080fd5b50610310600081565b6102a4610a0b565b34801561077f57600080fd5b5061031061078e36600461282a565b60009081526007602052604090205490565b3480156107ac57600080fd5b506102a46107bb36600461282a565b611a4f565b3480156107cc57600080fd5b506102cb6107db366004612ae5565b600091825260076020526040909120541490565b3480156107fb57600080fd5b506102a461080a366004612b07565b611ab2565b34801561081b57600080fd5b506103107f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c81565b34801561084f57600080fd5b506102a461085e3660046128f2565b611b0b565b34801561086f57600080fd5b5061089f61087e36600461282a565b60076020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d7565b3480156108c657600080fd5b506102a46108d5366004612b33565b611c31565b3480156108e657600080fd5b506102a46108f536600461282a565b611f8d565b34801561090657600080fd5b506106a861091536600461282a565b600090815260016020819052604090912001546001600160a01b031690565b34801561094057600080fd5b506102a461094f366004612922565b611fe9565b34801561096057600080fd5b5061097461096f36600461282a565b61205e565b6040516102d79190612b5f565b34801561098d57600080fd5b5061031060065481565b3480156109a357600080fd5b506102a46109b23660046128f2565b6120f9565b3480156109c357600080fd5b506102a46109d236600461282a565b61211e565b3480156109e357600080fd5b506103107feadf9dd3eea68a4063fa7c6df79492fecc48f490ac236bb5e3f89fc5fec2788481565b610a357f4f506ac322e467a10b006ee5ecfc5b7781c5c43d2ffbc468de868900d27b99453361193e565b610a865760405162461bcd60e51b815260206004820152601b60248201527f4761734d6f6e6574697a6174696f6e3a206e6f742066756e646572000000000060448201526064015b60405180910390fd5b60003411610ad65760405162461bcd60e51b815260206004820152601e60248201527f4761734d6f6e6574697a6174696f6e3a206e6f2066756e64732073656e7400006044820152606401610a7d565b600360009054906101000a90046001600160a01b03166001600160a01b0316637cacb1d66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190612b72565b60065560405134815233907f8fe10ae416f22f5e5220b0018a6c1d4ff534d6aa3a471f2a20cb7747fe63e5b99060200160405180910390a2565b60006001600160e01b03198216637965db0b60e01b1480610bb857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60016020819052600091825260409091208054918101546002820180546001600160a01b03948516949092169291610bf590612b8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2190612b8b565b8015610c6e5780601f10610c4357610100808354040283529160200191610c6e565b820191906000526020600020905b815481529060010190602001808311610c5157829003601f168201915b5050505050908060030154908060040154908060050154905086565b600082815260208190526040902060010154610ca5816123b1565b610caf83836123be565b505050565b610cde7f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c3361193e565b610cfa5760405162461bcd60e51b8152600401610a7d90612bc5565b47610d0e6001600160a01b03831682612442565b816001600160a01b03167feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d82604051610d4991815260200190565b60405180910390a25050565b6000828152600160205260409020546001600160a01b0316331480610d8d5750610d8d6000805160206131fc8339815191523361193e565b610da95760405162461bcd60e51b8152600401610a7d90612c07565b6000828152600160205260409020546001600160a01b0316610ddd5760405162461bcd60e51b8152600401610a7d90612c55565b60008281526001602090815260409182902080546001600160a01b0319166001600160a01b038516908117909155915191825283917fffc579e983741c17a95792c458e2ae8c933b1bf7f5cd84f3bca571505c25d42a9101610d49565b6001600160a01b0381163314610eaa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a7d565b610eb4828261255b565b5050565b600081815260076020908152604091829020600301805483518184028101840190945280845260609392830182828015610f1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610efd575b50505050509050919050565b610f3f6000805160206131fc8339815191523361193e565b610f5b5760405162461bcd60e51b8152600401610a7d90612c9c565b6000828152600160205260409020546001600160a01b0316610f8f5760405162461bcd60e51b8152600401610a7d90612c55565b6001600160a01b03811660009081526002602052604090205415610fc55760405162461bcd60e51b8152600401610a7d90612ce1565b6001600160a01b0381166000818152600260205260408082208590555184917ff83ba82192ce64f0fd48145ca2b60956a005a2d4e28f14fb099fad71294b8ff391a35050565b6110236000805160206131fc8339815191523361193e565b61103f5760405162461bcd60e51b8152600401610a7d90612c9c565b6000818152600160205260409020546001600160a01b03166110735760405162461bcd60e51b8152600401610a7d90612c55565b60008181526001602052604081206005015490036110d35760405162461bcd60e51b815260206004820152601f60248201527f4761734d6f6e6574697a6174696f6e3a2070726f6a65637420616374697665006044820152606401610a7d565b600360009054906101000a90046001600160a01b03166001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114a9190612b72565b60008281526001602052604080822060048101849055600501919091555182917f0737ed2cc6eb4cf4aefb6d1e1404305301a64cae58ccf508828a20412fb77f359161119891815260200190565b60405180910390a250565b6111bb6000805160206131fc8339815191523361193e565b6111d75760405162461bcd60e51b8152600401610a7d90612c9c565b6000838152600160205260409020546001600160a01b031661120b5760405162461bcd60e51b8152600401610a7d90612c55565b806112285760405162461bcd60e51b8152600401610a7d90612d2d565b6000838152600160205260409020600201611244828483612dd4565b50827f781779743e625d6e652139cabc7e7c736ad376a0f1302b1b5c346548d948c72e8383604051611277929190612e95565b60405180910390a2505050565b61129c6000805160206131fc8339815191523361193e565b6112b85760405162461bcd60e51b8152600401610a7d90612c9c565b6000818152600160205260409020546001600160a01b03166112ec5760405162461bcd60e51b8152600401610a7d90612c55565b600081815260016020526040902060050154156113565760405162461bcd60e51b815260206004820152602260248201527f4761734d6f6e6574697a6174696f6e3a2070726f6a6563742073757370656e64604482015261195960f21b6064820152608401610a7d565b600360009054906101000a90046001600160a01b03166001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cd9190612b72565b600082815260016020526040908190206005018290555182917f0c3ad6c6f2fc1e970caed51e87ac06c3a37569f33664f42771264a4ae89078229161119891815260200190565b61142c6000805160206131fc8339815191523361193e565b6114485760405162461bcd60e51b8152600401610a7d90612c9c565b826114655760405162461bcd60e51b8152600401610a7d90612d2d565b6008805490600061147583612eda565b91905055506040518060c00160405280876001600160a01b03168152602001866001600160a01b0316815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083019190915260035460408051630ecce30160e31b8152815191909401936001600160a01b0390921692637667180892600480820193918290030181865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612b72565b81526000602091820181905260085481526001808352604091829020845181546001600160a01b03199081166001600160a01b0392831617835594860151928201805490951692169190911790925582015160028201906115b39082612ef3565b50606082015160038201556080820151600482015560a09091015160059091015560005b8181101561169957600260008484848181106115f5576115f5612fb3565b905060200201602081019061160a9190612922565b6001600160a01b03168152602081019190915260400160002054156116415760405162461bcd60e51b8152600401610a7d90612ce1565b6008546002600085858581811061165a5761165a612fb3565b905060200201602081019061166f9190612922565b6001600160a01b0316815260208101919091526040016000205561169281612eda565b90506115d7565b50600854600081815260016020819052604091829020908101548154600483015493516001600160a01b0392831695929091169391927fa8f2a13a6c4c221e863c34b0174b2a8356551bc645dc295ae4b5796c240915aa926117049260029092019189908990613012565b60405180910390a4505050505050565b60008281526007602052604090205481146117415760405162461bcd60e51b8152600401610a7d906130ba565b6000828152600760209081526040808320600190925290912054336001600160a01b0390911603611853576004548160000154600360009054906101000a90046001600160a01b03166001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612b72565b6117f591906130fb565b1161184e5760405162461bcd60e51b8152602060048201526024808201527f4761734d6f6e6574697a6174696f6e3a206d757374207761697420746f2063616044820152631b98d95b60e21b6064820152608401610a7d565b6118dd565b61187d7feadf9dd3eea68a4063fa7c6df79492fecc48f490ac236bb5e3f89fc5fec278843361193e565b6118dd5760405162461bcd60e51b815260206004820152602b60248201527f4761734d6f6e6574697a6174696f6e3a206e6f7420726577617264206f72616360448201526a36329037b91037bbb732b960a91b6064820152608401610a7d565b600083815260076020526040812081815560018101829055600281018290559061190a60038301826127ce565b5050827f330f810dcb77ce8b06981aa374c530cd74e78d724b6c221b389e595320d52d8c8360405161127791815260200190565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000828152600160205260409020546001600160a01b031633148061199f575061199f6000805160206131fc8339815191523361193e565b6119bb5760405162461bcd60e51b8152600401610a7d90612c07565b6000828152600160205260409020546001600160a01b03166119ef5760405162461bcd60e51b8152600401610a7d90612c55565b60008281526001602081815260409283902090910180546001600160a01b0319166001600160a01b038516908117909155915191825283917fc96c5102d284d786d29b5d0d7dda6ce493724355b762993adfef62b7220f161c9101610d49565b611a5a60003361193e565b611a765760405162461bcd60e51b8152600401610a7d9061310e565b60058190556040518181527f40af3e7f4d5f1d84d8df148964543a4bb110c38d98e8f80513187e70b1d49a09906020015b60405180910390a150565b611adc7f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c3361193e565b611af85760405162461bcd60e51b8152600401610a7d90612bc5565b610d0e6001600160a01b03831682612442565b611b236000805160206131fc8339815191523361193e565b611b3f5760405162461bcd60e51b8152600401610a7d90612c9c565b6000828152600160205260409020546001600160a01b0316611b735760405162461bcd60e51b8152600401610a7d90612c55565b6001600160a01b0381166000908152600260205260409020548214611beb5760405162461bcd60e51b815260206004820152602860248201527f4761734d6f6e6574697a6174696f6e3a20636f6e7472616374206e6f7420726560448201526719da5cdd195c995960c21b6064820152608401610a7d565b6001600160a01b0381166000818152600260205260408082208290555184917fd32f2e923c29ff9e7231f459d69add67f769d05c5069c23bbdea536fc0cf154a91a35050565b611c5b7feadf9dd3eea68a4063fa7c6df79492fecc48f490ac236bb5e3f89fc5fec278843361193e565b611cb35760405162461bcd60e51b815260206004820152602360248201527f4761734d6f6e6574697a6174696f6e3a206e6f742072657761726473206f7261604482015262636c6560e81b6064820152608401610a7d565b6000838152600760205260409020548214611ce05760405162461bcd60e51b8152600401610a7d906130ba565b60008111611d3c5760405162461bcd60e51b815260206004820152602360248201527f4761734d6f6e6574697a6174696f6e3a206e6f20616d6f756e7420746f20636c60448201526261696d60e81b6064820152608401610a7d565b60008381526007602052604081206001810154909103611d625760028101829055611dec565b81816002015414611dec576002810154604080518581526020810192909252810183905284907ff21b91ab3cc2b0aac59664cbe3661d2efbb9d705ce6e5c4459ca35efc1fed96b9060600160405180910390a26000848152600760205260408120818155600181018290556002810182905590611de260038301826127ce565b5050919091555050565b60005b6003820154811015611e9657336001600160a01b0316826003018281548110611e1a57611e1a612fb3565b6000918252602090912001546001600160a01b031603611e865760405162461bcd60e51b815260206004820152602160248201527f4761734d6f6e6574697a6174696f6e3a20616c72656164792070726f766964656044820152601960fa1b6064820152608401610a7d565b611e8f81612eda565b9050611def565b50600554600180830154611ea991613145565b10611f4b576000848152600760205260408120818155600181018290556002810182905590611edb60038301826127ce565b50506000848152600160208190526040909120600381018590550154611f0a906001600160a01b031683612442565b604080518481526020810184905285917ff22ca6bee07a66fa3952af4d7ae85f506ddcd92bf92a3f3994e899afdb00d087910160405180910390a250505050565b6003810180546001808201835560009283526020832090910180546001600160a01b031916331790558201805491611f8283612eda565b919050555050505050565b611f9860003361193e565b611fb45760405162461bcd60e51b8152600401610a7d9061310e565b60048190556040518181527f4f1c9c7efb48c0ca028860e92a42e8359606126bb2d8eb7eb62711793a3caa3590602001611aa7565b611ff460003361193e565b6120105760405162461bcd60e51b8152600401610a7d9061310e565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f620e7fb0cccb30fce2c95f32e301054c7ba7fd3520a8f42891915c9d10efe95f90602001611aa7565b600081815260016020526040902060020180546060919061207e90612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546120aa90612b8b565b8015610f1b5780601f106120cc57610100808354040283529160200191610f1b565b820191906000526020600020905b8154815290600101906020018083116120da5750939695505050505050565b600082815260208190526040902060010154612114816123b1565b610caf838361255b565b6000818152600160205260409020546001600160a01b031633146121845760405162461bcd60e51b815260206004820152601a60248201527f4761734d6f6e6574697a6174696f6e3a206e6f74206f776e65720000000000006044820152606401610a7d565b600081815260076020526040902054156121eb5760405162461bcd60e51b815260206004820152602260248201527f4761734d6f6e6574697a6174696f6e3a206861732070656e64696e6720636c61604482015261696d60f01b6064820152608401610a7d565b600081815260016020526040902060050154158061221f575060008181526001602052604090206005810154600390910154105b6122755760405162461bcd60e51b815260206004820152602160248201527f4761734d6f6e6574697a6174696f6e3a2070726f6a6563742064697361626c656044820152601960fa1b6064820152608401610a7d565b60035460408051633e5658eb60e11b815290516000926001600160a01b031691637cacb1d69160048083019260209291908290030181865afa1580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e39190612b72565b6000838152600160205260409020600301546006549192509081108015612314575060045461231282846130fb565b115b61236c5760405162461bcd60e51b815260206004820152602360248201527f4761734d6f6e6574697a6174696f6e3a206d757374207761697420746f20636c60448201526261696d60e81b6064820152608401610a7d565b600083815260076020526040908190208390555183907fb99e1d3fb58405bbf055b348a2f5a9a21fa20a42fa5788b1769b2721c2141050906112779085815260200190565b6123bb81336125c0565b50565b6123c8828261193e565b610eb4576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123fe3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b804710156124925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a7d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146124df576040519150601f19603f3d011682016040523d82523d6000602084013e6124e4565b606091505b5050905080610caf5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a7d565b612565828261193e565b15610eb4576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6125ca828261193e565b610eb4576125d781612619565b6125e283602061262b565b6040516020016125f3929190613158565b60408051601f198184030181529082905262461bcd60e51b8252610a7d91600401612b5f565b6060610bb86001600160a01b03831660145b6060600061263a8360026131cd565b612645906002613145565b67ffffffffffffffff81111561265d5761265d612d70565b6040519080825280601f01601f191660200182016040528015612687576020820181803683370190505b509050600360fc1b816000815181106126a2576126a2612fb3565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106126d1576126d1612fb3565b60200101906001600160f81b031916908160001a90535060006126f58460026131cd565b612700906001613145565b90505b6001811115612778576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061273457612734612fb3565b1a60f81b82828151811061274a5761274a612fb3565b60200101906001600160f81b031916908160001a90535060049490941c93612771816131e4565b9050612703565b5083156127c75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a7d565b9392505050565b50805460008255906000526020600020908101906123bb91905b808211156127fc57600081556001016127e8565b5090565b60006020828403121561281257600080fd5b81356001600160e01b0319811681146127c757600080fd5b60006020828403121561283c57600080fd5b5035919050565b60005b8381101561285e578181015183820152602001612846565b50506000910152565b6000815180845261287f816020860160208601612843565b601f01601f19169290920160200192915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906128bf90830187612867565b606083019590955250608081019290925260a0909101529392505050565b6001600160a01b03811681146123bb57600080fd5b6000806040838503121561290557600080fd5b823591506020830135612917816128dd565b809150509250929050565b60006020828403121561293457600080fd5b81356127c7816128dd565b6020808252825182820181905260009190848201906040850190845b818110156129805783516001600160a01b03168352928401929184019160010161295b565b50909695505050505050565b60008083601f84011261299e57600080fd5b50813567ffffffffffffffff8111156129b657600080fd5b6020830191508360208285010111156129ce57600080fd5b9250929050565b6000806000604084860312156129ea57600080fd5b83359250602084013567ffffffffffffffff811115612a0857600080fd5b612a148682870161298c565b9497909650939450505050565b60008060008060008060808789031215612a3a57600080fd5b8635612a45816128dd565b95506020870135612a55816128dd565b9450604087013567ffffffffffffffff80821115612a7257600080fd5b612a7e8a838b0161298c565b90965094506060890135915080821115612a9757600080fd5b818901915089601f830112612aab57600080fd5b813581811115612aba57600080fd5b8a60208260051b8501011115612acf57600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612af857600080fd5b50508035926020909101359150565b60008060408385031215612b1a57600080fd5b8235612b25816128dd565b946020939093013593505050565b600080600060608486031215612b4857600080fd5b505081359360208301359350604090920135919050565b6020815260006127c76020830184612867565b600060208284031215612b8457600080fd5b5051919050565b600181811c90821680612b9f57607f821691505b602082108103612bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4761734d6f6e6574697a6174696f6e3a206e6f742066756e6473206d616e616760408201526132b960f11b606082015260800190565b6020808252602e908201527f4761734d6f6e6574697a6174696f6e3a206e6f742070726f6a65637473206d6160408201526d3730b3b2b91037b91037bbb732b960911b606082015260800190565b60208082526027908201527f4761734d6f6e6574697a6174696f6e3a2070726f6a65637420646f6573206e6f6040820152661d08195e1a5cdd60ca1b606082015260800190565b60208082526025908201527f4761734d6f6e6574697a6174696f6e3a206e6f742070726f6a65637473206d616040820152643730b3b2b960d91b606082015260800190565b6020808252602c908201527f4761734d6f6e6574697a6174696f6e3a20636f6e747261637420616c7265616460408201526b1e481c9959da5cdd195c995960a21b606082015260800190565b60208082526023908201527f4761734d6f6e6574697a6174696f6e3a20656d707479206d657461646174612060408201526275726960e81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f821115610caf57600081815260208120601f850160051c81016020861015612dad5750805b601f850160051c820191505b81811015612dcc57828155600101612db9565b505050505050565b67ffffffffffffffff831115612dec57612dec612d70565b612e0083612dfa8354612b8b565b83612d86565b6000601f841160018114612e345760008515612e1c5750838201355b600019600387901b1c1916600186901b178355612e8e565b600083815260209020601f19861690835b82811015612e655786850135825560209485019460019092019101612e45565b5086821015612e825760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b600060018201612eec57612eec612ec4565b5060010190565b815167ffffffffffffffff811115612f0d57612f0d612d70565b612f2181612f1b8454612b8b565b84612d86565b602080601f831160018114612f565760008415612f3e5750858301515b600019600386901b1c1916600185901b178555612dcc565b600085815260208120601f198616915b82811015612f8557888601518255948401946001909101908401612f66565b5085821015612fa35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b85811015613007578135612fec816128dd565b6001600160a01b031687529582019590820190600101612fd9565b509495945050505050565b60608152600080865461302481612b8b565b8060608601526080600180841660008114613046576001811461306057613091565b60ff1985168884015283151560051b880183019550613091565b8b60005260208060002060005b868110156130885781548b820187015290840190820161306d565b8a018501975050505b505050505085602084015282810360408401526130af818587612fc9565b979650505050505050565b60208082526021908201527f4761734d6f6e6574697a6174696f6e3a206e6f20636c61696d207265717565736040820152601d60fa1b606082015260800190565b81810381811115610bb857610bb8612ec4565b6020808252601a908201527f4761734d6f6e6574697a6174696f6e3a206e6f742061646d696e000000000000604082015260600190565b80820180821115610bb857610bb8612ec4565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613190816017850160208801612843565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516131c1816028840160208801612843565b01602801949350505050565b8082028115828204841417610bb857610bb8612ec4565b6000816131f3576131f3612ec4565b50600019019056fe979b77ba2fd37b608c52b1185e9b8e96ba2ff2e0c1dff47d2959620ef0ab3861a26469706673582212203d3d1375e6e22bee2843e83bba4ea790735fc753553d3f3ec185fce9d1b3957e64736f6c63430008130033000000000000000000000000fc00face0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x6080604052600436106102975760003560e01c806386350b751161015a578063c4707a83116100c1578063cbb9d8c91161007a578063cbb9d8c914610934578063cd84835114610954578063d3063c7d14610981578063d547741f14610997578063f6847c4b146109b7578063fdd02f4b146109d757600080fd5b8063c4707a831461080f578063c4d33f0714610843578063c655bd6614610863578063c7dee245146108ba578063c904cfe8146108da578063ca87bfb4146108fa57600080fd5b8063a217fddf11610113578063a217fddf14610756578063a26759cb1461076b578063a2f4f2a014610773578063bf03e8cb146107a0578063c02d2179146107c0578063c1075329146107ef57600080fd5b806386350b75146106685780638992229f146106885780639186f692146106c057806391d14854146106e057806392256aec1461070057806392cf316b1461073657600080fd5b8063449b817b116101fe57806369d1a186116101b757806369d1a1861461059557806369dc9ff3146105b55780637135e8d7146105e257806376268130146105f85780638098ac4c14610628578063818fa6ce1461064857600080fd5b8063449b817b146104aa57806350664ea9146104c0578063571e8697146104ed5780635afd14991461050f5780635c7449991461053f57806366328a0a1461057557600080fd5b80632c6929be116102505780632c6929be146103c65780632f2ff15d146103f657806332dee40b1461041657806334aedecd1461043657806334bfce4b1461046a57806336568abe1461048a57600080fd5b806301ffc9a7146102ab5780630d7d6b87146102e05780630e9644651461031e578063107046bd14610334578063229df0b414610366578063248a9ca31461039657600080fd5b366102a6576102a4610a0b565b005b600080fd5b3480156102b757600080fd5b506102cb6102c6366004612800565b610b87565b60405190151581526020015b60405180910390f35b3480156102ec57600080fd5b506103106102fb36600461282a565b60009081526007602052604090206002015490565b6040519081526020016102d7565b34801561032a57600080fd5b5061031060085481565b34801561034057600080fd5b5061035461034f36600461282a565b610bbe565b6040516102d796959493929190612893565b34801561037257600080fd5b5061031061038136600461282a565b60009081526001602052604090206003015490565b3480156103a257600080fd5b506103106103b136600461282a565b60009081526020819052604090206001015490565b3480156103d257600080fd5b506103106103e136600461282a565b60009081526007602052604090206001015490565b34801561040257600080fd5b506102a46104113660046128f2565b610c8a565b34801561042257600080fd5b506102a4610431366004612922565b610cb4565b34801561044257600080fd5b506103107f4f506ac322e467a10b006ee5ecfc5b7781c5c43d2ffbc468de868900d27b994581565b34801561047657600080fd5b506102a46104853660046128f2565b610d55565b34801561049657600080fd5b506102a46104a53660046128f2565b610e3a565b3480156104b657600080fd5b5061031060055481565b3480156104cc57600080fd5b506104e06104db36600461282a565b610eb8565b6040516102d7919061293f565b3480156104f957600080fd5b506103106000805160206131fc83398151915281565b34801561051b57600080fd5b5061031061052a36600461282a565b60009081526001602052604090206004015490565b34801561054b57600080fd5b5061031061055a366004612922565b6001600160a01b031660009081526002602052604090205490565b34801561058157600080fd5b506102a46105903660046128f2565b610f27565b3480156105a157600080fd5b506102a46105b036600461282a565b61100b565b3480156105c157600080fd5b506103106105d0366004612922565b60026020526000908152604090205481565b3480156105ee57600080fd5b5061031060045481565b34801561060457600080fd5b5061031061061336600461282a565b60009081526001602052604090206005015490565b34801561063457600080fd5b506102a46106433660046129d5565b6111a3565b34801561065457600080fd5b506102a461066336600461282a565b611284565b34801561067457600080fd5b506102a4610683366004612a21565b611414565b34801561069457600080fd5b506003546106a8906001600160a01b031681565b6040516001600160a01b0390911681526020016102d7565b3480156106cc57600080fd5b506102a46106db366004612ae5565b611714565b3480156106ec57600080fd5b506102cb6106fb3660046128f2565b61193e565b34801561070c57600080fd5b506106a861071b36600461282a565b6000908152600160205260409020546001600160a01b031690565b34801561074257600080fd5b506102a46107513660046128f2565b611967565b34801561076257600080fd5b50610310600081565b6102a4610a0b565b34801561077f57600080fd5b5061031061078e36600461282a565b60009081526007602052604090205490565b3480156107ac57600080fd5b506102a46107bb36600461282a565b611a4f565b3480156107cc57600080fd5b506102cb6107db366004612ae5565b600091825260076020526040909120541490565b3480156107fb57600080fd5b506102a461080a366004612b07565b611ab2565b34801561081b57600080fd5b506103107f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c81565b34801561084f57600080fd5b506102a461085e3660046128f2565b611b0b565b34801561086f57600080fd5b5061089f61087e36600461282a565b60076020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102d7565b3480156108c657600080fd5b506102a46108d5366004612b33565b611c31565b3480156108e657600080fd5b506102a46108f536600461282a565b611f8d565b34801561090657600080fd5b506106a861091536600461282a565b600090815260016020819052604090912001546001600160a01b031690565b34801561094057600080fd5b506102a461094f366004612922565b611fe9565b34801561096057600080fd5b5061097461096f36600461282a565b61205e565b6040516102d79190612b5f565b34801561098d57600080fd5b5061031060065481565b3480156109a357600080fd5b506102a46109b23660046128f2565b6120f9565b3480156109c357600080fd5b506102a46109d236600461282a565b61211e565b3480156109e357600080fd5b506103107feadf9dd3eea68a4063fa7c6df79492fecc48f490ac236bb5e3f89fc5fec2788481565b610a357f4f506ac322e467a10b006ee5ecfc5b7781c5c43d2ffbc468de868900d27b99453361193e565b610a865760405162461bcd60e51b815260206004820152601b60248201527f4761734d6f6e6574697a6174696f6e3a206e6f742066756e646572000000000060448201526064015b60405180910390fd5b60003411610ad65760405162461bcd60e51b815260206004820152601e60248201527f4761734d6f6e6574697a6174696f6e3a206e6f2066756e64732073656e7400006044820152606401610a7d565b600360009054906101000a90046001600160a01b03166001600160a01b0316637cacb1d66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190612b72565b60065560405134815233907f8fe10ae416f22f5e5220b0018a6c1d4ff534d6aa3a471f2a20cb7747fe63e5b99060200160405180910390a2565b60006001600160e01b03198216637965db0b60e01b1480610bb857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60016020819052600091825260409091208054918101546002820180546001600160a01b03948516949092169291610bf590612b8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2190612b8b565b8015610c6e5780601f10610c4357610100808354040283529160200191610c6e565b820191906000526020600020905b815481529060010190602001808311610c5157829003601f168201915b5050505050908060030154908060040154908060050154905086565b600082815260208190526040902060010154610ca5816123b1565b610caf83836123be565b505050565b610cde7f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c3361193e565b610cfa5760405162461bcd60e51b8152600401610a7d90612bc5565b47610d0e6001600160a01b03831682612442565b816001600160a01b03167feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d82604051610d4991815260200190565b60405180910390a25050565b6000828152600160205260409020546001600160a01b0316331480610d8d5750610d8d6000805160206131fc8339815191523361193e565b610da95760405162461bcd60e51b8152600401610a7d90612c07565b6000828152600160205260409020546001600160a01b0316610ddd5760405162461bcd60e51b8152600401610a7d90612c55565b60008281526001602090815260409182902080546001600160a01b0319166001600160a01b038516908117909155915191825283917fffc579e983741c17a95792c458e2ae8c933b1bf7f5cd84f3bca571505c25d42a9101610d49565b6001600160a01b0381163314610eaa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610a7d565b610eb4828261255b565b5050565b600081815260076020908152604091829020600301805483518184028101840190945280845260609392830182828015610f1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610efd575b50505050509050919050565b610f3f6000805160206131fc8339815191523361193e565b610f5b5760405162461bcd60e51b8152600401610a7d90612c9c565b6000828152600160205260409020546001600160a01b0316610f8f5760405162461bcd60e51b8152600401610a7d90612c55565b6001600160a01b03811660009081526002602052604090205415610fc55760405162461bcd60e51b8152600401610a7d90612ce1565b6001600160a01b0381166000818152600260205260408082208590555184917ff83ba82192ce64f0fd48145ca2b60956a005a2d4e28f14fb099fad71294b8ff391a35050565b6110236000805160206131fc8339815191523361193e565b61103f5760405162461bcd60e51b8152600401610a7d90612c9c565b6000818152600160205260409020546001600160a01b03166110735760405162461bcd60e51b8152600401610a7d90612c55565b60008181526001602052604081206005015490036110d35760405162461bcd60e51b815260206004820152601f60248201527f4761734d6f6e6574697a6174696f6e3a2070726f6a65637420616374697665006044820152606401610a7d565b600360009054906101000a90046001600160a01b03166001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa158015611126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114a9190612b72565b60008281526001602052604080822060048101849055600501919091555182917f0737ed2cc6eb4cf4aefb6d1e1404305301a64cae58ccf508828a20412fb77f359161119891815260200190565b60405180910390a250565b6111bb6000805160206131fc8339815191523361193e565b6111d75760405162461bcd60e51b8152600401610a7d90612c9c565b6000838152600160205260409020546001600160a01b031661120b5760405162461bcd60e51b8152600401610a7d90612c55565b806112285760405162461bcd60e51b8152600401610a7d90612d2d565b6000838152600160205260409020600201611244828483612dd4565b50827f781779743e625d6e652139cabc7e7c736ad376a0f1302b1b5c346548d948c72e8383604051611277929190612e95565b60405180910390a2505050565b61129c6000805160206131fc8339815191523361193e565b6112b85760405162461bcd60e51b8152600401610a7d90612c9c565b6000818152600160205260409020546001600160a01b03166112ec5760405162461bcd60e51b8152600401610a7d90612c55565b600081815260016020526040902060050154156113565760405162461bcd60e51b815260206004820152602260248201527f4761734d6f6e6574697a6174696f6e3a2070726f6a6563742073757370656e64604482015261195960f21b6064820152608401610a7d565b600360009054906101000a90046001600160a01b03166001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cd9190612b72565b600082815260016020526040908190206005018290555182917f0c3ad6c6f2fc1e970caed51e87ac06c3a37569f33664f42771264a4ae89078229161119891815260200190565b61142c6000805160206131fc8339815191523361193e565b6114485760405162461bcd60e51b8152600401610a7d90612c9c565b826114655760405162461bcd60e51b8152600401610a7d90612d2d565b6008805490600061147583612eda565b91905055506040518060c00160405280876001600160a01b03168152602001866001600160a01b0316815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083019190915260035460408051630ecce30160e31b8152815191909401936001600160a01b0390921692637667180892600480820193918290030181865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190612b72565b81526000602091820181905260085481526001808352604091829020845181546001600160a01b03199081166001600160a01b0392831617835594860151928201805490951692169190911790925582015160028201906115b39082612ef3565b50606082015160038201556080820151600482015560a09091015160059091015560005b8181101561169957600260008484848181106115f5576115f5612fb3565b905060200201602081019061160a9190612922565b6001600160a01b03168152602081019190915260400160002054156116415760405162461bcd60e51b8152600401610a7d90612ce1565b6008546002600085858581811061165a5761165a612fb3565b905060200201602081019061166f9190612922565b6001600160a01b0316815260208101919091526040016000205561169281612eda565b90506115d7565b50600854600081815260016020819052604091829020908101548154600483015493516001600160a01b0392831695929091169391927fa8f2a13a6c4c221e863c34b0174b2a8356551bc645dc295ae4b5796c240915aa926117049260029092019189908990613012565b60405180910390a4505050505050565b60008281526007602052604090205481146117415760405162461bcd60e51b8152600401610a7d906130ba565b6000828152600760209081526040808320600190925290912054336001600160a01b0390911603611853576004548160000154600360009054906101000a90046001600160a01b03166001600160a01b031663766718086040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612b72565b6117f591906130fb565b1161184e5760405162461bcd60e51b8152602060048201526024808201527f4761734d6f6e6574697a6174696f6e3a206d757374207761697420746f2063616044820152631b98d95b60e21b6064820152608401610a7d565b6118dd565b61187d7feadf9dd3eea68a4063fa7c6df79492fecc48f490ac236bb5e3f89fc5fec278843361193e565b6118dd5760405162461bcd60e51b815260206004820152602b60248201527f4761734d6f6e6574697a6174696f6e3a206e6f7420726577617264206f72616360448201526a36329037b91037bbb732b960a91b6064820152608401610a7d565b600083815260076020526040812081815560018101829055600281018290559061190a60038301826127ce565b5050827f330f810dcb77ce8b06981aa374c530cd74e78d724b6c221b389e595320d52d8c8360405161127791815260200190565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6000828152600160205260409020546001600160a01b031633148061199f575061199f6000805160206131fc8339815191523361193e565b6119bb5760405162461bcd60e51b8152600401610a7d90612c07565b6000828152600160205260409020546001600160a01b03166119ef5760405162461bcd60e51b8152600401610a7d90612c55565b60008281526001602081815260409283902090910180546001600160a01b0319166001600160a01b038516908117909155915191825283917fc96c5102d284d786d29b5d0d7dda6ce493724355b762993adfef62b7220f161c9101610d49565b611a5a60003361193e565b611a765760405162461bcd60e51b8152600401610a7d9061310e565b60058190556040518181527f40af3e7f4d5f1d84d8df148964543a4bb110c38d98e8f80513187e70b1d49a09906020015b60405180910390a150565b611adc7f93779bf6be703205517715c86297c193472c9d5533e90609b671022041168a4c3361193e565b611af85760405162461bcd60e51b8152600401610a7d90612bc5565b610d0e6001600160a01b03831682612442565b611b236000805160206131fc8339815191523361193e565b611b3f5760405162461bcd60e51b8152600401610a7d90612c9c565b6000828152600160205260409020546001600160a01b0316611b735760405162461bcd60e51b8152600401610a7d90612c55565b6001600160a01b0381166000908152600260205260409020548214611beb5760405162461bcd60e51b815260206004820152602860248201527f4761734d6f6e6574697a6174696f6e3a20636f6e7472616374206e6f7420726560448201526719da5cdd195c995960c21b6064820152608401610a7d565b6001600160a01b0381166000818152600260205260408082208290555184917fd32f2e923c29ff9e7231f459d69add67f769d05c5069c23bbdea536fc0cf154a91a35050565b611c5b7feadf9dd3eea68a4063fa7c6df79492fecc48f490ac236bb5e3f89fc5fec278843361193e565b611cb35760405162461bcd60e51b815260206004820152602360248201527f4761734d6f6e6574697a6174696f6e3a206e6f742072657761726473206f7261604482015262636c6560e81b6064820152608401610a7d565b6000838152600760205260409020548214611ce05760405162461bcd60e51b8152600401610a7d906130ba565b60008111611d3c5760405162461bcd60e51b815260206004820152602360248201527f4761734d6f6e6574697a6174696f6e3a206e6f20616d6f756e7420746f20636c60448201526261696d60e81b6064820152608401610a7d565b60008381526007602052604081206001810154909103611d625760028101829055611dec565b81816002015414611dec576002810154604080518581526020810192909252810183905284907ff21b91ab3cc2b0aac59664cbe3661d2efbb9d705ce6e5c4459ca35efc1fed96b9060600160405180910390a26000848152600760205260408120818155600181018290556002810182905590611de260038301826127ce565b5050919091555050565b60005b6003820154811015611e9657336001600160a01b0316826003018281548110611e1a57611e1a612fb3565b6000918252602090912001546001600160a01b031603611e865760405162461bcd60e51b815260206004820152602160248201527f4761734d6f6e6574697a6174696f6e3a20616c72656164792070726f766964656044820152601960fa1b6064820152608401610a7d565b611e8f81612eda565b9050611def565b50600554600180830154611ea991613145565b10611f4b576000848152600760205260408120818155600181018290556002810182905590611edb60038301826127ce565b50506000848152600160208190526040909120600381018590550154611f0a906001600160a01b031683612442565b604080518481526020810184905285917ff22ca6bee07a66fa3952af4d7ae85f506ddcd92bf92a3f3994e899afdb00d087910160405180910390a250505050565b6003810180546001808201835560009283526020832090910180546001600160a01b031916331790558201805491611f8283612eda565b919050555050505050565b611f9860003361193e565b611fb45760405162461bcd60e51b8152600401610a7d9061310e565b60048190556040518181527f4f1c9c7efb48c0ca028860e92a42e8359606126bb2d8eb7eb62711793a3caa3590602001611aa7565b611ff460003361193e565b6120105760405162461bcd60e51b8152600401610a7d9061310e565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f620e7fb0cccb30fce2c95f32e301054c7ba7fd3520a8f42891915c9d10efe95f90602001611aa7565b600081815260016020526040902060020180546060919061207e90612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546120aa90612b8b565b8015610f1b5780601f106120cc57610100808354040283529160200191610f1b565b820191906000526020600020905b8154815290600101906020018083116120da5750939695505050505050565b600082815260208190526040902060010154612114816123b1565b610caf838361255b565b6000818152600160205260409020546001600160a01b031633146121845760405162461bcd60e51b815260206004820152601a60248201527f4761734d6f6e6574697a6174696f6e3a206e6f74206f776e65720000000000006044820152606401610a7d565b600081815260076020526040902054156121eb5760405162461bcd60e51b815260206004820152602260248201527f4761734d6f6e6574697a6174696f6e3a206861732070656e64696e6720636c61604482015261696d60f01b6064820152608401610a7d565b600081815260016020526040902060050154158061221f575060008181526001602052604090206005810154600390910154105b6122755760405162461bcd60e51b815260206004820152602160248201527f4761734d6f6e6574697a6174696f6e3a2070726f6a6563742064697361626c656044820152601960fa1b6064820152608401610a7d565b60035460408051633e5658eb60e11b815290516000926001600160a01b031691637cacb1d69160048083019260209291908290030181865afa1580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e39190612b72565b6000838152600160205260409020600301546006549192509081108015612314575060045461231282846130fb565b115b61236c5760405162461bcd60e51b815260206004820152602360248201527f4761734d6f6e6574697a6174696f6e3a206d757374207761697420746f20636c60448201526261696d60e81b6064820152608401610a7d565b600083815260076020526040908190208390555183907fb99e1d3fb58405bbf055b348a2f5a9a21fa20a42fa5788b1769b2721c2141050906112779085815260200190565b6123bb81336125c0565b50565b6123c8828261193e565b610eb4576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123fe3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b804710156124925760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a7d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146124df576040519150601f19603f3d011682016040523d82523d6000602084013e6124e4565b606091505b5050905080610caf5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a7d565b612565828261193e565b15610eb4576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6125ca828261193e565b610eb4576125d781612619565b6125e283602061262b565b6040516020016125f3929190613158565b60408051601f198184030181529082905262461bcd60e51b8252610a7d91600401612b5f565b6060610bb86001600160a01b03831660145b6060600061263a8360026131cd565b612645906002613145565b67ffffffffffffffff81111561265d5761265d612d70565b6040519080825280601f01601f191660200182016040528015612687576020820181803683370190505b509050600360fc1b816000815181106126a2576126a2612fb3565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106126d1576126d1612fb3565b60200101906001600160f81b031916908160001a90535060006126f58460026131cd565b612700906001613145565b90505b6001811115612778576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061273457612734612fb3565b1a60f81b82828151811061274a5761274a612fb3565b60200101906001600160f81b031916908160001a90535060049490941c93612771816131e4565b9050612703565b5083156127c75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a7d565b9392505050565b50805460008255906000526020600020908101906123bb91905b808211156127fc57600081556001016127e8565b5090565b60006020828403121561281257600080fd5b81356001600160e01b0319811681146127c757600080fd5b60006020828403121561283c57600080fd5b5035919050565b60005b8381101561285e578181015183820152602001612846565b50506000910152565b6000815180845261287f816020860160208601612843565b601f01601f19169290920160200192915050565b6001600160a01b0387811682528616602082015260c0604082018190526000906128bf90830187612867565b606083019590955250608081019290925260a0909101529392505050565b6001600160a01b03811681146123bb57600080fd5b6000806040838503121561290557600080fd5b823591506020830135612917816128dd565b809150509250929050565b60006020828403121561293457600080fd5b81356127c7816128dd565b6020808252825182820181905260009190848201906040850190845b818110156129805783516001600160a01b03168352928401929184019160010161295b565b50909695505050505050565b60008083601f84011261299e57600080fd5b50813567ffffffffffffffff8111156129b657600080fd5b6020830191508360208285010111156129ce57600080fd5b9250929050565b6000806000604084860312156129ea57600080fd5b83359250602084013567ffffffffffffffff811115612a0857600080fd5b612a148682870161298c565b9497909650939450505050565b60008060008060008060808789031215612a3a57600080fd5b8635612a45816128dd565b95506020870135612a55816128dd565b9450604087013567ffffffffffffffff80821115612a7257600080fd5b612a7e8a838b0161298c565b90965094506060890135915080821115612a9757600080fd5b818901915089601f830112612aab57600080fd5b813581811115612aba57600080fd5b8a60208260051b8501011115612acf57600080fd5b6020830194508093505050509295509295509295565b60008060408385031215612af857600080fd5b50508035926020909101359150565b60008060408385031215612b1a57600080fd5b8235612b25816128dd565b946020939093013593505050565b600080600060608486031215612b4857600080fd5b505081359360208301359350604090920135919050565b6020815260006127c76020830184612867565b600060208284031215612b8457600080fd5b5051919050565b600181811c90821680612b9f57607f821691505b602082108103612bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4761734d6f6e6574697a6174696f6e3a206e6f742066756e6473206d616e616760408201526132b960f11b606082015260800190565b6020808252602e908201527f4761734d6f6e6574697a6174696f6e3a206e6f742070726f6a65637473206d6160408201526d3730b3b2b91037b91037bbb732b960911b606082015260800190565b60208082526027908201527f4761734d6f6e6574697a6174696f6e3a2070726f6a65637420646f6573206e6f6040820152661d08195e1a5cdd60ca1b606082015260800190565b60208082526025908201527f4761734d6f6e6574697a6174696f6e3a206e6f742070726f6a65637473206d616040820152643730b3b2b960d91b606082015260800190565b6020808252602c908201527f4761734d6f6e6574697a6174696f6e3a20636f6e747261637420616c7265616460408201526b1e481c9959da5cdd195c995960a21b606082015260800190565b60208082526023908201527f4761734d6f6e6574697a6174696f6e3a20656d707479206d657461646174612060408201526275726960e81b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b601f821115610caf57600081815260208120601f850160051c81016020861015612dad5750805b601f850160051c820191505b81811015612dcc57828155600101612db9565b505050505050565b67ffffffffffffffff831115612dec57612dec612d70565b612e0083612dfa8354612b8b565b83612d86565b6000601f841160018114612e345760008515612e1c5750838201355b600019600387901b1c1916600186901b178355612e8e565b600083815260209020601f19861690835b82811015612e655786850135825560209485019460019092019101612e45565b5086821015612e825760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601160045260246000fd5b600060018201612eec57612eec612ec4565b5060010190565b815167ffffffffffffffff811115612f0d57612f0d612d70565b612f2181612f1b8454612b8b565b84612d86565b602080601f831160018114612f565760008415612f3e5750858301515b600019600386901b1c1916600185901b178555612dcc565b600085815260208120601f198616915b82811015612f8557888601518255948401946001909101908401612f66565b5085821015612fa35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b85811015613007578135612fec816128dd565b6001600160a01b031687529582019590820190600101612fd9565b509495945050505050565b60608152600080865461302481612b8b565b8060608601526080600180841660008114613046576001811461306057613091565b60ff1985168884015283151560051b880183019550613091565b8b60005260208060002060005b868110156130885781548b820187015290840190820161306d565b8a018501975050505b505050505085602084015282810360408401526130af818587612fc9565b979650505050505050565b60208082526021908201527f4761734d6f6e6574697a6174696f6e3a206e6f20636c61696d207265717565736040820152601d60fa1b606082015260800190565b81810381811115610bb857610bb8612ec4565b6020808252601a908201527f4761734d6f6e6574697a6174696f6e3a206e6f742061646d696e000000000000604082015260600190565b80820180821115610bb857610bb8612ec4565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613190816017850160208801612843565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516131c1816028840160208801612843565b01602801949350505050565b8082028115828204841417610bb857610bb8612ec4565b6000816131f3576131f3612ec4565b50600019019056fe979b77ba2fd37b608c52b1185e9b8e96ba2ff2e0c1dff47d2959620ef0ab3861a26469706673582212203d3d1375e6e22bee2843e83bba4ea790735fc753553d3f3ec185fce9d1b3957e64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fc00face0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : sfcAddress (address): 0xFC00FACE00000000000000000000000000000000
Arg [1] : rewardClaimEpochsFrequencyLimit (uint256): 5
Arg [2] : rewardClaimRequiredConfirmations (uint256): 3
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000fc00face00000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode Sourcemap
38515:22463:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60957:10;:8;:10::i;:::-;38515:22463;;;;;32631:204;;;;;;;;;;-1:-1:-1;32631:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;32631:204:0;;;;;;;;60311:166;;;;;;;;;;-1:-1:-1;60311:166:0;;;;;:::i;:::-;60396:7;60423:30;;;:19;:30;;;;;:46;;;;60311:166;;;;828:25:1;;;816:2;801:18;60311:166:0;682:177:1;43640:32:0;;;;;;;;;;;;;;;;41695:43;;;;;;;;;;-1:-1:-1;41695:43:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;58696:144::-;;;;;;;;;;-1:-1:-1;58696:144:0;;;;;:::i;:::-;58771:7;58798:19;;;:8;:19;;;;;:34;;;;58696:144;34454:131;;;;;;;;;;-1:-1:-1;34454:131:0;;;;;:::i;:::-;34528:7;34555:12;;;;;;;;;;:22;;;;34454:131;60020:172;;;;;;;;;;-1:-1:-1;60020:172:0;;;;;:::i;:::-;60108:7;60135:30;;;:19;:30;;;;;:49;;;;60020:172;34895:147;;;;;;;;;;-1:-1:-1;34895:147:0;;;;;:::i;:::-;;:::i;56101:308::-;;;;;;;;;;-1:-1:-1;56101:308:0;;;;;:::i;:::-;;:::i;40450:57::-;;;;;;;;;;;;40488:19;40450:57;;54755:474;;;;;;;;;;-1:-1:-1;54755:474:0;;;;;:::i;:::-;;:::i;36039:218::-;;;;;;;;;;-1:-1:-1;36039:218:0;;;;;:::i;:::-;;:::i;42261:47::-;;;;;;;;;;;;;;;;60614:167;;;;;;;;;;-1:-1:-1;60614:167:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40788:77::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40788:77:0;;58947:146;;;;;;;;;;-1:-1:-1;58947:146:0;;;;;:::i;:::-;59023:7;59050:19;;;:8;:19;;;;;:35;;;;58947:146;59467:140;;;;;;;;;;-1:-1:-1;59467:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;59573:26:0;59546:7;59573:26;;;:9;:26;;;;;;;59467:140;52067:508;;;;;;;;;;-1:-1:-1;52067:508:0;;;;;:::i;:::-;;:::i;51339:552::-;;;;;;;;;;-1:-1:-1;51339:552:0;;;;;:::i;:::-;;:::i;41879:44::-;;;;;;;;;;-1:-1:-1;41879:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;42123:37;;;;;;;;;;;;;;;;59198:142;;;;;;;;;;-1:-1:-1;59198:142:0;;;;;:::i;:::-;59272:7;59299:19;;;:8;:19;;;;;:33;;;;59198:142;53419:515;;;;;;;;;;-1:-1:-1;53419:515:0;;;;;:::i;:::-;;:::i;50719:506::-;;;;;;;;;;-1:-1:-1;50719:506:0;;;;;:::i;:::-;;:::i;49364:1236::-;;;;;;;;;;-1:-1:-1;49364:1236:0;;;;;:::i;:::-;;:::i;42008:15::-;;;;;;;;;;-1:-1:-1;42008:15:0;;;;-1:-1:-1;;;;;42008:15:0;;;;;;-1:-1:-1;;;;;6553:32:1;;;6535:51;;6523:2;6508:18;42008:15:0;6376:216:1;48157:922:0;;;;;;;;;;-1:-1:-1;48157:922:0;;;;;:::i;:::-;;:::i;32927:147::-;;;;;;;;;;-1:-1:-1;32927:147:0;;;;;:::i;:::-;;:::i;57963:126::-;;;;;;;;;;-1:-1:-1;57963:126:0;;;;;:::i;:::-;58029:7;58056:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;58056:25:0;;57963:126;54095:519;;;;;;;;;;-1:-1:-1;54095:519:0;;;;;:::i;:::-;;:::i;32032:49::-;;;;;;;;;;-1:-1:-1;32032:49:0;32077:4;32032:49;;55280:299;;;:::i;59739:159::-;;;;;;;;;;-1:-1:-1;59739:159:0;;;;;:::i;:::-;59816:7;59843:30;;;:19;:30;;;;;:47;;59739:159;56902:279;;;;;;;;;;-1:-1:-1;56902:279:0;;;;;:::i;:::-;;:::i;57691:177::-;;;;;;;;;;-1:-1:-1;57691:177:0;;;;;:::i;:::-;57778:4;57802:30;;;:19;:30;;;;;;:47;:58;;57691:177;55726:269;;;;;;;;;;-1:-1:-1;55726:269:0;;;;;:::i;:::-;;:::i;40619:71::-;;;;;;;;;;;;40664:26;40619:71;;52744:512;;;;;;;;;;-1:-1:-1;52744:512:0;;;;;:::i;:::-;;:::i;43484:72::-;;;;;;;;;;-1:-1:-1;43484:72:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7588:25:1;;;7644:2;7629:18;;7622:34;;;;7672:18;;;7665:34;7576:2;7561:18;43484:72:0;7386:319:1;46125:1867:0;;;;;;;;;;-1:-1:-1;46125:1867:0;;;;;:::i;:::-;;:::i;56524:263::-;;;;;;;;;;-1:-1:-1;56524:263:0;;;;;:::i;:::-;;:::i;58196:148::-;;;;;;;;;;-1:-1:-1;58196:148:0;;;;;:::i;:::-;58273:7;58300:19;;;:8;:19;;;;;;;;:36;;-1:-1:-1;;;;;58300:36:0;;58196:148;57279:220;;;;;;;;;;-1:-1:-1;57279:220:0;;;;;:::i;:::-;;:::i;58446:144::-;;;;;;;;;;-1:-1:-1;58446:144:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42386:34::-;;;;;;;;;;;;;;;;35335:149;;;;;;;;;;-1:-1:-1;35335:149:0;;;;;:::i;:::-;;:::i;44940:964::-;;;;;;;;;;-1:-1:-1;44940:964:0;;;;;:::i;:::-;;:::i;40985:73::-;;;;;;;;;;;;41031:27;40985:73;;55280:299;55334:34;40488:19;27719:10;32927:147;:::i;55334:34::-;55326:74;;;;-1:-1:-1;;;55326:74:0;;8458:2:1;55326:74:0;;;8440:21:1;8497:2;8477:18;;;8470:30;8536:29;8516:18;;;8509:57;8583:18;;55326:74:0;;;;;;;;;55431:1;55419:9;:13;55411:56;;;;-1:-1:-1;;;55411:56:0;;8814:2:1;55411:56:0;;;8796:21:1;8853:2;8833:18;;;8826:30;8892:32;8872:18;;;8865:60;8942:18;;55411:56:0;8612:354:1;55411:56:0;55496:3;;;;;;;;;-1:-1:-1;;;;;55496:3:0;-1:-1:-1;;;;;55496:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55478:15;:42;55536:35;;55561:9;828:25:1;;27719:10:0;;55536:35;;816:2:1;801:18;55536:35:0;;;;;;;55280:299::o;32631:204::-;32716:4;-1:-1:-1;;;;;;32740:47:0;;-1:-1:-1;;;32740:47:0;;:87;;-1:-1:-1;;;;;;;;;;11161:40:0;;;32791:36;32733:94;32631:204;-1:-1:-1;;32631:204:0:o;41695:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41695:43:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34895:147::-;34528:7;34555:12;;;;;;;;;;:22;;;32523:16;32534:4;32523:10;:16::i;:::-;35009:25:::1;35020:4;35026:7;35009:10;:25::i;:::-;34895:147:::0;;;:::o;56101:308::-;56182:41;40664:26;27719:10;32927:147;:::i;56182:41::-;56174:88;;;;-1:-1:-1;;;56174:88:0;;;;;;;:::i;:::-;56291:21;56323:28;-1:-1:-1;;;;;56323:19:0;;56291:21;56323:19;:28::i;:::-;56382:9;-1:-1:-1;;;;;56367:34:0;;56393:7;56367:34;;;;828:25:1;;816:2;801:18;;682:177;56367:34:0;;;;;;;;56163:246;56101:308;:::o;54755:474::-;54859:19;;;;:8;:19;;;;;:25;-1:-1:-1;;;;;54859:25:0;27719:10;54859:41;;:89;;-1:-1:-1;54904:44:0;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;54904:44::-;54837:185;;;;-1:-1:-1;;;54837:185:0;;;;;;;:::i;:::-;55078:1;55041:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;55041:25:0;55033:91;;;;-1:-1:-1;;;55033:91:0;;;;;;;:::i;:::-;55135:19;;;;:8;:19;;;;;;;;;:33;;-1:-1:-1;;;;;;55135:33:0;-1:-1:-1;;;;;55135:33:0;;;;;;;;55184:37;;6535:51:1;;;55135:19:0;;55184:37;;6508:18:1;55184:37:0;6376:216:1;36039:218:0;-1:-1:-1;;;;;36135:23:0;;27719:10;36135:23;36127:83;;;;-1:-1:-1;;;36127:83:0;;10973:2:1;36127:83:0;;;10955:21:1;11012:2;10992:18;;;10985:30;11051:34;11031:18;;;11024:62;-1:-1:-1;;;11102:18:1;;;11095:45;11157:19;;36127:83:0;10771:411:1;36127:83:0;36223:26;36235:4;36241:7;36223:11;:26::i;:::-;36039:218;;:::o;60614:167::-;60731:30;;;;:19;:30;;;;;;;;;:42;;60724:49;;;;;;;;;;;;;;;;;60695:16;;60724:49;;;60731:42;60724:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60724:49:0;;;;;;;;;;;;;;;;;;;;;;;60614:167;;;:::o;52067:508::-;52167:44;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;52167:44::-;52159:94;;;;-1:-1:-1;;;52159:94:0;;;;;;;:::i;:::-;52309:1;52272:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;52272:25:0;52264:91;;;;-1:-1:-1;;;52264:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52374:26:0;;;;;;:9;:26;;;;;;:31;52366:88;;;;-1:-1:-1;;;52366:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52465:26:0;;;;;;:9;:26;;;;;;:38;;;52519:48;52494:9;;52519:48;;;52067:508;;:::o;51339:552::-;51409:44;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;51409:44::-;51401:94;;;;-1:-1:-1;;;51401:94:0;;;;;;;:::i;:::-;51551:1;51514:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;51514:25:0;51506:91;;;;-1:-1:-1;;;51506:91:0;;;;;;;:::i;:::-;51616:19;;;;:8;:19;;;;;:33;;;:38;;51608:82;;;;-1:-1:-1;;;51608:82:0;;12208:2:1;51608:82:0;;;12190:21:1;12247:2;12227:18;;;12220:30;12286:33;12266:18;;;12259:61;12337:18;;51608:82:0;12006:355:1;51608:82:0;51739:3;;;;;;;;;-1:-1:-1;;;;;51739:3:0;-1:-1:-1;;;;;51739:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51701:19;;;;:8;:19;;;;;;:35;;;:56;;;51768:33;;:37;;;;51821:62;51710:9;;51821:62;;;;828:25:1;;816:2;801:18;;682:177;51821:62:0;;;;;;;;51339:552;:::o;53419:515::-;53529:44;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;53529:44::-;53521:94;;;;-1:-1:-1;;;53521:94:0;;;;;;;:::i;:::-;53671:1;53634:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;53634:25:0;53626:91;;;;-1:-1:-1;;;53626:91:0;;;;;;;:::i;:::-;53736:29;53728:77;;;;-1:-1:-1;;;53728:77:0;;;;;;;:::i;:::-;53816:19;;;;:8;:19;;;;;:31;;:45;53850:11;;53816:31;:45;:::i;:::-;;53903:9;53877:49;53914:11;;53877:49;;;;;;;:::i;:::-;;;;;;;;53419:515;;;:::o;50719:506::-;50790:44;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;50790:44::-;50782:94;;;;-1:-1:-1;;;50782:94:0;;;;;;;:::i;:::-;50932:1;50895:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;50895:25:0;50887:91;;;;-1:-1:-1;;;50887:91:0;;;;;;;:::i;:::-;50997:19;;;;:8;:19;;;;;:33;;;:38;50989:85;;;;-1:-1:-1;;;50989:85:0;;15557:2:1;50989:85:0;;;15539:21:1;15596:2;15576:18;;;15569:30;15635:34;15615:18;;;15608:62;-1:-1:-1;;;15686:18:1;;;15679:32;15728:19;;50989:85:0;15355:398:1;50989:85:0;51121:3;;;;;;;;;-1:-1:-1;;;;;51121:3:0;-1:-1:-1;;;;;51121:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51085:19;;;;:8;:19;;;;;;;:33;;:54;;;51155:62;51094:9;;51155:62;;;;828:25:1;;816:2;801:18;;682:177;49364:1236:0;49562:44;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;49562:44::-;49554:94;;;;-1:-1:-1;;;49554:94:0;;;;;;;:::i;:::-;49667:29;49659:77;;;;-1:-1:-1;;;49659:77:0;;;;;;;:::i;:::-;49747:13;:15;;;:13;:15;;;:::i;:::-;;;;;;49799:248;;;;;;;;49829:5;-1:-1:-1;;;;;49799:248:0;;;;;49867:16;-1:-1:-1;;;;;49799:248:0;;;;;49911:11;;49799:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49799:248:0;;;-1:-1:-1;;;49799:248:0;;;;;;;;49986:3;;49799:248;49986:18;;-1:-1:-1;;;49986:18:0;;;;49799:248;;;;;-1:-1:-1;;;;;49986:3:0;;;;:16;;:18;;;;;;;;;;;:3;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49799:248;;50034:1;49799:248;;;;;;;49782:13;;49773:23;;:8;:23;;;;;;;;:274;;;;-1:-1:-1;;;;;;49773:274:0;;;-1:-1:-1;;;;;49773:274:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;49773:274:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50058:234:0;50078:27;;;50058:234;;;50135:9;:30;50145:16;;50162:1;50145:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50135:30:0;;;;;;;;;;;;-1:-1:-1;50135:30:0;;:35;50127:92;;;;-1:-1:-1;;;50127:92:0;;;;;;;:::i;:::-;50267:13;;50234:9;:30;50244:16;;50261:1;50244:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50234:30:0;;;;;;;;;;;;-1:-1:-1;50234:30:0;:46;50107:3;;;:::i;:::-;;;50058:234;;;-1:-1:-1;50415:13:0;;50406:23;;;;:8;:23;;;;;;;;;:40;;;;50362:29;;50511:39;;;;50307:285;;-1:-1:-1;;;;;50406:40:0;;;;50362:29;;;;;50415:13;;50307:285;;;;50461:35;;;;;50565:16;;;;50307:285;:::i;:::-;;;;;;;;49364:1236;;;;;;:::o;48157:922::-;57778:4;57802:30;;;:19;:30;;;;;:47;:58;;48244:91;;;;-1:-1:-1;;;48244:91:0;;;;;;;:::i;:::-;48346:41;48390:30;;;:19;:30;;;;;;;;48500:8;:19;;;;;;:25;27719:10;-1:-1:-1;;;;;48500:25:0;;;:41;48496:469;;48728:22;;48701:7;:24;;;48680:3;;;;;;;;;-1:-1:-1;;;;;48680:3:0;-1:-1:-1;;;;;48680:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;:70;48654:168;;;;-1:-1:-1;;;48654:168:0;;20030:2:1;48654:168:0;;;20012:21:1;20069:2;20049:18;;;20042:30;20108:34;20088:18;;;20081:62;-1:-1:-1;;;20159:18:1;;;20152:34;20203:19;;48654:168:0;19828:400:1;48654:168:0;48496:469;;;48863:42;41031:27;27719:10;32927:147;:::i;48863:42::-;48855:98;;;;-1:-1:-1;;;48855:98:0;;20435:2:1;48855:98:0;;;20417:21:1;20474:2;20454:18;;;20447:30;20513:34;20493:18;;;20486:62;-1:-1:-1;;;20564:18:1;;;20557:41;20615:19;;48855:98:0;20233:407:1;48855:98:0;48982:30;;;;:19;:30;;;;;48975:37;;;;;;;;;;;;;;;48982:30;48975:37;;;;48982:30;48975:37;:::i;:::-;;;49048:9;49028:43;49059:11;49028:43;;;;828:25:1;;816:2;801:18;;682:177;32927:147:0;33013:4;33037:12;;;;;;;;;;;-1:-1:-1;;;;;33037:29:0;;;;;;;;;;;;;;;32927:147::o;54095:519::-;54214:19;;;;:8;:19;;;;;:25;-1:-1:-1;;;;;54214:25:0;27719:10;54214:41;;:89;;-1:-1:-1;54259:44:0;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;54259:44::-;54192:185;;;;-1:-1:-1;;;54192:185:0;;;;;;;:::i;:::-;54433:1;54396:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;54396:25:0;54388:91;;;;-1:-1:-1;;;54388:91:0;;;;;;;:::i;:::-;54490:19;;;;:8;:19;;;;;;;;;:36;;;:48;;-1:-1:-1;;;;;;54490:48:0;-1:-1:-1;;;;;54490:48:0;;;;;;;;54554:52;;6535:51:1;;;54490:19:0;;54554:52;;6508:18:1;54554:52:0;6376:216:1;56902:279:0;56991:41;32077:4;27719:10;32927:147;:::i;56991:41::-;56983:80;;;;-1:-1:-1;;;56983:80:0;;;;;;;:::i;:::-;57074:32;:40;;;57130:43;;828:25:1;;;57130:43:0;;816:2:1;801:18;57130:43:0;;;;;;;;56902:279;:::o;55726:269::-;55820:41;40664:26;27719:10;32927:147;:::i;55820:41::-;55812:88;;;;-1:-1:-1;;;55812:88:0;;;;;;;:::i;:::-;55911:27;-1:-1:-1;;;;;55911:19:0;;55931:6;55911:19;:27::i;52744:512::-;52847:44;-1:-1:-1;;;;;;;;;;;27719:10:0;32927:147;:::i;52847:44::-;52839:94;;;;-1:-1:-1;;;52839:94:0;;;;;;;:::i;:::-;52989:1;52952:19;;;:8;:19;;;;;:25;-1:-1:-1;;;;;52952:25:0;52944:91;;;;-1:-1:-1;;;52944:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53054:26:0;;;;;;:9;:26;;;;;;:39;;53046:92;;;;-1:-1:-1;;;53046:92:0;;21202:2:1;53046:92:0;;;21184:21:1;21241:2;21221:18;;;21214:30;21280:34;21260:18;;;21253:62;-1:-1:-1;;;21331:18:1;;;21324:38;21379:19;;53046:92:0;21000:404:1;53046:92:0;-1:-1:-1;;;;;53156:26:0;;;;;;:9;:26;;;;;;53149:33;;;53198:50;53221:9;;53198:50;;;52744:512;;:::o;46125:1867::-;46237:42;41031:27;27719:10;32927:147;:::i;46237:42::-;46229:90;;;;-1:-1:-1;;;46229:90:0;;21611:2:1;46229:90:0;;;21593:21:1;21650:2;21630:18;;;21623:30;21689:34;21669:18;;;21662:62;-1:-1:-1;;;21740:18:1;;;21733:33;21783:19;;46229:90:0;21409:399:1;46229:90:0;57778:4;57802:30;;;:19;:30;;;;;:47;:58;;46330:91;;;;-1:-1:-1;;;46330:91:0;;;;;;;:::i;:::-;46449:1;46440:6;:10;46432:58;;;;-1:-1:-1;;;46432:58:0;;22015:2:1;46432:58:0;;;21997:21:1;22054:2;22034:18;;;22027:30;22093:34;22073:18;;;22066:62;-1:-1:-1;;;22144:18:1;;;22137:33;22187:19;;46432:58:0;21813:399:1;46432:58:0;46501:41;46545:30;;;:19;:30;;;;;46643:26;;;;46545:30;;46643:31;46639:525;;46691:23;;;:32;;;46639:525;;;46772:6;46745:7;:23;;;:33;46741:423;;46994:23;;;;46945:81;;;7588:25:1;;;7644:2;7629:18;;7622:34;;;;7672:18;;7665:34;;;46970:9:0;;46945:81;;7576:2:1;7561:18;46945:81:0;;;;;;;47048:30;;;;:19;:30;;;;;47041:37;;;;;;;;;;;;;;;47048:30;47041:37;;;;47048:30;47041:37;:::i;:::-;-1:-1:-1;;47093:38:0;;;;-1:-1:-1;;46125:1867:0:o;46741:423::-;47244:9;47239:168;47263:19;;;:26;47259:30;;47239:168;;;27719:10;-1:-1:-1;;;;;47319:38:0;:7;:19;;47339:1;47319:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;47319:22:0;:38;47311:84;;;;-1:-1:-1;;;47311:84:0;;22419:2:1;47311:84:0;;;22401:21:1;22458:2;22438:18;;;22431:30;22497:34;22477:18;;;22470:62;-1:-1:-1;;;22548:18:1;;;22541:31;22589:19;;47311:84:0;22217:397:1;47311:84:0;47291:3;;;:::i;:::-;;;47239:168;;;-1:-1:-1;47536:32:0;;47502:26;;;;;:30;;;:::i;:::-;:66;47498:370;;47592:30;;;;:19;:30;;;;;47585:37;;;;;;;;;;;;;;;47592:30;47585:37;;;;47592:30;47585:37;:::i;:::-;-1:-1:-1;;47637:19:0;;;;:8;:19;;;;;;;;:34;;;:48;;;47708:36;;47700:63;;-1:-1:-1;;;;;47708:36:0;47756:6;47700:55;:63::i;:::-;47783:52;;;22923:25:1;;;22979:2;22964:18;;22957:34;;;47804:9:0;;47783:52;;22896:18:1;47783:52:0;;;;;;;47850:7;46125:1867;;;:::o;47498:370::-;47907:19;;;:38;;;;;;;;-1:-1:-1;47907:38:0;;;;;;;;;;;-1:-1:-1;;;;;;47907:38:0;27719:10;47907:38;;;47956:26;;:28;;;;;;:::i;:::-;;;;;;46218:1774;46125:1867;;;:::o;56524:263::-;56614:41;32077:4;27719:10;32927:147;:::i;56614:41::-;56606:80;;;;-1:-1:-1;;;56606:80:0;;;;;;;:::i;:::-;56697:22;:30;;;56743:36;;828:25:1;;;56743:36:0;;816:2:1;801:18;56743:36:0;682:177:1;57279:220:0;57349:41;32077:4;27719:10;32927:147;:::i;57349:41::-;57341:80;;;;-1:-1:-1;;;57341:80:0;;;;;;;:::i;:::-;57432:3;:18;;-1:-1:-1;;;;;;57432:18:0;-1:-1:-1;;;;;57432:18:0;;;;;;;;57466:25;;6535:51:1;;;57466:25:0;;6523:2:1;6508:18;57466:25:0;6376:216:1;58446:144:0;58551:19;;;;:8;:19;;;;;:31;;58544:38;;58518:13;;58551:31;58544:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58544:38:0;;58446:144;-1:-1:-1;;;;;;58446:144:0:o;35335:149::-;34528:7;34555:12;;;;;;;;;;:22;;;32523:16;32534:4;32523:10;:16::i;:::-;35450:26:::1;35462:4;35468:7;35450:11;:26::i;44940:964::-:0;45011:19;;;;:8;:19;;;;;:25;-1:-1:-1;;;;;45011:25:0;27719:10;45011:41;45003:80;;;;-1:-1:-1;;;45003:80:0;;23204:2:1;45003:80:0;;;23186:21:1;23243:2;23223:18;;;23216:30;23282:28;23262:18;;;23255:56;23328:18;;45003:80:0;23002:350:1;45003:80:0;45102:30;;;;:19;:30;;;;;:47;:52;45094:99;;;;-1:-1:-1;;;45094:99:0;;23559:2:1;45094:99:0;;;23541:21:1;23598:2;23578:18;;;23571:30;23637:34;23617:18;;;23610:62;-1:-1:-1;;;23688:18:1;;;23681:32;23730:19;;45094:99:0;23357:398:1;45094:99:0;45226:19;;;;:8;:19;;;;;:33;;;:38;;:125;;-1:-1:-1;45318:19:0;;;;:8;:19;;;;;:33;;;;45281:34;;;;;:70;45226:125;45204:208;;;;-1:-1:-1;;;45204:208:0;;23962:2:1;45204:208:0;;;23944:21:1;24001:2;23981:18;;;23974:30;24040:34;24020:18;;;24013:62;-1:-1:-1;;;24091:18:1;;;24084:31;24132:19;;45204:208:0;23760:397:1;45204:208:0;45439:3;;:24;;;-1:-1:-1;;;45439:24:0;;;;45423:13;;-1:-1:-1;;;;;45439:3:0;;:22;;:24;;;;;;;;;;;;;;:3;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45474:29;45506:19;;;:8;:19;;;;;:34;;;45597:15;;45423:40;;-1:-1:-1;45506:34:0;45573:39;;:110;;;;-1:-1:-1;45661:22:0;;45629:29;45637:21;45629:5;:29;:::i;:::-;:54;45573:110;45551:195;;;;-1:-1:-1;;;45551:195:0;;24364:2:1;45551:195:0;;;24346:21:1;24403:2;24383:18;;;24376:30;24442:34;24422:18;;;24415:62;-1:-1:-1;;;24493:18:1;;;24486:33;24536:19;;45551:195:0;24162:399:1;45551:195:0;45787:30;;;;:19;:30;;;;;;;:55;;;45858:38;45807:9;;45858:38;;;;45837:5;828:25:1;;816:2;801:18;;682:177;33378:105:0;33445:30;33456:4;27719:10;33445;:30::i;:::-;33378:105;:::o;37636:238::-;37720:22;37728:4;37734:7;37720;:22::i;:::-;37715:152;;37759:6;:12;;;;;;;;;;;-1:-1:-1;;;;;37759:29:0;;;;;;;;;:36;;-1:-1:-1;;37759:36:0;37791:4;37759:36;;;37842:12;27719:10;;27639:98;37842:12;-1:-1:-1;;;;;37815:40:0;37833:7;-1:-1:-1;;;;;37815:40:0;37827:4;37815:40;;;;;;;;;;37636:238;;:::o;2471:317::-;2586:6;2561:21;:31;;2553:73;;;;-1:-1:-1;;;2553:73:0;;24768:2:1;2553:73:0;;;24750:21:1;24807:2;24787:18;;;24780:30;24846:31;24826:18;;;24819:59;24895:18;;2553:73:0;24566:353:1;2553:73:0;2640:12;2658:9;-1:-1:-1;;;;;2658:14:0;2680:6;2658:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2639:52;;;2710:7;2702:78;;;;-1:-1:-1;;;2702:78:0;;25336:2:1;2702:78:0;;;25318:21:1;25375:2;25355:18;;;25348:30;25414:34;25394:18;;;25387:62;25485:28;25465:18;;;25458:56;25531:19;;2702:78:0;25134:422:1;38054:239:0;38138:22;38146:4;38152:7;38138;:22::i;:::-;38134:152;;;38209:5;38177:12;;;;;;;;;;;-1:-1:-1;;;;;38177:29:0;;;;;;;;;;:37;;-1:-1:-1;;38177:37:0;;;38234:40;27719:10;;38177:12;;38234:40;;38209:5;38234:40;38054:239;;:::o;33773:492::-;33862:22;33870:4;33876:7;33862;:22::i;:::-;33857:401;;34050:28;34070:7;34050:19;:28::i;:::-;34151:38;34179:4;34186:2;34151:19;:38::i;:::-;33955:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;33955:257:0;;;;;;;;;;-1:-1:-1;;;33901:345:0;;;;;;;:::i;29963:151::-;30021:13;30054:52;-1:-1:-1;;;;;30066:22:0;;28118:2;29359:447;29434:13;29460:19;29492:10;29496:6;29492:1;:10;:::i;:::-;:14;;29505:1;29492:14;:::i;:::-;29482:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29482:25:0;;29460:47;;-1:-1:-1;;;29518:6:0;29525:1;29518:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;29518:15:0;;;;;;;;;-1:-1:-1;;;29544:6:0;29551:1;29544:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;29544:15:0;;;;;;;;-1:-1:-1;29575:9:0;29587:10;29591:6;29587:1;:10;:::i;:::-;:14;;29600:1;29587:14;:::i;:::-;29575:26;;29570:131;29607:1;29603;:5;29570:131;;;-1:-1:-1;;;29651:5:0;29659:3;29651:11;29642:21;;;;;;;:::i;:::-;;;;29630:6;29637:1;29630:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;29630:33:0;;;;;;;;-1:-1:-1;29688:1:0;29678:11;;;;;29610:3;;;:::i;:::-;;;29570:131;;;-1:-1:-1;29719:10:0;;29711:55;;;;-1:-1:-1;;;29711:55:0;;26894:2:1;29711:55:0;;;26876:21:1;;;26913:18;;;26906:30;26972:34;26952:18;;;26945:62;27024:18;;29711:55:0;26692:356:1;29711:55:0;29791:6;29359:447;-1:-1:-1;;;29359:447:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:180;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;-1:-1:-1;648:23:1;;497:180;-1:-1:-1;497:180:1:o;864:250::-;949:1;959:113;973:6;970:1;967:13;959:113;;;1049:11;;;1043:18;1030:11;;;1023:39;995:2;988:10;959:113;;;-1:-1:-1;;1106:1:1;1088:16;;1081:27;864:250::o;1119:271::-;1161:3;1199:5;1193:12;1226:6;1221:3;1214:19;1242:76;1311:6;1304:4;1299:3;1295:14;1288:4;1281:5;1277:16;1242:76;:::i;:::-;1372:2;1351:15;-1:-1:-1;;1347:29:1;1338:39;;;;1379:4;1334:50;;1119:271;-1:-1:-1;;1119:271:1:o;1395:635::-;-1:-1:-1;;;;;1722:15:1;;;1704:34;;1774:15;;1769:2;1754:18;;1747:43;1826:3;1821:2;1806:18;;1799:31;;;1647:4;;1847:46;;1873:19;;1865:6;1847:46;:::i;:::-;1924:2;1909:18;;1902:34;;;;-1:-1:-1;1967:3:1;1952:19;;1945:35;;;;2011:3;1996:19;;;1989:35;1839:54;1395:635;-1:-1:-1;;;1395:635:1:o;2402:131::-;-1:-1:-1;;;;;2477:31:1;;2467:42;;2457:70;;2523:1;2520;2513:12;2538:315;2606:6;2614;2667:2;2655:9;2646:7;2642:23;2638:32;2635:52;;;2683:1;2680;2673:12;2635:52;2719:9;2706:23;2696:33;;2779:2;2768:9;2764:18;2751:32;2792:31;2817:5;2792:31;:::i;:::-;2842:5;2832:15;;;2538:315;;;;;:::o;2858:255::-;2925:6;2978:2;2966:9;2957:7;2953:23;2949:32;2946:52;;;2994:1;2991;2984:12;2946:52;3033:9;3020:23;3052:31;3077:5;3052:31;:::i;3438:658::-;3609:2;3661:21;;;3731:13;;3634:18;;;3753:22;;;3580:4;;3609:2;3832:15;;;;3806:2;3791:18;;;3580:4;3875:195;3889:6;3886:1;3883:13;3875:195;;;3954:13;;-1:-1:-1;;;;;3950:39:1;3938:52;;4045:15;;;;4010:12;;;;3986:1;3904:9;3875:195;;;-1:-1:-1;4087:3:1;;3438:658;-1:-1:-1;;;;;;3438:658:1:o;4353:348::-;4405:8;4415:6;4469:3;4462:4;4454:6;4450:17;4446:27;4436:55;;4487:1;4484;4477:12;4436:55;-1:-1:-1;4510:20:1;;4553:18;4542:30;;4539:50;;;4585:1;4582;4575:12;4539:50;4622:4;4614:6;4610:17;4598:29;;4674:3;4667:4;4658:6;4650;4646:19;4642:30;4639:39;4636:59;;;4691:1;4688;4681:12;4636:59;4353:348;;;;;:::o;4706:479::-;4786:6;4794;4802;4855:2;4843:9;4834:7;4830:23;4826:32;4823:52;;;4871:1;4868;4861:12;4823:52;4907:9;4894:23;4884:33;;4968:2;4957:9;4953:18;4940:32;4995:18;4987:6;4984:30;4981:50;;;5027:1;5024;5017:12;4981:50;5066:59;5117:7;5108:6;5097:9;5093:22;5066:59;:::i;:::-;4706:479;;5144:8;;-1:-1:-1;5040:85:1;;-1:-1:-1;;;;4706:479:1:o;5190:1181::-;5315:6;5323;5331;5339;5347;5355;5408:3;5396:9;5387:7;5383:23;5379:33;5376:53;;;5425:1;5422;5415:12;5376:53;5464:9;5451:23;5483:31;5508:5;5483:31;:::i;:::-;5533:5;-1:-1:-1;5590:2:1;5575:18;;5562:32;5603:33;5562:32;5603:33;:::i;:::-;5655:7;-1:-1:-1;5713:2:1;5698:18;;5685:32;5736:18;5766:14;;;5763:34;;;5793:1;5790;5783:12;5763:34;5832:59;5883:7;5874:6;5863:9;5859:22;5832:59;:::i;:::-;5910:8;;-1:-1:-1;5806:85:1;-1:-1:-1;5998:2:1;5983:18;;5970:32;;-1:-1:-1;6014:16:1;;;6011:36;;;6043:1;6040;6033:12;6011:36;6081:8;6070:9;6066:24;6056:34;;6128:7;6121:4;6117:2;6113:13;6109:27;6099:55;;6150:1;6147;6140:12;6099:55;6190:2;6177:16;6216:2;6208:6;6205:14;6202:34;;;6232:1;6229;6222:12;6202:34;6285:7;6280:2;6270:6;6267:1;6263:14;6259:2;6255:23;6251:32;6248:45;6245:65;;;6306:1;6303;6296:12;6245:65;6337:2;6333;6329:11;6319:21;;6359:6;6349:16;;;;;5190:1181;;;;;;;;:::o;6597:248::-;6665:6;6673;6726:2;6714:9;6705:7;6701:23;6697:32;6694:52;;;6742:1;6739;6732:12;6694:52;-1:-1:-1;;6765:23:1;;;6835:2;6820:18;;;6807:32;;-1:-1:-1;6597:248:1:o;7058:323::-;7134:6;7142;7195:2;7183:9;7174:7;7170:23;7166:32;7163:52;;;7211:1;7208;7201:12;7163:52;7250:9;7237:23;7269:31;7294:5;7269:31;:::i;:::-;7319:5;7371:2;7356:18;;;;7343:32;;-1:-1:-1;;;7058:323:1:o;7710:316::-;7787:6;7795;7803;7856:2;7844:9;7835:7;7831:23;7827:32;7824:52;;;7872:1;7869;7862:12;7824:52;-1:-1:-1;;7895:23:1;;;7965:2;7950:18;;7937:32;;-1:-1:-1;8016:2:1;8001:18;;;7988:32;;7710:316;-1:-1:-1;7710:316:1:o;8031:220::-;8180:2;8169:9;8162:21;8143:4;8200:45;8241:2;8230:9;8226:18;8218:6;8200:45;:::i;8971:184::-;9041:6;9094:2;9082:9;9073:7;9069:23;9065:32;9062:52;;;9110:1;9107;9100:12;9062:52;-1:-1:-1;9133:16:1;;8971:184;-1:-1:-1;8971:184:1:o;9160:380::-;9239:1;9235:12;;;;9282;;;9303:61;;9357:4;9349:6;9345:17;9335:27;;9303:61;9410:2;9402:6;9399:14;9379:18;9376:38;9373:161;;9456:10;9451:3;9447:20;9444:1;9437:31;9491:4;9488:1;9481:15;9519:4;9516:1;9509:15;9373:161;;9160:380;;;:::o;9545:398::-;9747:2;9729:21;;;9786:2;9766:18;;;9759:30;9825:34;9820:2;9805:18;;9798:62;-1:-1:-1;;;9891:2:1;9876:18;;9869:32;9933:3;9918:19;;9545:398::o;9948:410::-;10150:2;10132:21;;;10189:2;10169:18;;;10162:30;10228:34;10223:2;10208:18;;10201:62;-1:-1:-1;;;10294:2:1;10279:18;;10272:44;10348:3;10333:19;;9948:410::o;10363:403::-;10565:2;10547:21;;;10604:2;10584:18;;;10577:30;10643:34;10638:2;10623:18;;10616:62;-1:-1:-1;;;10709:2:1;10694:18;;10687:37;10756:3;10741:19;;10363:403::o;11187:401::-;11389:2;11371:21;;;11428:2;11408:18;;;11401:30;11467:34;11462:2;11447:18;;11440:62;-1:-1:-1;;;11533:2:1;11518:18;;11511:35;11578:3;11563:19;;11187:401::o;11593:408::-;11795:2;11777:21;;;11834:2;11814:18;;;11807:30;11873:34;11868:2;11853:18;;11846:62;-1:-1:-1;;;11939:2:1;11924:18;;11917:42;11991:3;11976:19;;11593:408::o;12366:399::-;12568:2;12550:21;;;12607:2;12587:18;;;12580:30;12646:34;12641:2;12626:18;;12619:62;-1:-1:-1;;;12712:2:1;12697:18;;12690:33;12755:3;12740:19;;12366:399::o;12770:127::-;12831:10;12826:3;12822:20;12819:1;12812:31;12862:4;12859:1;12852:15;12886:4;12883:1;12876:15;13028:545;13130:2;13125:3;13122:11;13119:448;;;13166:1;13191:5;13187:2;13180:17;13236:4;13232:2;13222:19;13306:2;13294:10;13290:19;13287:1;13283:27;13277:4;13273:38;13342:4;13330:10;13327:20;13324:47;;;-1:-1:-1;13365:4:1;13324:47;13420:2;13415:3;13411:12;13408:1;13404:20;13398:4;13394:31;13384:41;;13475:82;13493:2;13486:5;13483:13;13475:82;;;13538:17;;;13519:1;13508:13;13475:82;;;13479:3;;;13028:545;;;:::o;13749:1206::-;13873:18;13868:3;13865:27;13862:53;;;13895:18;;:::i;:::-;13924:94;14014:3;13974:38;14006:4;14000:11;13974:38;:::i;:::-;13968:4;13924:94;:::i;:::-;14044:1;14069:2;14064:3;14061:11;14086:1;14081:616;;;;14741:1;14758:3;14755:93;;;-1:-1:-1;14814:19:1;;;14801:33;14755:93;-1:-1:-1;;13706:1:1;13702:11;;;13698:24;13694:29;13684:40;13730:1;13726:11;;;13681:57;14861:78;;14054:895;;14081:616;12975:1;12968:14;;;13012:4;12999:18;;-1:-1:-1;;14117:17:1;;;14218:9;14240:229;14254:7;14251:1;14248:14;14240:229;;;14343:19;;;14330:33;14315:49;;14450:4;14435:20;;;;14403:1;14391:14;;;;14270:12;14240:229;;;14244:3;14497;14488:7;14485:16;14482:159;;;14621:1;14617:6;14611:3;14605;14602:1;14598:11;14594:21;14590:34;14586:39;14573:9;14568:3;14564:19;14551:33;14547:79;14539:6;14532:95;14482:159;;;14684:1;14678:3;14675:1;14671:11;14667:19;14661:4;14654:33;14054:895;;;13749:1206;;;:::o;14960:390::-;15119:2;15108:9;15101:21;15158:6;15153:2;15142:9;15138:18;15131:34;15215:6;15207;15202:2;15191:9;15187:18;15174:48;15271:1;15242:22;;;15266:2;15238:31;;;15231:42;;;;15334:2;15313:15;;;-1:-1:-1;;15309:29:1;15294:45;15290:54;;14960:390;-1:-1:-1;14960:390:1:o;15758:127::-;15819:10;15814:3;15810:20;15807:1;15800:31;15850:4;15847:1;15840:15;15874:4;15871:1;15864:15;15890:135;15929:3;15950:17;;;15947:43;;15970:18;;:::i;:::-;-1:-1:-1;16017:1:1;16006:13;;15890:135::o;16030:1352::-;16156:3;16150:10;16183:18;16175:6;16172:30;16169:56;;;16205:18;;:::i;:::-;16234:97;16324:6;16284:38;16316:4;16310:11;16284:38;:::i;:::-;16278:4;16234:97;:::i;:::-;16386:4;;16450:2;16439:14;;16467:1;16462:663;;;;17169:1;17186:6;17183:89;;;-1:-1:-1;17238:19:1;;;17232:26;17183:89;-1:-1:-1;;13706:1:1;13702:11;;;13698:24;13694:29;13684:40;13730:1;13726:11;;;13681:57;17285:81;;16432:944;;16462:663;12975:1;12968:14;;;13012:4;12999:18;;-1:-1:-1;;16498:20:1;;;16616:236;16630:7;16627:1;16624:14;16616:236;;;16719:19;;;16713:26;16698:42;;16811:27;;;;16779:1;16767:14;;;;16646:19;;16616:236;;;16620:3;16880:6;16871:7;16868:19;16865:201;;;16941:19;;;16935:26;-1:-1:-1;;17024:1:1;17020:14;;;17036:3;17016:24;17012:37;17008:42;16993:58;16978:74;;16865:201;-1:-1:-1;;;;;17112:1:1;17096:14;;;17092:22;17079:36;;-1:-1:-1;16030:1352:1:o;17387:127::-;17448:10;17443:3;17439:20;17436:1;17429:31;17479:4;17476:1;17469:15;17503:4;17500:1;17493:15;17519:522;17619:6;17614:3;17607:19;17589:3;17645:4;17674:2;17669:3;17665:12;17658:19;;17700:5;17723:1;17733:283;17747:6;17744:1;17741:13;17733:283;;;17824:6;17811:20;17844:33;17869:7;17844:33;:::i;:::-;-1:-1:-1;;;;;17902:33:1;17890:46;;17956:12;;;;17991:15;;;;17932:1;17762:9;17733:283;;;-1:-1:-1;18032:3:1;;17519:522;-1:-1:-1;;;;;17519:522:1:o;18046:1242::-;18308:2;18297:9;18290:21;18271:4;18331:1;18364:6;18358:13;18394:36;18420:9;18394:36;:::i;:::-;18466:6;18461:2;18450:9;18446:18;18439:34;18492:3;18514:1;18546:2;18535:9;18531:18;18563:1;18558:158;;;;18730:1;18725:381;;;;18524:582;;18558:158;-1:-1:-1;;18606:24:1;;18586:18;;;18579:52;18684:14;;18677:22;18674:1;18670:30;18655:46;;18651:55;;;-1:-1:-1;18558:158:1;;18725:381;18756:6;18753:1;18746:17;18786:4;18831:2;18828:1;18818:16;18856:1;18870:180;18884:6;18881:1;18878:13;18870:180;;;18977:14;;18953:17;;;18949:26;;18942:50;19020:16;;;;18899:10;;18870:180;;;19074:17;;19070:26;;;-1:-1:-1;;;18524:582:1;;;;;;19144:6;19137:4;19126:9;19122:20;19115:36;19196:9;19191:3;19187:19;19182:2;19171:9;19167:18;19160:47;19224:58;19278:3;19270:6;19262;19224:58;:::i;:::-;19216:66;18046:1242;-1:-1:-1;;;;;;;18046:1242:1:o;19293:397::-;19495:2;19477:21;;;19534:2;19514:18;;;19507:30;19573:34;19568:2;19553:18;;19546:62;-1:-1:-1;;;19639:2:1;19624:18;;19617:31;19680:3;19665:19;;19293:397::o;19695:128::-;19762:9;;;19783:11;;;19780:37;;;19797:18;;:::i;20645:350::-;20847:2;20829:21;;;20886:2;20866:18;;;20859:30;20925:28;20920:2;20905:18;;20898:56;20986:2;20971:18;;20645:350::o;22619:125::-;22684:9;;;22705:10;;;22702:36;;;22718:18;;:::i;25561:812::-;25972:25;25967:3;25960:38;25942:3;26027:6;26021:13;26043:75;26111:6;26106:2;26101:3;26097:12;26090:4;26082:6;26078:17;26043:75;:::i;:::-;-1:-1:-1;;;26177:2:1;26137:16;;;26169:11;;;26162:40;26227:13;;26249:76;26227:13;26311:2;26303:11;;26296:4;26284:17;;26249:76;:::i;:::-;26345:17;26364:2;26341:26;;25561:812;-1:-1:-1;;;;25561:812:1:o;26378:168::-;26451:9;;;26482;;26499:15;;;26493:22;;26479:37;26469:71;;26520:18;;:::i;26551:136::-;26590:3;26618:5;26608:39;;26627:18;;:::i;:::-;-1:-1:-1;;;26663:18:1;;26551:136::o
Swarm Source
ipfs://3d3d1375e6e22bee2843e83bba4ea790735fc753553d3f3ec185fce9d1b3957e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ 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.