Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 71 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19753074 | 272 days ago | IN | 0 ETH | 0.00022083 | ||||
Pay | 19736565 | 274 days ago | IN | 0.006361 ETH | 0.00039592 | ||||
Pay | 19736535 | 274 days ago | IN | 0.006361 ETH | 0.00038578 | ||||
Pay | 19736512 | 274 days ago | IN | 0.006361 ETH | 0.00045929 | ||||
Pay | 19736467 | 274 days ago | IN | 0.006361 ETH | 0.00040118 | ||||
Pay | 19736450 | 274 days ago | IN | 0.006361 ETH | 0.00038909 | ||||
Pay | 19736403 | 274 days ago | IN | 0.001588 ETH | 0.00034449 | ||||
Pay | 19736192 | 274 days ago | IN | 0.006361 ETH | 0.00044569 | ||||
Pay | 19734110 | 275 days ago | IN | 0.159095 ETH | 0.00111223 | ||||
Pay | 19733611 | 275 days ago | IN | 0.159095 ETH | 0.00120713 | ||||
Pay | 19733608 | 275 days ago | IN | 0.159095 ETH | 0.00078625 | ||||
Pay | 19733598 | 275 days ago | IN | 0.001588 ETH | 0.00116765 | ||||
Pay | 19733587 | 275 days ago | IN | 0.015907 ETH | 0.0013075 | ||||
Pay | 19733514 | 275 days ago | IN | 0.015907 ETH | 0.00195686 | ||||
Pay | 19733447 | 275 days ago | IN | 0.015907 ETH | 0.00184772 | ||||
Pay | 19732981 | 275 days ago | IN | 0.031815 ETH | 0.00096041 | ||||
Pay | 19732087 | 275 days ago | IN | 0.006361 ETH | 0.00053238 | ||||
Pay | 19731833 | 275 days ago | IN | 0.063636 ETH | 0.00094754 | ||||
Pay | 19731695 | 275 days ago | IN | 0.063636 ETH | 0.00086054 | ||||
Pay | 19729947 | 275 days ago | IN | 0.063636 ETH | 0.00049846 | ||||
Pay | 19729630 | 275 days ago | IN | 0.001588 ETH | 0.00051881 | ||||
Pay | 19729367 | 275 days ago | IN | 0.006361 ETH | 0.00044345 | ||||
Pay | 19728786 | 276 days ago | IN | 0.001588 ETH | 0.00052953 | ||||
Pay | 19728783 | 276 days ago | IN | 0.006361 ETH | 0.00047206 | ||||
Pay | 19728332 | 276 days ago | IN | 0.006361 ETH | 0.00056314 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PayportV2
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-09 */ // File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/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); } } } // File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/test.sol pragma solidity 0.8.19; contract PayportV2 is Ownable,ReentrancyGuard { event Pay(uint64 indexed _type, uint64 indexed _payId); //1store 0 CHR using ECDSA for bytes32; address private _beneficiary = 0x3CD1fAcFDcb5E3a935E495AE3552B38e6ace8178; // Beneficiary (official address) uint256 public taxFee = 5; // service fee percentage5 = 5% mapping(uint32 => address) public tokenAddressFromId; // erc20 token contracts that allow payments address private _cosigner = 0x8b05e8816D48585A7bb3083fC739e8a6Ccff51Fb; uint64 private _timestampExpirySeconds = 300; // Signature expiration time in seconds mapping(uint64 => bool) private _sigvalue; //orderId=>true mapping(uint64 => uint32) private _sales; //goodsId=>100 mapping(uint64 => bool) private _sigvaluec2c; //orderId=>true mapping(uint64 => uint32) private _salesc2c; //goodsId=>100 bool public _single; // Are incoming tokens sent directly to the beneficiary wallet? function setTaxFee(uint256 fee) public onlyOwner { require(fee != 0, "TaxFee_Need_More_Than_0"); require(fee < 100, "TaxFee_Need_Lee_Than_100"); taxFee = fee; } function denominator() internal pure returns (uint256) { return 100; } function setTokenAddressID( address tokenaddress, uint32 id ) external onlyOwner { tokenAddressFromId[id] = tokenaddress; } /** * @dev Sets beneficiary. */ function setBeneficiary(address beneficiary) external onlyOwner { _beneficiary = beneficiary; } /** signature structure * address from * uint256 value * uint32[4] [tokenAddressId,qty,supply,chainId] * uint64[4] [orderId,payId,goodsId,timestamp] */ function pay( uint256 value, uint32[4] memory num32, uint64[4] memory num64, bytes calldata signature ) public payable { C2Cpay(value, num32, num64, signature, address(0)); } /** signature structure * address from * uint256 value * uint32[4] [tokenAddressId,qty,supply,chainId] * uint64[4] [orderId,payId,goodsId,timestamp] * address to */ function C2Cpay( uint256 value, uint32[4] memory num32, uint64[4] memory num64, bytes calldata signature, address to ) public payable nonReentrant { address tokenAddress = tokenAddressFromId[num32[0]]; if (tokenAddress == address(0)) { require(msg.value == value, "Invalid_ETH_Value"); } // Start verifying signatures num32[3] = _chainID(); require( matchSigner( getCosignDigest(msg.sender, value, num32, num64, to), signature ), "Invalid_Signature" ); // Verify signature validity require( (_timestampExpirySeconds + num64[3] >= block.timestamp), "HAS_Expired" ); // Verify that the order number is used if (to == address(0)){ require((!_sigvalue[num64[0]]), "HAS_USED"); _sigvalue[num64[0]] = true; } else { require((!_sigvaluec2c[num64[0]]), "HAS_USED"); _sigvaluec2c[num64[0]] = true; } // Verify that sales are greater than inventory, inventory is not verified if it is 0 if (num32[2] > 0) { if(to == address(0)){ require(_sales[num64[2]] + num32[1] <= num32[2], "SOLD_OUT"); _sales[num64[2]] += num32[1]; }else{ require(_salesc2c[num64[2]] + num32[1] <= num32[2], "SOLD_OUT"); _salesc2c[num64[2]] += num32[1]; } } // Is it C2C? if (to == address(0)) { // Is it a native token payment? if (tokenAddress == address(0)) { if (_single) { Address.sendValue(payable(_beneficiary), value); } } else { require( IERC20(tokenAddress).transferFrom( msg.sender, _beneficiary, value ), "Transfertoken_Faliled" ); } emit Pay(1, num64[1]); } else { uint256 payTaxFee = (value * taxFee) / denominator(); // Is it a erc20 token payment? if (tokenAddress == address(0)) { Address.sendValue(payable(to), value - payTaxFee); if (_single) { Address.sendValue(payable(_beneficiary), payTaxFee); } } else { require( IERC20(tokenAddress).transferFrom( msg.sender, to, value - payTaxFee ), "Transfertoken_Faliled" ); require( IERC20(tokenAddress).transferFrom( msg.sender, _beneficiary, payTaxFee ), "Transfertoken_TaxFee_Faliled" ); } emit Pay(0, num64[1]); } } /** * @dev Returns data hash for the given MyParams. */ function getCosignDigest( address _msgSender, uint256 _value, uint32[4] memory _num32, uint64[4] memory _num64, address _to ) internal pure returns (bytes32) { if (_to == address(0)) { return keccak256(abi.encodePacked(_msgSender, _value, _num32, _num64)); } else { return keccak256( abi.encodePacked(_msgSender, _value, _num32, _num64, _to) ); } } function matchSigner( bytes32 hash, bytes memory signature ) internal view returns (bool) { return _cosigner == hash.toEthSignedMessageHash().recover(signature); } /** * @dev Returns chain id. */ function _chainID() public view returns (uint32) { uint32 chainID; assembly { chainID := chainid() } return chainID; } /** * @dev Sets cosigner. */ function setCosigner(address cosigner) external onlyOwner { _cosigner = cosigner; } /** * @dev Sets expiry in seconds. This timestamp specifies how long a signature from cosigner is valid for. */ function setTimestampExpirySeconds(uint64 expiry) external onlyOwner { _timestampExpirySeconds = expiry; } function renounceOwnership() public view override onlyOwner { revert("Closed_Interface"); } function withdraw() public onlyOwner { Address.sendValue(payable(_beneficiary), address(this).balance); } function getBalance() external view onlyOwner returns (uint256) { return address(this).balance; } // Are real-time collections enabled? function setSingle(bool isSingle) external onlyOwner { _single = isSingle; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"_type","type":"uint64"},{"indexed":true,"internalType":"uint64","name":"_payId","type":"uint64"}],"name":"Pay","type":"event"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint32[4]","name":"num32","type":"uint32[4]"},{"internalType":"uint64[4]","name":"num64","type":"uint64[4]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"to","type":"address"}],"name":"C2Cpay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_chainID","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_single","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint32[4]","name":"num32","type":"uint32[4]"},{"internalType":"uint64[4]","name":"num64","type":"uint64[4]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"pay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cosigner","type":"address"}],"name":"setCosigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isSingle","type":"bool"}],"name":"setSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTaxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setTimestampExpirySeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenaddress","type":"address"},{"internalType":"uint32","name":"id","type":"uint32"}],"name":"setTokenAddressID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"tokenAddressFromId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600280546001600160a01b031916733cd1facfdcb5e3a935e495ae3552b38e6ace817817905560056003819055805475012c8b05e8816d48585a7bb3083fc739e8a6ccff51fb6001600160e01b031990911617905534801561006557600080fd5b5061006f33610078565b600180556100c8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611806806100d76000396000f3fe6080604052600436106100fe5760003560e01c80638339bd6f11610095578063a071dcf411610064578063a071dcf414610293578063beab7131146102a9578063c4081a4c146102ca578063ce2b0ec0146102ea578063f2fde38b1461030a57600080fd5b80638339bd6f146102185780638da5cb5b1461024257806390a5bda2146102605780639e21ecb01461027357600080fd5b80634dec4681116100d15780634dec4681146101825780635e39efc9146101d0578063715018a6146101f0578063821582171461020557600080fd5b8063020451381461010357806312065fe0146101255780631c31f7101461014d5780633ccfd60b1461016d575b600080fd5b34801561010f57600080fd5b5061012361011e3660046112ff565b61032a565b005b34801561013157600080fd5b5061013a610354565b6040519081526020015b60405180910390f35b34801561015957600080fd5b506101236101683660046112ff565b610363565b34801561017957600080fd5b5061012361038d565b34801561018e57600080fd5b506101b861019d366004611335565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610144565b3480156101dc57600080fd5b506101236101eb366004611350565b6103ad565b3480156101fc57600080fd5b506101236103e9565b6101236102133660046114b4565b610431565b34801561022457600080fd5b50600a546102329060ff1681565b6040519015158152602001610144565b34801561024e57600080fd5b506000546001600160a01b03166101b8565b61012361026e366004611526565b610447565b34801561027f57600080fd5b5061012361028e3660046115b6565b610c1c565b34801561029f57600080fd5b5061013a60035481565b3480156102b557600080fd5b5060405163ffffffff46168152602001610144565b3480156102d657600080fd5b506101236102e53660046115d3565b610c37565b3480156102f657600080fd5b506101236103053660046115ec565b610ce4565b34801561031657600080fd5b506101236103253660046112ff565b610d19565b610332610d92565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600061035e610d92565b504790565b61036b610d92565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610395610d92565b6002546103ab906001600160a01b031647610dec565b565b6103b5610d92565b63ffffffff16600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6103f1610d92565b60405162461bcd60e51b815260206004820152601060248201526f436c6f7365645f496e7465726661636560801b60448201526064015b60405180910390fd5b61044085858585856000610447565b5050505050565b61044f610f0a565b845163ffffffff166000908152600460205260409020546001600160a01b0316806104b7578634146104b75760405162461bcd60e51b8152602060048201526011602482015270496e76616c69645f4554485f56616c756560781b6044820152606401610428565b4663ffffffff16606087015261050f6104d33389898987610f63565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc992505050565b61054f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69645f5369676e617475726560781b6044820152606401610428565b6060850151600554429161057291600160a01b90046001600160401b031661161d565b6001600160401b031610156105b75760405162461bcd60e51b815260206004820152600b60248201526a121054d7d15e1c1a5c995960aa1b6044820152606401610428565b6001600160a01b0382166106435784516001600160401b031660009081526006602052604090205460ff161561061a5760405162461bcd60e51b8152602060048201526008602482015267121054d7d554d15160c21b6044820152606401610428565b84516001600160401b03166000908152600660205260409020805460ff191660011790556106bd565b84516001600160401b031660009081526008602052604090205460ff16156106985760405162461bcd60e51b8152602060048201526008602482015267121054d7d554d15160c21b6044820152606401610428565b84516001600160401b03166000908152600860205260409020805460ff191660011790555b604086015163ffffffff1615610883576001600160a01b0382166107b157604080870151602080890151888401516001600160401b0316600090815260079092529290205463ffffffff9182169261071792909116611644565b63ffffffff1611156107565760405162461bcd60e51b815260206004820152600860248201526714d3d31117d3d55560c21b6044820152606401610428565b6020808701516040808801516001600160401b031660009081526007909352822080549192909161078e90849063ffffffff16611644565b92506101000a81548163ffffffff021916908363ffffffff160217905550610883565b604080870151602080890151888401516001600160401b0316600090815260099092529290205463ffffffff918216926107ed92909116611644565b63ffffffff16111561082c5760405162461bcd60e51b815260206004820152600860248201526714d3d31117d3d55560c21b6044820152606401610428565b6020808701516040808801516001600160401b031660009081526009909352822080549192909161086490849063ffffffff16611644565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b6001600160a01b0382166109c8576001600160a01b0381166108c557600a5460ff16156108c0576002546108c0906001600160a01b031688610dec565b610986565b6002546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101899052908216906323b872dd906064016020604051808303816000875af115801561091e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109429190611661565b6109865760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c9d1bdad95b97d1985b1a5b1959605a1b6044820152606401610428565b60208501516040516001600160401b03909116906001907fbbbcd8f6c9ba6f5fa5e71961ef9506c6eb51de06f5f677aa3b70f7e1154cbffd90600090a3610c0a565b600060646003546109d9908a61167e565b6109e39190611695565b90506001600160a01b038216610a2c57610a0683610a01838b6116b7565b610dec565b600a5460ff1615610a2757600254610a27906001600160a01b031682610dec565b610bcc565b6001600160a01b0382166323b872dd3385610a47858d6116b7565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abf9190611661565b610b035760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c9d1bdad95b97d1985b1a5b1959605a1b6044820152606401610428565b6002546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101839052908316906323b872dd906064016020604051808303816000875af1158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b809190611661565b610bcc5760405162461bcd60e51b815260206004820152601c60248201527f5472616e73666572746f6b656e5f5461784665655f46616c696c6564000000006044820152606401610428565b60208601516040516001600160401b03909116906000907fbbbcd8f6c9ba6f5fa5e71961ef9506c6eb51de06f5f677aa3b70f7e1154cbffd908290a3505b50610c1460018055565b505050505050565b610c24610d92565b600a805460ff1916911515919091179055565b610c3f610d92565b80600003610c8f5760405162461bcd60e51b815260206004820152601760248201527f5461784665655f4e6565645f4d6f72655f5468616e5f300000000000000000006044820152606401610428565b60648110610cdf5760405162461bcd60e51b815260206004820152601860248201527f5461784665655f4e6565645f4c65655f5468616e5f31303000000000000000006044820152606401610428565b600355565b610cec610d92565b600580546001600160401b03909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b610d21610d92565b6001600160a01b038116610d865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610428565b610d8f8161101c565b50565b6000546001600160a01b031633146103ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610428565b80471015610e3c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610428565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e89576040519150601f19603f3d011682016040523d82523d6000602084013e610e8e565b606091505b5050905080610f055760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610428565b505050565b600260015403610f5c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610428565b6002600155565b60006001600160a01b038216610fa75785858585604051602001610f8a9493929190611725565b604051602081830303815290604052805190602001209050610fc0565b8585858585604051602001610f8a959493929190611766565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c839052603c8120611002908361106c565b6005546001600160a01b0390811691161490505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600061107b8585611090565b91509150611088816110d5565b509392505050565b60008082516041036110c65760208301516040840151606085015160001a6110ba8782858561121f565b945094505050506110ce565b506000905060025b9250929050565b60008160048111156110e9576110e96117ba565b036110f15750565b6001816004811115611105576111056117ba565b036111525760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610428565b6002816004811115611166576111666117ba565b036111b35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610428565b60038160048111156111c7576111c76117ba565b03610d8f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610428565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561125657506000905060036112da565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156112aa573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166112d3576000600192509250506112da565b9150600090505b94509492505050565b80356001600160a01b03811681146112fa57600080fd5b919050565b60006020828403121561131157600080fd5b61131a826112e3565b9392505050565b803563ffffffff811681146112fa57600080fd5b60006020828403121561134757600080fd5b61131a82611321565b6000806040838503121561136357600080fd5b61136c836112e3565b915061137a60208401611321565b90509250929050565b604051608081016001600160401b03811182821017156113b357634e487b7160e01b600052604160045260246000fd5b60405290565b600082601f8301126113ca57600080fd5b6113d2611383565b8060808401858111156113e457600080fd5b845b81811015611405576113f781611321565b8452602093840193016113e6565b509095945050505050565b80356001600160401b03811681146112fa57600080fd5b600082601f83011261143857600080fd5b611440611383565b80608084018581111561145257600080fd5b845b818110156114055761146581611410565b845260209384019301611454565b60008083601f84011261148557600080fd5b5081356001600160401b0381111561149c57600080fd5b6020830191508360208285010111156110ce57600080fd5b600080600080600061014086880312156114cd57600080fd5b853594506114de87602088016113b9565b93506114ed8760a08801611427565b92506101208601356001600160401b0381111561150957600080fd5b61151588828901611473565b969995985093965092949392505050565b600080600080600080610160878903121561154057600080fd5b8635955061155188602089016113b9565b94506115608860a08901611427565b93506101208701356001600160401b0381111561157c57600080fd5b61158889828a01611473565b909450925061159c905061014088016112e3565b90509295509295509295565b8015158114610d8f57600080fd5b6000602082840312156115c857600080fd5b813561131a816115a8565b6000602082840312156115e557600080fd5b5035919050565b6000602082840312156115fe57600080fd5b61131a82611410565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111561163d5761163d611607565b5092915050565b63ffffffff81811683821601908082111561163d5761163d611607565b60006020828403121561167357600080fd5b815161131a816115a8565b808202811582820484141761101657611016611607565b6000826116b257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561101657611016611607565b8060005b60048110156116f357815163ffffffff168452602093840193909101906001016116ce565b50505050565b8060005b60048110156116f35781516001600160401b03168452602093840193909101906001016116fd565b6bffffffffffffffffffffffff198560601b16815283601482015261174d60348201846116ca565b61175a60b48201836116f9565b61013401949350505050565b60006bffffffffffffffffffffffff19808860601b16835286601484015261179160348401876116ca565b61179e60b48401866116f9565b60609390931b9092166101348201526101480195945050505050565b634e487b7160e01b600052602160045260246000fdfea264697066735822122039113458652616cc7cf4b9e7cb3ec51bc0b43287b4d5782c92e4adf4f8f3b9db64736f6c63430008130033
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c80638339bd6f11610095578063a071dcf411610064578063a071dcf414610293578063beab7131146102a9578063c4081a4c146102ca578063ce2b0ec0146102ea578063f2fde38b1461030a57600080fd5b80638339bd6f146102185780638da5cb5b1461024257806390a5bda2146102605780639e21ecb01461027357600080fd5b80634dec4681116100d15780634dec4681146101825780635e39efc9146101d0578063715018a6146101f0578063821582171461020557600080fd5b8063020451381461010357806312065fe0146101255780631c31f7101461014d5780633ccfd60b1461016d575b600080fd5b34801561010f57600080fd5b5061012361011e3660046112ff565b61032a565b005b34801561013157600080fd5b5061013a610354565b6040519081526020015b60405180910390f35b34801561015957600080fd5b506101236101683660046112ff565b610363565b34801561017957600080fd5b5061012361038d565b34801561018e57600080fd5b506101b861019d366004611335565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610144565b3480156101dc57600080fd5b506101236101eb366004611350565b6103ad565b3480156101fc57600080fd5b506101236103e9565b6101236102133660046114b4565b610431565b34801561022457600080fd5b50600a546102329060ff1681565b6040519015158152602001610144565b34801561024e57600080fd5b506000546001600160a01b03166101b8565b61012361026e366004611526565b610447565b34801561027f57600080fd5b5061012361028e3660046115b6565b610c1c565b34801561029f57600080fd5b5061013a60035481565b3480156102b557600080fd5b5060405163ffffffff46168152602001610144565b3480156102d657600080fd5b506101236102e53660046115d3565b610c37565b3480156102f657600080fd5b506101236103053660046115ec565b610ce4565b34801561031657600080fd5b506101236103253660046112ff565b610d19565b610332610d92565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600061035e610d92565b504790565b61036b610d92565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610395610d92565b6002546103ab906001600160a01b031647610dec565b565b6103b5610d92565b63ffffffff16600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6103f1610d92565b60405162461bcd60e51b815260206004820152601060248201526f436c6f7365645f496e7465726661636560801b60448201526064015b60405180910390fd5b61044085858585856000610447565b5050505050565b61044f610f0a565b845163ffffffff166000908152600460205260409020546001600160a01b0316806104b7578634146104b75760405162461bcd60e51b8152602060048201526011602482015270496e76616c69645f4554485f56616c756560781b6044820152606401610428565b4663ffffffff16606087015261050f6104d33389898987610f63565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fc992505050565b61054f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c69645f5369676e617475726560781b6044820152606401610428565b6060850151600554429161057291600160a01b90046001600160401b031661161d565b6001600160401b031610156105b75760405162461bcd60e51b815260206004820152600b60248201526a121054d7d15e1c1a5c995960aa1b6044820152606401610428565b6001600160a01b0382166106435784516001600160401b031660009081526006602052604090205460ff161561061a5760405162461bcd60e51b8152602060048201526008602482015267121054d7d554d15160c21b6044820152606401610428565b84516001600160401b03166000908152600660205260409020805460ff191660011790556106bd565b84516001600160401b031660009081526008602052604090205460ff16156106985760405162461bcd60e51b8152602060048201526008602482015267121054d7d554d15160c21b6044820152606401610428565b84516001600160401b03166000908152600860205260409020805460ff191660011790555b604086015163ffffffff1615610883576001600160a01b0382166107b157604080870151602080890151888401516001600160401b0316600090815260079092529290205463ffffffff9182169261071792909116611644565b63ffffffff1611156107565760405162461bcd60e51b815260206004820152600860248201526714d3d31117d3d55560c21b6044820152606401610428565b6020808701516040808801516001600160401b031660009081526007909352822080549192909161078e90849063ffffffff16611644565b92506101000a81548163ffffffff021916908363ffffffff160217905550610883565b604080870151602080890151888401516001600160401b0316600090815260099092529290205463ffffffff918216926107ed92909116611644565b63ffffffff16111561082c5760405162461bcd60e51b815260206004820152600860248201526714d3d31117d3d55560c21b6044820152606401610428565b6020808701516040808801516001600160401b031660009081526009909352822080549192909161086490849063ffffffff16611644565b92506101000a81548163ffffffff021916908363ffffffff1602179055505b6001600160a01b0382166109c8576001600160a01b0381166108c557600a5460ff16156108c0576002546108c0906001600160a01b031688610dec565b610986565b6002546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101899052908216906323b872dd906064016020604051808303816000875af115801561091e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109429190611661565b6109865760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c9d1bdad95b97d1985b1a5b1959605a1b6044820152606401610428565b60208501516040516001600160401b03909116906001907fbbbcd8f6c9ba6f5fa5e71961ef9506c6eb51de06f5f677aa3b70f7e1154cbffd90600090a3610c0a565b600060646003546109d9908a61167e565b6109e39190611695565b90506001600160a01b038216610a2c57610a0683610a01838b6116b7565b610dec565b600a5460ff1615610a2757600254610a27906001600160a01b031682610dec565b610bcc565b6001600160a01b0382166323b872dd3385610a47858d6116b7565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abf9190611661565b610b035760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c9d1bdad95b97d1985b1a5b1959605a1b6044820152606401610428565b6002546040516323b872dd60e01b81523360048201526001600160a01b03918216602482015260448101839052908316906323b872dd906064016020604051808303816000875af1158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b809190611661565b610bcc5760405162461bcd60e51b815260206004820152601c60248201527f5472616e73666572746f6b656e5f5461784665655f46616c696c6564000000006044820152606401610428565b60208601516040516001600160401b03909116906000907fbbbcd8f6c9ba6f5fa5e71961ef9506c6eb51de06f5f677aa3b70f7e1154cbffd908290a3505b50610c1460018055565b505050505050565b610c24610d92565b600a805460ff1916911515919091179055565b610c3f610d92565b80600003610c8f5760405162461bcd60e51b815260206004820152601760248201527f5461784665655f4e6565645f4d6f72655f5468616e5f300000000000000000006044820152606401610428565b60648110610cdf5760405162461bcd60e51b815260206004820152601860248201527f5461784665655f4e6565645f4c65655f5468616e5f31303000000000000000006044820152606401610428565b600355565b610cec610d92565b600580546001600160401b03909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b610d21610d92565b6001600160a01b038116610d865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610428565b610d8f8161101c565b50565b6000546001600160a01b031633146103ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610428565b80471015610e3c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610428565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e89576040519150601f19603f3d011682016040523d82523d6000602084013e610e8e565b606091505b5050905080610f055760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610428565b505050565b600260015403610f5c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610428565b6002600155565b60006001600160a01b038216610fa75785858585604051602001610f8a9493929190611725565b604051602081830303815290604052805190602001209050610fc0565b8585858585604051602001610f8a959493929190611766565b95945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c839052603c8120611002908361106c565b6005546001600160a01b0390811691161490505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600061107b8585611090565b91509150611088816110d5565b509392505050565b60008082516041036110c65760208301516040840151606085015160001a6110ba8782858561121f565b945094505050506110ce565b506000905060025b9250929050565b60008160048111156110e9576110e96117ba565b036110f15750565b6001816004811115611105576111056117ba565b036111525760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610428565b6002816004811115611166576111666117ba565b036111b35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610428565b60038160048111156111c7576111c76117ba565b03610d8f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610428565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561125657506000905060036112da565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156112aa573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166112d3576000600192509250506112da565b9150600090505b94509492505050565b80356001600160a01b03811681146112fa57600080fd5b919050565b60006020828403121561131157600080fd5b61131a826112e3565b9392505050565b803563ffffffff811681146112fa57600080fd5b60006020828403121561134757600080fd5b61131a82611321565b6000806040838503121561136357600080fd5b61136c836112e3565b915061137a60208401611321565b90509250929050565b604051608081016001600160401b03811182821017156113b357634e487b7160e01b600052604160045260246000fd5b60405290565b600082601f8301126113ca57600080fd5b6113d2611383565b8060808401858111156113e457600080fd5b845b81811015611405576113f781611321565b8452602093840193016113e6565b509095945050505050565b80356001600160401b03811681146112fa57600080fd5b600082601f83011261143857600080fd5b611440611383565b80608084018581111561145257600080fd5b845b818110156114055761146581611410565b845260209384019301611454565b60008083601f84011261148557600080fd5b5081356001600160401b0381111561149c57600080fd5b6020830191508360208285010111156110ce57600080fd5b600080600080600061014086880312156114cd57600080fd5b853594506114de87602088016113b9565b93506114ed8760a08801611427565b92506101208601356001600160401b0381111561150957600080fd5b61151588828901611473565b969995985093965092949392505050565b600080600080600080610160878903121561154057600080fd5b8635955061155188602089016113b9565b94506115608860a08901611427565b93506101208701356001600160401b0381111561157c57600080fd5b61158889828a01611473565b909450925061159c905061014088016112e3565b90509295509295509295565b8015158114610d8f57600080fd5b6000602082840312156115c857600080fd5b813561131a816115a8565b6000602082840312156115e557600080fd5b5035919050565b6000602082840312156115fe57600080fd5b61131a82611410565b634e487b7160e01b600052601160045260246000fd5b6001600160401b0381811683821601908082111561163d5761163d611607565b5092915050565b63ffffffff81811683821601908082111561163d5761163d611607565b60006020828403121561167357600080fd5b815161131a816115a8565b808202811582820484141761101657611016611607565b6000826116b257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561101657611016611607565b8060005b60048110156116f357815163ffffffff168452602093840193909101906001016116ce565b50505050565b8060005b60048110156116f35781516001600160401b03168452602093840193909101906001016116fd565b6bffffffffffffffffffffffff198560601b16815283601482015261174d60348201846116ca565b61175a60b48201836116f9565b61013401949350505050565b60006bffffffffffffffffffffffff19808860601b16835286601484015261179160348401876116ca565b61179e60b48401866116f9565b60609390931b9092166101348201526101480195945050505050565b634e487b7160e01b600052602160045260246000fdfea264697066735822122039113458652616cc7cf4b9e7cb3ec51bc0b43287b4d5782c92e4adf4f8f3b9db64736f6c63430008130033
Deployed Bytecode Sourcemap
46108:7450:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52701:97;;;;;;;;;;-1:-1:-1;52701:97:0;;;;;:::i;:::-;;:::i;:::-;;53303:111;;;;;;;;;;;;;:::i;:::-;;;529:25:1;;;517:2;502:18;53303:111:0;;;;;;;;47580:109;;;;;;;;;;-1:-1:-1;47580:109:0;;;;;:::i;:::-;;:::i;53176:119::-;;;;;;;;;;;;;:::i;46447:52::-;;;;;;;;;;-1:-1:-1;46447:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;46447:52:0;;;;;;-1:-1:-1;;;;;1086:32:1;;;1068:51;;1056:2;1041:18;46447:52:0;922:203:1;47363:160:0;;;;;;;;;;-1:-1:-1;47363:160:0;;;;;:::i;:::-;;:::i;53063:105::-;;;;;;;;;;;;;:::i;47884:229::-;;;;;;:::i;:::-;;:::i;46979:19::-;;;;;;;;;;-1:-1:-1;46979:19:0;;;;;;;;;;;4118:14:1;;4111:22;4093:41;;4081:2;4066:18;46979:19:0;3953:187:1;44580:87:0;;;;;;;;;;-1:-1:-1;44626:7:0;44653:6;-1:-1:-1;;;;;44653:6:0;44580:87;;48327:3274;;;;;;:::i;:::-;;:::i;53465:90::-;;;;;;;;;;-1:-1:-1;53465:90:0;;;;;:::i;:::-;;:::i;46381:25::-;;;;;;;;;;;;;;;;52475:172;;;;;;;;;;-1:-1:-1;52475:172:0;;5468:10:1;52595:9:0;5456:23:1;5438:42;;5426:2;5411:18;52475:172:0;5294:192:1;47071::0;;;;;;;;;;-1:-1:-1;47071:192:0;;;;;:::i;:::-;;:::i;52935:120::-;;;;;;;;;;-1:-1:-1;52935:120:0;;;;;:::i;:::-;;:::i;45479:201::-;;;;;;;;;;-1:-1:-1;45479:201:0;;;;;:::i;:::-;;:::i;52701:97::-;44466:13;:11;:13::i;:::-;52770:9:::1;:20:::0;;-1:-1:-1;;;;;;52770:20:0::1;-1:-1:-1::0;;;;;52770:20:0;;;::::1;::::0;;;::::1;::::0;;52701:97::o;53303:111::-;53358:7;44466:13;:11;:13::i;:::-;-1:-1:-1;53385:21:0::1;53303:111:::0;:::o;47580:109::-;44466:13;:11;:13::i;:::-;47655:12:::1;:26:::0;;-1:-1:-1;;;;;;47655:26:0::1;-1:-1:-1::0;;;;;47655:26:0;;;::::1;::::0;;;::::1;::::0;;47580:109::o;53176:119::-;44466:13;:11;:13::i;:::-;53250:12:::1;::::0;53224:63:::1;::::0;-1:-1:-1;;;;;53250:12:0::1;53265:21;53224:17;:63::i;:::-;53176:119::o:0;47363:160::-;44466:13;:11;:13::i;:::-;47478:22:::1;;;::::0;;;:18:::1;:22;::::0;;;;:37;;-1:-1:-1;;;;;;47478:37:0::1;-1:-1:-1::0;;;;;47478:37:0;;;::::1;::::0;;;::::1;::::0;;47363:160::o;53063:105::-;44466:13;:11;:13::i;:::-;53134:26:::1;::::0;-1:-1:-1;;;53134:26:0;;6067:2:1;53134:26:0::1;::::0;::::1;6049:21:1::0;6106:2;6086:18;;;6079:30;-1:-1:-1;;;6125:18:1;;;6118:46;6181:18;;53134:26:0::1;;;;;;;;47884:229:::0;48055:50;48062:5;48069;48076;48083:9;;48102:1;48055:6;:50::i;:::-;47884:229;;;;;:::o;48327:3274::-;2351:21;:19;:21::i;:::-;48577:8;;48558:28:::1;;48535:20;48558:28:::0;;;:18:::1;48577:8;48558:28:::0;;;;;-1:-1:-1;;;;;48558:28:0::1;::::0;48599:107:::1;;48667:5;48654:9;:18;48646:48;;;::::0;-1:-1:-1;;;48646:48:0;;6544:2:1;48646:48:0::1;::::0;::::1;6526:21:1::0;6583:2;6563:18;;;6556:30;-1:-1:-1;;;6602:18:1;;;6595:47;6659:18;;48646:48:0::1;6342:341:1::0;48646:48:0::1;52595:9:::0;48757:21:::1;;:8:::0;;::::1;:21:::0;48811:125:::1;48841:52;48857:10;48869:5:::0;48757;48883;48890:2;48841:15:::1;:52::i;:::-;48912:9;;48811:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;48811:11:0::1;::::0;-1:-1:-1;;;48811:125:0:i:1;:::-;48789:192;;;::::0;-1:-1:-1;;;48789:192:0;;6890:2:1;48789:192:0::1;::::0;::::1;6872:21:1::0;6929:2;6909:18;;;6902:30;-1:-1:-1;;;6948:18:1;;;6941:47;7005:18;;48789:192:0::1;6688:341:1::0;48789:192:0::1;49081:8:::0;;::::1;::::0;49055:23:::1;::::0;49093:15:::1;::::0;49055:34:::1;::::0;-1:-1:-1;;;49055:23:0;::::1;-1:-1:-1::0;;;;;49055:23:0::1;:34;:::i;:::-;-1:-1:-1::0;;;;;49055:53:0::1;;;49032:116;;;::::0;-1:-1:-1;;;49032:116:0;;7553:2:1;49032:116:0::1;::::0;::::1;7535:21:1::0;7592:2;7572:18;;;7565:30;-1:-1:-1;;;7611:18:1;;;7604:41;7662:18;;49032:116:0::1;7351:335:1::0;49032:116:0::1;-1:-1:-1::0;;;;;49214:16:0;::::1;49210:255;;49266:8:::0;;-1:-1:-1;;;;;49256:19:0::1;;::::0;;;:9:::1;49266:8;49256:19:::0;;;;;::::1;;49255:20;49246:43;;;::::0;-1:-1:-1;;;49246:43:0;;7893:2:1;49246:43:0::1;::::0;::::1;7875:21:1::0;7932:1;7912:18;;;7905:29;-1:-1:-1;;;7950:18:1;;;7943:38;7998:18;;49246:43:0::1;7691:331:1::0;49246:43:0::1;49314:8:::0;;-1:-1:-1;;;;;49304:19:0::1;;::::0;;;:9:::1;49314:8;49304:19:::0;;;;:26;;-1:-1:-1;;49304:26:0::1;49326:4;49304:26;::::0;;49210:255:::1;;;49386:8:::0;;-1:-1:-1;;;;;49373:22:0::1;;::::0;;;:12:::1;49386:8;49373:22:::0;;;;;::::1;;49372:23;49363:46;;;::::0;-1:-1:-1;;;49363:46:0;;7893:2:1;49363:46:0::1;::::0;::::1;7875:21:1::0;7932:1;7912:18;;;7905:29;-1:-1:-1;;;7950:18:1;;;7943:38;7998:18;;49363:46:0::1;7691:331:1::0;49363:46:0::1;49437:8:::0;;-1:-1:-1;;;;;49424:22:0::1;;::::0;;;:12:::1;49437:8;49424:22:::0;;;;:29;;-1:-1:-1;;49424:29:0::1;49449:4;49424:29;::::0;;49210:255:::1;49594:8:::0;;::::1;::::0;:12:::1;;::::0;49590:358:::1;;-1:-1:-1::0;;;;;49626:16:0;::::1;49623:314;;49701:8:::0;;;::::1;::::0;::::1;49689::::0;;::::1;::::0;49677;;::::1;::::0;-1:-1:-1;;;;;49670:16:0::1;;::::0;;;:6:::1;:16:::0;;;;;;;:39:::1;::::0;;::::1;::::0;:27:::1;::::0;49689:8;;49670:16:::1;:27;:::i;:::-;:39;;;;49662:60;;;::::0;-1:-1:-1;;;49662:60:0;;8406:2:1;49662:60:0::1;::::0;::::1;8388:21:1::0;8445:1;8425:18;;;8418:29;-1:-1:-1;;;8463:18:1;;;8456:38;8511:18;;49662:60:0::1;8204:331:1::0;49662:60:0::1;49761:8;::::0;;::::1;::::0;49748;;;::::1;::::0;-1:-1:-1;;;;;49741:16:0::1;;::::0;;;:6:::1;:16:::0;;;;;:28;;49761:8;;49741:16;;:28:::1;::::0;49761:8;;49741:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49623:314;;;49850:8:::0;;;::::1;::::0;::::1;49838::::0;;::::1;::::0;49826;;::::1;::::0;-1:-1:-1;;;;;49816:19:0::1;;::::0;;;:9:::1;:19:::0;;;;;;;:42:::1;::::0;;::::1;::::0;:30:::1;::::0;49838:8;;49816:19:::1;:30;:::i;:::-;:42;;;;49808:63;;;::::0;-1:-1:-1;;;49808:63:0;;8406:2:1;49808:63:0::1;::::0;::::1;8388:21:1::0;8445:1;8425:18;;;8418:29;-1:-1:-1;;;8463:18:1;;;8456:38;8511:18;;49808:63:0::1;8204:331:1::0;49808:63:0::1;49913:8;::::0;;::::1;::::0;49900;;;::::1;::::0;-1:-1:-1;;;;;49890:19:0::1;;::::0;;;:9:::1;:19:::0;;;;;:31;;49913:8;;49890:19;;:31:::1;::::0;49913:8;;49890:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49623:314;-1:-1:-1::0;;;;;49987:16:0;::::1;49983:1611;;-1:-1:-1::0;;;;;50070:26:0;::::1;50066:469;;50121:7;::::0;::::1;;50117:103;;;50179:12;::::0;50153:47:::1;::::0;-1:-1:-1;;;;;50179:12:0::1;50194:5:::0;50153:17:::1;:47::i;:::-;50066:469;;;50387:12;::::0;50290:164:::1;::::0;-1:-1:-1;;;50290:164:0;;50350:10:::1;50290:164;::::0;::::1;8780:34:1::0;-1:-1:-1;;;;;50387:12:0;;::::1;8830:18:1::0;;;8823:43;8882:18;;;8875:34;;;50290:33:0;;::::1;::::0;::::1;::::0;8715:18:1;;50290:164:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50260:259;;;::::0;-1:-1:-1;;;50260:259:0;;9372:2:1;50260:259:0::1;::::0;::::1;9354:21:1::0;9411:2;9391:18;;;9384:30;-1:-1:-1;;;9430:18:1;;;9423:51;9491:18;;50260:259:0::1;9170:345:1::0;50260:259:0::1;50561:8;::::0;::::1;::::0;50554:16:::1;::::0;-1:-1:-1;;;;;50554:16:0;;::::1;::::0;50567:1:::1;::::0;50554:16:::1;::::0;;;::::1;49983:1611;;;50603:17;47344:3:::0;50632:6:::1;::::0;50624:14:::1;::::0;:5;:14:::1;:::i;:::-;50623:32;;;;:::i;:::-;50603:52:::0;-1:-1:-1;;;;;;50719:26:0;::::1;50715:832;;50766:49;50792:2:::0;50797:17:::1;50805:9:::0;50797:5;:17:::1;:::i;:::-;50766;:49::i;:::-;50838:7;::::0;::::1;;50834:107;;;50896:12;::::0;50870:51:::1;::::0;-1:-1:-1;;;;;50896:12:0::1;50911:9:::0;50870:17:::1;:51::i;:::-;50715:832;;;-1:-1:-1::0;;;;;51011:33:0;::::1;;51071:10;51108:2:::0;51137:17:::1;51145:9:::0;51137:5;:17:::1;:::i;:::-;51011:166;::::0;-1:-1:-1;;;;;;51011:166:0::1;::::0;;;;;;-1:-1:-1;;;;;8798:15:1;;;51011:166:0::1;::::0;::::1;8780:34:1::0;8850:15;;;;8830:18;;;8823:43;8882:18;;;8875:34;8715:18;;51011:166:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50981:261;;;::::0;-1:-1:-1;;;50981:261:0;;9372:2:1;50981:261:0::1;::::0;::::1;9354:21:1::0;9411:2;9391:18;;;9384:30;-1:-1:-1;;;9430:18:1;;;9423:51;9491:18;;50981:261:0::1;9170:345:1::0;50981:261:0::1;51388:12;::::0;51291:168:::1;::::0;-1:-1:-1;;;51291:168:0;;51351:10:::1;51291:168;::::0;::::1;8780:34:1::0;-1:-1:-1;;;;;51388:12:0;;::::1;8830:18:1::0;;;8823:43;8882:18;;;8875:34;;;51291:33:0;;::::1;::::0;::::1;::::0;8715:18:1;;51291:168:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51261:270;;;::::0;-1:-1:-1;;;51261:270:0;;10250:2:1;51261:270:0::1;::::0;::::1;10232:21:1::0;10289:2;10269:18;;;10262:30;10328;10308:18;;;10301:58;10376:18;;51261:270:0::1;10048:352:1::0;51261:270:0::1;51573:8;::::0;::::1;::::0;51566:16:::1;::::0;-1:-1:-1;;;;;51566:16:0;;::::1;::::0;51570:1:::1;::::0;51566:16:::1;::::0;51570:1;;51566:16:::1;50588:1006;49983:1611;48524:3077;2395:20:::0;1789:1;2915:22;;2732:213;2395:20;48327:3274;;;;;;:::o;53465:90::-;44466:13;:11;:13::i;:::-;53529:7:::1;:18:::0;;-1:-1:-1;;53529:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53465:90::o;47071:192::-;44466:13;:11;:13::i;:::-;47139:3:::1;47146:1;47139:8:::0;47131:44:::1;;;::::0;-1:-1:-1;;;47131:44:0;;10607:2:1;47131:44:0::1;::::0;::::1;10589:21:1::0;10646:2;10626:18;;;10619:30;10685:25;10665:18;;;10658:53;10728:18;;47131:44:0::1;10405:347:1::0;47131:44:0::1;47200:3;47194;:9;47186:46;;;::::0;-1:-1:-1;;;47186:46:0;;10959:2:1;47186:46:0::1;::::0;::::1;10941:21:1::0;10998:2;10978:18;;;10971:30;11037:26;11017:18;;;11010:54;11081:18;;47186:46:0::1;10757:348:1::0;47186:46:0::1;47243:6;:12:::0;47071:192::o;52935:120::-;44466:13;:11;:13::i;:::-;53015:23:::1;:32:::0;;-1:-1:-1;;;;;53015:32:0;;::::1;-1:-1:-1::0;;;53015:32:0::1;-1:-1:-1::0;;;;53015:32:0;;::::1;::::0;;;::::1;::::0;;52935:120::o;45479:201::-;44466:13;:11;:13::i;:::-;-1:-1:-1;;;;;45568:22:0;::::1;45560:73;;;::::0;-1:-1:-1;;;45560:73:0;;11312:2:1;45560:73:0::1;::::0;::::1;11294:21:1::0;11351:2;11331:18;;;11324:30;11390:34;11370:18;;;11363:62;-1:-1:-1;;;11441:18:1;;;11434:36;11487:19;;45560:73:0::1;11110:402:1::0;45560:73:0::1;45644:28;45663:8;45644:18;:28::i;:::-;45479:201:::0;:::o;44745:132::-;44626:7;44653:6;-1:-1:-1;;;;;44653:6:0;43205:10;44809:23;44801:68;;;;-1:-1:-1;;;44801:68:0;;11719:2:1;44801:68:0;;;11701:21:1;;;11738:18;;;11731:30;11797:34;11777:18;;;11770:62;11849:18;;44801:68:0;11517:356:1;5985:317:0;6100:6;6075:21;:31;;6067:73;;;;-1:-1:-1;;;6067:73:0;;12080:2:1;6067:73:0;;;12062:21:1;12119:2;12099:18;;;12092:30;12158:31;12138:18;;;12131:59;12207:18;;6067:73:0;11878:353:1;6067:73:0;6154:12;6172:9;-1:-1:-1;;;;;6172:14:0;6194:6;6172:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6153:52;;;6224:7;6216:78;;;;-1:-1:-1;;;6216:78:0;;12648:2:1;6216:78:0;;;12630:21:1;12687:2;12667:18;;;12660:30;12726:34;12706:18;;;12699:62;12797:28;12777:18;;;12770:56;12843:19;;6216:78:0;12446:422:1;6216:78:0;6056:246;5985:317;;:::o;2431:293::-;1833:1;2565:7;;:19;2557:63;;;;-1:-1:-1;;;2557:63:0;;13075:2:1;2557:63:0;;;13057:21:1;13114:2;13094:18;;;13087:30;13153:33;13133:18;;;13126:61;13204:18;;2557:63:0;12873:355:1;2557:63:0;1833:1;2698:7;:18;2431:293::o;51682:528::-;51881:7;-1:-1:-1;;;;;51905:17:0;;51901:302;;51990:10;52002:6;52010;52018;51973:52;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51963:63;;;;;;51939:87;;;;51901:302;52132:10;52144:6;52152;52160;52168:3;52115:57;;;;;;;;;;;;:::i;51901:302::-;51682:528;;;;;;;:::o;52218:200::-;40648:34;52325:4;40635:48;;;40704:4;40697:18;;;40756:4;40740:21;;52362:48;;52400:9;52362:37;:48::i;:::-;52349:9;;-1:-1:-1;;;;;52349:9:0;;;:61;;;;-1:-1:-1;52218:200:0;;;;;:::o;45840:191::-;45914:16;45933:6;;-1:-1:-1;;;;;45950:17:0;;;-1:-1:-1;;;;;;45950:17:0;;;;;;45983:40;;45933:6;;;;;;;45983:40;;45914:16;45983:40;45903:128;45840:191;:::o;36838:231::-;36916:7;36937:17;36956:18;36978:27;36989:4;36995:9;36978:10;:27::i;:::-;36936:69;;;;37016:18;37028:5;37016:11;:18::i;:::-;-1:-1:-1;37052:9:0;36838:231;-1:-1:-1;;;36838:231:0:o;35289:747::-;35370:7;35379:12;35408:9;:16;35428:2;35408:22;35404:625;;35752:4;35737:20;;35731:27;35802:4;35787:20;;35781:27;35860:4;35845:20;;35839:27;35447:9;35831:36;35903:25;35914:4;35831:36;35731:27;35781;35903:10;:25::i;:::-;35896:32;;;;;;;;;35404:625;-1:-1:-1;35977:1:0;;-1:-1:-1;35981:35:0;35404:625;35289:747;;;;;:::o;33682:521::-;33760:20;33751:5;:29;;;;;;;;:::i;:::-;;33747:449;;33682:521;:::o;33747:449::-;33858:29;33849:5;:38;;;;;;;;:::i;:::-;;33845:351;;33904:34;;-1:-1:-1;;;33904:34:0;;15480:2:1;33904:34:0;;;15462:21:1;15519:2;15499:18;;;15492:30;15558:26;15538:18;;;15531:54;15602:18;;33904:34:0;15278:348:1;33845:351:0;33969:35;33960:5;:44;;;;;;;;:::i;:::-;;33956:240;;34021:41;;-1:-1:-1;;;34021:41:0;;15833:2:1;34021:41:0;;;15815:21:1;15872:2;15852:18;;;15845:30;15911:33;15891:18;;;15884:61;15962:18;;34021:41:0;15631:355:1;33956:240:0;34093:30;34084:5;:39;;;;;;;;:::i;:::-;;34080:116;;34140:44;;-1:-1:-1;;;34140:44:0;;16193:2:1;34140:44:0;;;16175:21:1;16232:2;16212:18;;;16205:30;16271:34;16251:18;;;16244:62;-1:-1:-1;;;16322:18:1;;;16315:32;16364:19;;34140:44:0;15991:398:1;38222:1477:0;38310:7;;39244:66;39231:79;;39227:163;;;-1:-1:-1;39343:1:0;;-1:-1:-1;39347:30:0;39327:51;;39227:163;39504:24;;;39487:14;39504:24;;;;;;;;;16621:25:1;;;16694:4;16682:17;;16662:18;;;16655:45;;;;16716:18;;;16709:34;;;16759:18;;;16752:34;;;39504:24:0;;16593:19:1;;39504:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39504:24:0;;-1:-1:-1;;39504:24:0;;;-1:-1:-1;;;;;;;39543:20:0;;39539:103;;39596:1;39600:29;39580:50;;;;;;;39539:103;39662:6;-1:-1:-1;39670:20:0;;-1:-1:-1;38222:1477:0;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;565:163::-;632:20;;692:10;681:22;;671:33;;661:61;;718:1;715;708:12;733:184;791:6;844:2;832:9;823:7;819:23;815:32;812:52;;;860:1;857;850:12;812:52;883:28;901:9;883:28;:::i;1130:258::-;1197:6;1205;1258:2;1246:9;1237:7;1233:23;1229:32;1226:52;;;1274:1;1271;1264:12;1226:52;1297:29;1316:9;1297:29;:::i;:::-;1287:39;;1345:37;1378:2;1367:9;1363:18;1345:37;:::i;:::-;1335:47;;1130:258;;;;;:::o;1393:344::-;1460:2;1454:9;1502:3;1490:16;;-1:-1:-1;;;;;1521:34:1;;1557:22;;;1518:62;1515:185;;;1622:10;1617:3;1613:20;1610:1;1603:31;1657:4;1654:1;1647:15;1685:4;1682:1;1675:15;1515:185;1716:2;1709:22;1393:344;:::o;1742:484::-;1791:5;1844:3;1837:4;1829:6;1825:17;1821:27;1811:55;;1862:1;1859;1852:12;1811:55;1886:17;;:::i;:::-;1925:3;1963;1955:6;1951:16;1990:3;1982:6;1979:15;1976:35;;;2007:1;2004;1997:12;1976:35;2031:6;2046:151;2062:6;2057:3;2054:15;2046:151;;;2130:22;2148:3;2130:22;:::i;:::-;2118:35;;2182:4;2173:14;;;;2079;2046:151;;;-1:-1:-1;2215:5:1;;1742:484;-1:-1:-1;;;;;1742:484:1:o;2231:171::-;2298:20;;-1:-1:-1;;;;;2347:30:1;;2337:41;;2327:69;;2392:1;2389;2382:12;2407:484;2456:5;2509:3;2502:4;2494:6;2490:17;2486:27;2476:55;;2527:1;2524;2517:12;2476:55;2551:17;;:::i;:::-;2590:3;2628;2620:6;2616:16;2655:3;2647:6;2644:15;2641:35;;;2672:1;2669;2662:12;2641:35;2696:6;2711:151;2727:6;2722:3;2719:15;2711:151;;;2795:22;2813:3;2795:22;:::i;:::-;2783:35;;2847:4;2838:14;;;;2744;2711:151;;2896:347;2947:8;2957:6;3011:3;3004:4;2996:6;2992:17;2988:27;2978:55;;3029:1;3026;3019:12;2978:55;-1:-1:-1;3052:20:1;;-1:-1:-1;;;;;3084:30:1;;3081:50;;;3127:1;3124;3117:12;3081:50;3164:4;3156:6;3152:17;3140:29;;3216:3;3209:4;3200:6;3192;3188:19;3184:30;3181:39;3178:59;;;3233:1;3230;3223:12;3248:700;3389:6;3397;3405;3413;3421;3474:3;3462:9;3453:7;3449:23;3445:33;3442:53;;;3491:1;3488;3481:12;3442:53;3527:9;3514:23;3504:33;;3556:52;3600:7;3595:2;3584:9;3580:18;3556:52;:::i;:::-;3546:62;;3627:53;3672:7;3666:3;3655:9;3651:19;3627:53;:::i;:::-;3617:63;;3731:3;3720:9;3716:19;3703:33;-1:-1:-1;;;;;3751:6:1;3748:30;3745:50;;;3791:1;3788;3781:12;3745:50;3830:58;3880:7;3871:6;3860:9;3856:22;3830:58;:::i;:::-;3248:700;;;;-1:-1:-1;3248:700:1;;-1:-1:-1;3907:8:1;;3804:84;3248:700;-1:-1:-1;;;3248:700:1:o;4145:775::-;4295:6;4303;4311;4319;4327;4335;4388:3;4376:9;4367:7;4363:23;4359:33;4356:53;;;4405:1;4402;4395:12;4356:53;4441:9;4428:23;4418:33;;4470:52;4514:7;4509:2;4498:9;4494:18;4470:52;:::i;:::-;4460:62;;4541:53;4586:7;4580:3;4569:9;4565:19;4541:53;:::i;:::-;4531:63;;4645:3;4634:9;4630:19;4617:33;-1:-1:-1;;;;;4665:6:1;4662:30;4659:50;;;4705:1;4702;4695:12;4659:50;4744:58;4794:7;4785:6;4774:9;4770:22;4744:58;:::i;:::-;4821:8;;-1:-1:-1;4718:84:1;-1:-1:-1;4875:39:1;;-1:-1:-1;4909:3:1;4894:19;;4875:39;:::i;:::-;4865:49;;4145:775;;;;;;;;:::o;4925:118::-;5011:5;5004:13;4997:21;4990:5;4987:32;4977:60;;5033:1;5030;5023:12;5048:241;5104:6;5157:2;5145:9;5136:7;5132:23;5128:32;5125:52;;;5173:1;5170;5163:12;5125:52;5212:9;5199:23;5231:28;5253:5;5231:28;:::i;5491:180::-;5550:6;5603:2;5591:9;5582:7;5578:23;5574:32;5571:52;;;5619:1;5616;5609:12;5571:52;-1:-1:-1;5642:23:1;;5491:180;-1:-1:-1;5491:180:1:o;5676:184::-;5734:6;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5826:28;5844:9;5826:28;:::i;7034:127::-;7095:10;7090:3;7086:20;7083:1;7076:31;7126:4;7123:1;7116:15;7150:4;7147:1;7140:15;7166:180;-1:-1:-1;;;;;7271:10:1;;;7283;;;7267:27;;7306:11;;;7303:37;;;7320:18;;:::i;:::-;7303:37;7166:180;;;;:::o;8027:172::-;8094:10;8124;;;8136;;;8120:27;;8159:11;;;8156:37;;;8173:18;;:::i;8920:245::-;8987:6;9040:2;9028:9;9019:7;9015:23;9011:32;9008:52;;;9056:1;9053;9046:12;9008:52;9088:9;9082:16;9107:28;9129:5;9107:28;:::i;9520:168::-;9593:9;;;9624;;9641:15;;;9635:22;;9621:37;9611:71;;9662:18;;:::i;9693:217::-;9733:1;9759;9749:132;;9803:10;9798:3;9794:20;9791:1;9784:31;9838:4;9835:1;9828:15;9866:4;9863:1;9856:15;9749:132;-1:-1:-1;9895:9:1;;9693:217::o;9915:128::-;9982:9;;;10003:11;;;10000:37;;;10017:18;;:::i;13233:342::-;13325:5;13348:1;13358:211;13372:4;13369:1;13366:11;13358:211;;;13435:13;;13450:10;13431:30;13419:43;;13485:4;13509:12;;;;13544:15;;;;13392:1;13385:9;13358:211;;;13362:3;;13233:342;;:::o;13580:350::-;13672:5;13695:1;13705:219;13719:4;13716:1;13713:11;13705:219;;;13782:13;;-1:-1:-1;;;;;13778:38:1;13766:51;;13840:4;13864:12;;;;13899:15;;;;13739:1;13732:9;13705:219;;13935:548;14273:26;14269:31;14260:6;14256:2;14252:15;14248:53;14243:3;14236:66;14332:6;14327:2;14322:3;14318:12;14311:28;14348:45;14389:2;14384:3;14380:12;14372:6;14348:45;:::i;:::-;14402:46;14443:3;14438;14434:13;14426:6;14402:46;:::i;:::-;14473:3;14464:13;;13935:548;-1:-1:-1;;;;13935:548:1:o;14488:653::-;14799:3;14831:26;14827:31;14900:2;14891:6;14887:2;14883:15;14879:24;14874:3;14867:37;14934:6;14929:2;14924:3;14920:12;14913:28;14950:45;14991:2;14986:3;14982:12;14974:6;14950:45;:::i;:::-;15004:46;15045:3;15040;15036:13;15028:6;15004:46;:::i;:::-;15089:2;15085:15;;;;15081:24;;;15075:3;15066:13;;15059:47;15131:3;15122:13;;14488:653;-1:-1:-1;;;;;14488:653:1:o;15146:127::-;15207:10;15202:3;15198:20;15195:1;15188:31;15238:4;15235:1;15228:15;15262:4;15259:1;15252:15
Swarm Source
ipfs://39113458652616cc7cf4b9e7cb3ec51bc0b43287b4d5782c92e4adf4f8f3b9db
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.