More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 459 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Rewards | 20504758 | 138 days ago | IN | 0 ETH | 0.00010225 | ||||
Claim Rewards | 20504740 | 138 days ago | IN | 0 ETH | 0.0001305 | ||||
Claim Rewards | 20504726 | 138 days ago | IN | 0 ETH | 0.00010082 | ||||
Claim Rewards | 20504710 | 138 days ago | IN | 0 ETH | 0.00011437 | ||||
Claim Rewards | 20504701 | 138 days ago | IN | 0 ETH | 0.00013406 | ||||
Claim Rewards | 20504684 | 138 days ago | IN | 0 ETH | 0.00011406 | ||||
Claim Rewards | 20504668 | 138 days ago | IN | 0 ETH | 0.00012395 | ||||
Claim Rewards | 20504645 | 138 days ago | IN | 0 ETH | 0.00012895 | ||||
Claim Rewards | 20504617 | 138 days ago | IN | 0 ETH | 0.00014383 | ||||
Claim Rewards | 20504603 | 138 days ago | IN | 0 ETH | 0.00014386 | ||||
Claim Rewards | 20504583 | 138 days ago | IN | 0 ETH | 0.00012041 | ||||
Claim Rewards | 20504568 | 138 days ago | IN | 0 ETH | 0.00018944 | ||||
Claim Rewards | 20504543 | 138 days ago | IN | 0 ETH | 0.00011774 | ||||
Claim Rewards | 20504503 | 138 days ago | IN | 0 ETH | 0.00016629 | ||||
Claim Rewards | 20504439 | 138 days ago | IN | 0 ETH | 0.00011595 | ||||
Claim Rewards | 20500788 | 139 days ago | IN | 0 ETH | 0.00010789 | ||||
Claim Rewards | 20500759 | 139 days ago | IN | 0 ETH | 0.00009562 | ||||
Claim Rewards | 20500742 | 139 days ago | IN | 0 ETH | 0.00009906 | ||||
Claim Rewards | 20500731 | 139 days ago | IN | 0 ETH | 0.00010473 | ||||
Claim Rewards | 20500723 | 139 days ago | IN | 0 ETH | 0.00010548 | ||||
Claim Rewards | 20500715 | 139 days ago | IN | 0 ETH | 0.00011814 | ||||
Claim Rewards | 20500706 | 139 days ago | IN | 0 ETH | 0.00010064 | ||||
Claim Rewards | 20500690 | 139 days ago | IN | 0 ETH | 0.00012197 | ||||
Claim Rewards | 20500682 | 139 days ago | IN | 0 ETH | 0.00012197 | ||||
Claim Rewards | 20500672 | 139 days ago | IN | 0 ETH | 0.00014221 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DistributeRewards
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-13 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); 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 if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // 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/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.20; /** * @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 } /** * @dev The signature derives the `address(0)`. */ error ECDSAInvalidSignature(); /** * @dev The signature has an invalid length. */ error ECDSAInvalidSignatureLength(uint256 length); /** * @dev The signature has an S value that is in the upper half order. */ error ECDSAInvalidSignatureS(bytes32 s); /** * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not * return address(0) without also returning an error description. Errors are documented using an enum (error type) * and a bytes32 providing additional information about the error. * * If no error is returned, then the address can be used for verification purposes. * * The `ecrecover` EVM precompile 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 {MessageHashUtils-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] */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) { 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, bytes32(signature.length)); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM precompile 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 {MessageHashUtils-toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); _throwError(error, errorArg); 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] */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) { unchecked { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); // We do not check for an overflow here since the shift operation results in 0 or 1. 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. */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError, bytes32) { // 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, s); } // 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, bytes32(0)); } return (signer, RecoverError.NoError, bytes32(0)); } /** * @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, bytes32 errorArg) = tryRecover(hash, v, r, s); _throwError(error, errorArg); return recovered; } /** * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. */ function _throwError(RecoverError error, bytes32 errorArg) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert ECDSAInvalidSignature(); } else if (error == RecoverError.InvalidSignatureLength) { revert ECDSAInvalidSignatureLength(uint256(errorArg)); } else if (error == RecoverError.InvalidSignatureS) { revert ECDSAInvalidSignatureS(errorArg); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/DistributeRewards.sol pragma solidity ^0.8.20; contract DistributeRewards is ReentrancyGuard,Ownable{ using SafeERC20 for IERC20; struct Claim{ address user; address token; uint256 amount; uint256 nonce;//Change until receive the event bytes32 Hash; bytes32 r; bytes32 s; uint8 v; } bool public pause; mapping (address => bool) public signers; mapping (address => uint256) public claimNonce; event logSigner(address signer, bool isRemoval); event logClaimRewards(address user, bytes32 Hash, uint256 amount, uint256 nonce); modifier notPause() { require(!pause, "REWARDS:PAUSING_NOW"); _; } constructor() Ownable(msg.sender) { } function setPause(bool pauseOrNot_) external onlyOwner { pause = pauseOrNot_; } function hasRole(address account) public view returns (bool) { return signers[account]; } function grantRole(address account) public onlyOwner { _grantRole(account, true); } function deleteRole(address account) public onlyOwner { _grantRole(account, false); } function _grantRole(address account, bool grant) internal virtual { signers[account] = grant; } function claimRewards(Claim memory input) external nonReentrant notPause{ require(input.token != address(0), "Invalid token address"); require(msg.sender == input.user, "WRONG_USER"); require(claimNonce[msg.sender] == input.nonce, "WRONG_ORDER"); _verifyInputSignature(input); claimNonce[msg.sender] = claimNonce[msg.sender] + 1; IERC20 returnToken = IERC20(input.token); require(returnToken.balanceOf(address(this)) >= input.amount, "TOKEN_IS_NOT_ENOUGHT_PLZ_CONTACT_ADMIN"); returnToken.safeTransfer(msg.sender, input.amount); emit logClaimRewards(input.user, input.Hash, input.amount, input.nonce); } function _verifyInputSignature(Claim memory input) internal virtual { bytes32 hash = keccak256(abi.encode(input.user, input.token, input.amount, input.nonce)); require(hash == input.Hash, "WRONG_ENCODE"); address signer = ECDSA.recover(hash, input.v, input.r, input.s); require(signers[signer], 'Input signature error'); } function rescueFunds( address token, address userAddress, uint256 amount ) external onlyOwner { IERC20(token).safeTransfer(userAddress, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"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":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bytes32","name":"Hash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"logClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"},{"indexed":false,"internalType":"bool","name":"isRemoval","type":"bool"}],"name":"logSigner","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"Hash","type":"bytes32"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct DistributeRewards.Claim","name":"input","type":"tuple"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"deleteRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pauseOrNot_","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506001600055338061003c57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100458161004b565b5061009d565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d5a806100ac6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80637ef09bca116100715780637ef09bca146101625780638456cb591461018e5780638da5cb5b146101a25780639a706ca5146101bd578063bedb86fb146101d0578063f2fde38b146101e357600080fd5b806338977686146100b95780633ee22fcd146100ce57806354b025c5146101015780636ccae05414610114578063715018a614610127578063736c0d5b1461012f575b600080fd5b6100cc6100c7366004610b45565b6101f6565b005b6100ee6100dc366004610b45565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b6100cc61010f366004610b45565b61020c565b6100cc610122366004610b60565b61021f565b6100cc610240565b61015261013d366004610b45565b60026020526000908152604090205460ff1681565b60405190151581526020016100f8565b610152610170366004610b45565b6001600160a01b031660009081526002602052604090205460ff1690565b60015461015290600160a01b900460ff1681565b6001546040516001600160a01b0390911681526020016100f8565b6100cc6101cb366004610bad565b610254565b6100cc6101de366004610c6b565b610526565b6100cc6101f1366004610b45565b61054c565b6101fe610587565b6102098160016105b4565b50565b610214610587565b6102098160006105b4565b610227610587565b61023b6001600160a01b03841683836105df565b505050565b610248610587565b6102526000610631565b565b61025c610683565b600154600160a01b900460ff16156102b15760405162461bcd60e51b8152602060048201526013602482015272524557415244533a50415553494e475f4e4f5760681b60448201526064015b60405180910390fd5b60208101516001600160a01b03166103035760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b60448201526064016102a8565b80516001600160a01b031633146103495760405162461bcd60e51b815260206004820152600a6024820152692ba927a723afaaa9a2a960b11b60448201526064016102a8565b606081015133600090815260036020526040902054146103995760405162461bcd60e51b815260206004820152600b60248201526a2ba927a723afa7a92222a960a91b60448201526064016102a8565b6103a2816106ad565b336000908152600360205260409020546103bd906001610c88565b3360009081526003602090815260409182902092909255908201518282015191516370a0823160e01b81523060048201529091906001600160a01b038316906370a0823190602401602060405180830381865afa158015610422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104469190610ca9565b10156104a35760405162461bcd60e51b815260206004820152602660248201527f544f4b454e5f49535f4e4f545f454e4f554748545f504c5a5f434f4e544143546044820152652fa0a226a4a760d11b60648201526084016102a8565b60408201516104be906001600160a01b0383169033906105df565b815160808084015160408086015160608088015183516001600160a01b0390971687526020870194909452918501528301527f2e860e816260e34865aba348daec74b9d375fbb2f10c0790af46ca9db22f8985910160405180910390a1506102096001600055565b61052e610587565b60018054911515600160a01b0260ff60a01b19909216919091179055565b610554610587565b6001600160a01b03811661057e57604051631e4fbdf760e01b8152600060048201526024016102a8565b61020981610631565b6001546001600160a01b031633146102525760405163118cdaa760e01b81523360048201526024016102a8565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261023b9084906107d1565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002600054036106a657604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b600081600001518260200151836040015184606001516040516020016106fa94939291906001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b604051602081830303815290604052805190602001209050816080015181146107545760405162461bcd60e51b815260206004820152600c60248201526b57524f4e475f454e434f444560a01b60448201526064016102a8565b600061076e828460e001518560a001518660c00151610834565b6001600160a01b03811660009081526002602052604090205490915060ff1661023b5760405162461bcd60e51b815260206004820152601560248201527424b7383aba1039b4b3b730ba3ab9329032b93937b960591b60448201526064016102a8565b60006107e66001600160a01b03841683610862565b9050805160001415801561080b5750808060200190518101906108099190610cc2565b155b1561023b57604051635274afe760e01b81526001600160a01b03841660048201526024016102a8565b60008060008061084688888888610879565b9250925092506108568282610948565b50909695505050505050565b606061087083836000610a05565b90505b92915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156108b4575060009150600390508261093e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610908573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109345750600092506001915082905061093e565b9250600091508190505b9450945094915050565b600082600381111561095c5761095c610cdf565b03610965575050565b600182600381111561097957610979610cdf565b036109975760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156109ab576109ab610cdf565b036109cc5760405163fce698f760e01b8152600481018290526024016102a8565b60038260038111156109e0576109e0610cdf565b03610a01576040516335e2f38360e21b8152600481018290526024016102a8565b5050565b606081471015610a2a5760405163cd78605960e01b81523060048201526024016102a8565b600080856001600160a01b03168486604051610a469190610cf5565b60006040518083038185875af1925050503d8060008114610a83576040519150601f19603f3d011682016040523d82523d6000602084013e610a88565b606091505b5091509150610a98868383610aa4565b925050505b9392505050565b606082610ab957610ab482610b00565b610a9d565b8151158015610ad057506001600160a01b0384163b155b15610af957604051639996b31560e01b81526001600160a01b03851660048201526024016102a8565b5080610a9d565b805115610b105780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114610b4057600080fd5b919050565b600060208284031215610b5757600080fd5b61087082610b29565b600080600060608486031215610b7557600080fd5b610b7e84610b29565b9250610b8c60208501610b29565b9150604084013590509250925092565b803560ff81168114610b4057600080fd5b6000610100808385031215610bc157600080fd5b6040519081019067ffffffffffffffff82118183101715610bf257634e487b7160e01b600052604160045260246000fd5b81604052610bff84610b29565b8152610c0d60208501610b29565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c0820152610c5060e08501610b9c565b60e0820152949350505050565b801515811461020957600080fd5b600060208284031215610c7d57600080fd5b8135610a9d81610c5d565b8082018082111561087357634e487b7160e01b600052601160045260246000fd5b600060208284031215610cbb57600080fd5b5051919050565b600060208284031215610cd457600080fd5b8151610a9d81610c5d565b634e487b7160e01b600052602160045260246000fd5b6000825160005b81811015610d165760208186018101518583015201610cfc565b50600092019182525091905056fea2646970667358221220687c721b7eea4ac9dc6f8e2d65a396b91f4a65be6555534c568f083c42d9897564736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80637ef09bca116100715780637ef09bca146101625780638456cb591461018e5780638da5cb5b146101a25780639a706ca5146101bd578063bedb86fb146101d0578063f2fde38b146101e357600080fd5b806338977686146100b95780633ee22fcd146100ce57806354b025c5146101015780636ccae05414610114578063715018a614610127578063736c0d5b1461012f575b600080fd5b6100cc6100c7366004610b45565b6101f6565b005b6100ee6100dc366004610b45565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b6100cc61010f366004610b45565b61020c565b6100cc610122366004610b60565b61021f565b6100cc610240565b61015261013d366004610b45565b60026020526000908152604090205460ff1681565b60405190151581526020016100f8565b610152610170366004610b45565b6001600160a01b031660009081526002602052604090205460ff1690565b60015461015290600160a01b900460ff1681565b6001546040516001600160a01b0390911681526020016100f8565b6100cc6101cb366004610bad565b610254565b6100cc6101de366004610c6b565b610526565b6100cc6101f1366004610b45565b61054c565b6101fe610587565b6102098160016105b4565b50565b610214610587565b6102098160006105b4565b610227610587565b61023b6001600160a01b03841683836105df565b505050565b610248610587565b6102526000610631565b565b61025c610683565b600154600160a01b900460ff16156102b15760405162461bcd60e51b8152602060048201526013602482015272524557415244533a50415553494e475f4e4f5760681b60448201526064015b60405180910390fd5b60208101516001600160a01b03166103035760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b60448201526064016102a8565b80516001600160a01b031633146103495760405162461bcd60e51b815260206004820152600a6024820152692ba927a723afaaa9a2a960b11b60448201526064016102a8565b606081015133600090815260036020526040902054146103995760405162461bcd60e51b815260206004820152600b60248201526a2ba927a723afa7a92222a960a91b60448201526064016102a8565b6103a2816106ad565b336000908152600360205260409020546103bd906001610c88565b3360009081526003602090815260409182902092909255908201518282015191516370a0823160e01b81523060048201529091906001600160a01b038316906370a0823190602401602060405180830381865afa158015610422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104469190610ca9565b10156104a35760405162461bcd60e51b815260206004820152602660248201527f544f4b454e5f49535f4e4f545f454e4f554748545f504c5a5f434f4e544143546044820152652fa0a226a4a760d11b60648201526084016102a8565b60408201516104be906001600160a01b0383169033906105df565b815160808084015160408086015160608088015183516001600160a01b0390971687526020870194909452918501528301527f2e860e816260e34865aba348daec74b9d375fbb2f10c0790af46ca9db22f8985910160405180910390a1506102096001600055565b61052e610587565b60018054911515600160a01b0260ff60a01b19909216919091179055565b610554610587565b6001600160a01b03811661057e57604051631e4fbdf760e01b8152600060048201526024016102a8565b61020981610631565b6001546001600160a01b031633146102525760405163118cdaa760e01b81523360048201526024016102a8565b6001600160a01b03919091166000908152600260205260409020805460ff1916911515919091179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261023b9084906107d1565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6002600054036106a657604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b600081600001518260200151836040015184606001516040516020016106fa94939291906001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b604051602081830303815290604052805190602001209050816080015181146107545760405162461bcd60e51b815260206004820152600c60248201526b57524f4e475f454e434f444560a01b60448201526064016102a8565b600061076e828460e001518560a001518660c00151610834565b6001600160a01b03811660009081526002602052604090205490915060ff1661023b5760405162461bcd60e51b815260206004820152601560248201527424b7383aba1039b4b3b730ba3ab9329032b93937b960591b60448201526064016102a8565b60006107e66001600160a01b03841683610862565b9050805160001415801561080b5750808060200190518101906108099190610cc2565b155b1561023b57604051635274afe760e01b81526001600160a01b03841660048201526024016102a8565b60008060008061084688888888610879565b9250925092506108568282610948565b50909695505050505050565b606061087083836000610a05565b90505b92915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156108b4575060009150600390508261093e565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610908573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166109345750600092506001915082905061093e565b9250600091508190505b9450945094915050565b600082600381111561095c5761095c610cdf565b03610965575050565b600182600381111561097957610979610cdf565b036109975760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156109ab576109ab610cdf565b036109cc5760405163fce698f760e01b8152600481018290526024016102a8565b60038260038111156109e0576109e0610cdf565b03610a01576040516335e2f38360e21b8152600481018290526024016102a8565b5050565b606081471015610a2a5760405163cd78605960e01b81523060048201526024016102a8565b600080856001600160a01b03168486604051610a469190610cf5565b60006040518083038185875af1925050503d8060008114610a83576040519150601f19603f3d011682016040523d82523d6000602084013e610a88565b606091505b5091509150610a98868383610aa4565b925050505b9392505050565b606082610ab957610ab482610b00565b610a9d565b8151158015610ad057506001600160a01b0384163b155b15610af957604051639996b31560e01b81526001600160a01b03851660048201526024016102a8565b5080610a9d565b805115610b105780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114610b4057600080fd5b919050565b600060208284031215610b5757600080fd5b61087082610b29565b600080600060608486031215610b7557600080fd5b610b7e84610b29565b9250610b8c60208501610b29565b9150604084013590509250925092565b803560ff81168114610b4057600080fd5b6000610100808385031215610bc157600080fd5b6040519081019067ffffffffffffffff82118183101715610bf257634e487b7160e01b600052604160045260246000fd5b81604052610bff84610b29565b8152610c0d60208501610b29565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c0820152610c5060e08501610b9c565b60e0820152949350505050565b801515811461020957600080fd5b600060208284031215610c7d57600080fd5b8135610a9d81610c5d565b8082018082111561087357634e487b7160e01b600052601160045260246000fd5b600060208284031215610cbb57600080fd5b5051919050565b600060208284031215610cd457600080fd5b8151610a9d81610c5d565b634e487b7160e01b600052602160045260246000fd5b6000825160005b81811015610d165760208186018101518583015201610cfc565b50600092019182525091905056fea2646970667358221220687c721b7eea4ac9dc6f8e2d65a396b91f4a65be6555534c568f083c42d9897564736f6c63430008140033
Deployed Bytecode Sourcemap
34629:2589:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35599:97;;;;;;:::i;:::-;;:::i;:::-;;35036:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;35036:46:0;;;;;;;;35704:99;;;;;;:::i;:::-;;:::i;37021:192::-;;;;;;:::i;:::-;;:::i;33710:103::-;;;:::i;34989:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1063:14:1;;1056:22;1038:41;;1026:2;1011:18;34989:40:0;898:187:1;35488:103:0;;;;;;:::i;:::-;-1:-1:-1;;;;;35567:16:0;35543:4;35567:16;;;:7;:16;;;;;;;;;35488:103;34965:17;;;;;-1:-1:-1;;;34965:17:0;;;;;;33035:87;33108:6;;33035:87;;-1:-1:-1;;;;;33108:6:0;;;1236:51:1;;1224:2;1209:18;33035:87:0;1090:203:1;35928:713:0;;;;;;:::i;:::-;;:::i;35387:93::-;;;;;;:::i;:::-;;:::i;33968:220::-;;;;;;:::i;:::-;;:::i;35599:97::-;32921:13;:11;:13::i;:::-;35663:25:::1;35674:7;35683:4;35663:10;:25::i;:::-;35599:97:::0;:::o;35704:99::-;32921:13;:11;:13::i;:::-;35769:26:::1;35780:7;35789:5;35769:10;:26::i;37021:192::-:0;32921:13;:11;:13::i;:::-;37158:47:::1;-1:-1:-1::0;;;;;37158:26:0;::::1;37185:11:::0;37198:6;37158:26:::1;:47::i;:::-;37021:192:::0;;;:::o;33710:103::-;32921:13;:11;:13::i;:::-;33775:30:::1;33802:1;33775:18;:30::i;:::-;33710:103::o:0;35928:713::-;21493:21;:19;:21::i;:::-;35278:5:::1;::::0;-1:-1:-1;;;35278:5:0;::::1;;;35277:6;35269:38;;;::::0;-1:-1:-1;;;35269:38:0;;3076:2:1;35269:38:0::1;::::0;::::1;3058:21:1::0;3115:2;3095:18;;;3088:30;-1:-1:-1;;;3134:18:1;;;3127:49;3193:18;;35269:38:0::1;;;;;;;;;36019:11:::2;::::0;::::2;::::0;-1:-1:-1;;;;;36019:25:0::2;36011:59;;;::::0;-1:-1:-1;;;36011:59:0;;3424:2:1;36011:59:0::2;::::0;::::2;3406:21:1::0;3463:2;3443:18;;;3436:30;-1:-1:-1;;;3482:18:1;;;3475:51;3543:18;;36011:59:0::2;3222:345:1::0;36011:59:0::2;36103:10:::0;;-1:-1:-1;;;;;36089:24:0::2;:10;:24;36081:47;;;::::0;-1:-1:-1;;;36081:47:0;;3774:2:1;36081:47:0::2;::::0;::::2;3756:21:1::0;3813:2;3793:18;;;3786:30;-1:-1:-1;;;3832:18:1;;;3825:40;3882:18;;36081:47:0::2;3572:334:1::0;36081:47:0::2;36173:11;::::0;::::2;::::0;36158:10:::2;36147:22;::::0;;;:10:::2;:22;::::0;;;;;:37:::2;36139:61;;;::::0;-1:-1:-1;;;36139:61:0;;4113:2:1;36139:61:0::2;::::0;::::2;4095:21:1::0;4152:2;4132:18;;;4125:30;-1:-1:-1;;;4171:18:1;;;4164:41;4222:18;;36139:61:0::2;3911:335:1::0;36139:61:0::2;36221:28;36243:5;36221:21;:28::i;:::-;36296:10;36285:22;::::0;;;:10:::2;:22;::::0;;;;;:26:::2;::::0;36310:1:::2;36285:26;:::i;:::-;36271:10;36260:22;::::0;;;:10:::2;:22;::::0;;;;;;;;:51;;;;36352:11;;::::2;::::0;36423:12;;::::2;::::0;36383:36;;-1:-1:-1;;;36383:36:0;;36413:4:::2;36383:36;::::0;::::2;1236:51:1::0;36352:11:0;;36423:12;-1:-1:-1;;;;;36383:21:0;::::2;::::0;::::2;::::0;1209:18:1;;36383:36:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;36375:103;;;::::0;-1:-1:-1;;;36375:103:0;;4869:2:1;36375:103:0::2;::::0;::::2;4851:21:1::0;4908:2;4888:18;;;4881:30;4947:34;4927:18;;;4920:62;-1:-1:-1;;;4998:18:1;;;4991:36;5044:19;;36375:103:0::2;4667:402:1::0;36375:103:0::2;36528:12;::::0;::::2;::::0;36491:50:::2;::::0;-1:-1:-1;;;;;36491:24:0;::::2;::::0;36516:10:::2;::::0;36491:24:::2;:50::i;:::-;36583:10:::0;;36595::::2;::::0;;::::2;::::0;36607:12:::2;::::0;;::::2;::::0;36621:11:::2;::::0;;::::2;::::0;36567:66;;-1:-1:-1;;;;;5323:32:1;;;5305:51;;5387:2;5372:18;;5365:34;;;;5415:18;;;5408:34;5458:18;;5451:34;36567:66:0::2;::::0;5277:19:1;36567:66:0::2;;;;;;;36000:641;21537:20:::0;20828:1;22079:7;:21;21896:212;35387:93;32921:13;:11;:13::i;:::-;35453:5:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;35453:19:0::1;-1:-1:-1::0;;;;35453:19:0;;::::1;::::0;;;::::1;::::0;;35387:93::o;33968:220::-;32921:13;:11;:13::i;:::-;-1:-1:-1;;;;;34053:22:0;::::1;34049:93;;34099:31;::::0;-1:-1:-1;;;34099:31:0;;34127:1:::1;34099:31;::::0;::::1;1236:51:1::0;1209:18;;34099:31:0::1;1090:203:1::0;34049:93:0::1;34152:28;34171:8;34152:18;:28::i;33200:166::-:0;33108:6;;-1:-1:-1;;;;;33108:6:0;31124:10;33260:23;33256:103;;33307:40;;-1:-1:-1;;;33307:40:0;;31124:10;33307:40;;;1236:51:1;1209:18;;33307:40:0;1090:203:1;35811:109:0;-1:-1:-1;;;;;35888:16:0;;;;;;;;:7;:16;;;;;:24;;-1:-1:-1;;35888:24:0;;;;;;;;;;35811:109::o;14499:162::-;14609:43;;;-1:-1:-1;;;;;5688:32:1;;14609:43:0;;;5670:51:1;5737:18;;;;5730:34;;;14609:43:0;;;;;;;;;;5643:18:1;;;;14609:43:0;;;;;;;;-1:-1:-1;;;;;14609:43:0;-1:-1:-1;;;14609:43:0;;;14582:71;;14602:5;;14582:19;:71::i;34348:191::-;34441:6;;;-1:-1:-1;;;;;34458:17:0;;;-1:-1:-1;;;;;;34458:17:0;;;;;;;34491:40;;34441:6;;;34458:17;34441:6;;34491:40;;34422:16;;34491:40;34411:128;34348:191;:::o;21573:315::-;20871:1;21702:7;;:18;21698:88;;21744:30;;-1:-1:-1;;;21744:30:0;;;;;;;;;;;21698:88;20871:1;21863:7;:17;21573:315::o;36649:363::-;36728:12;36764:5;:10;;;36776:5;:11;;;36789:5;:12;;;36803:5;:11;;;36753:62;;;;;;;;;;-1:-1:-1;;;;;6062:15:1;;;6044:34;;6114:15;;;;6109:2;6094:18;;6087:43;6161:2;6146:18;;6139:34;6204:2;6189:18;;6182:34;;;;5993:3;5978:19;;5775:447;36753:62:0;;;;;;;;;;;;;36743:73;;;;;;36728:88;;36843:5;:10;;;36835:4;:18;36827:43;;;;-1:-1:-1;;;36827:43:0;;6429:2:1;36827:43:0;;;6411:21:1;6468:2;6448:18;;;6441:30;-1:-1:-1;;;6487:18:1;;;6480:42;6539:18;;36827:43:0;6227:336:1;36827:43:0;36881:14;36898:46;36912:4;36918:5;:7;;;36927:5;:7;;;36936:5;:7;;;36898:13;:46::i;:::-;-1:-1:-1;;;;;36963:15:0;;;;;;:7;:15;;;;;;36881:63;;-1:-1:-1;36963:15:0;;36955:49;;;;-1:-1:-1;;;36955:49:0;;6770:2:1;36955:49:0;;;6752:21:1;6809:2;6789:18;;;6782:30;-1:-1:-1;;;6828:18:1;;;6821:51;6889:18;;36955:49:0;6568:345:1;17310:638:0;17734:23;17760:33;-1:-1:-1;;;;;17760:27:0;;17788:4;17760:27;:33::i;:::-;17734:59;;17808:10;:17;17829:1;17808:22;;:57;;;;;17846:10;17835:30;;;;;;;;;;;;:::i;:::-;17834:31;17808:57;17804:137;;;17889:40;;-1:-1:-1;;;17889:40:0;;-1:-1:-1;;;;;1254:32:1;;17889:40:0;;;1236:51:1;1209:18;;17889:40:0;1090:203:1;29398:264:0;29483:7;29504:17;29523:18;29543:16;29563:25;29574:4;29580:1;29583;29586;29563:10;:25::i;:::-;29503:85;;;;;;29599:28;29611:5;29618:8;29599:11;:28::i;:::-;-1:-1:-1;29645:9:0;;29398:264;-1:-1:-1;;;;;;29398:264:0:o;9625:153::-;9700:12;9732:38;9754:6;9762:4;9768:1;9732:21;:38::i;:::-;9725:45;;9625:153;;;;;:::o;27703:1556::-;27834:7;;;28777:66;28764:79;;28760:166;;;-1:-1:-1;28876:1:0;;-1:-1:-1;28880:30:0;;-1:-1:-1;28912:1:0;28860:54;;28760:166;29040:24;;;29023:14;29040:24;;;;;;;;;7395:25:1;;;7468:4;7456:17;;7436:18;;;7429:45;;;;7490:18;;;7483:34;;;7533:18;;;7526:34;;;29040:24:0;;7367:19:1;;29040:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29040:24:0;;-1:-1:-1;;29040:24:0;;;-1:-1:-1;;;;;;;29079:20:0;;29075:115;;-1:-1:-1;29132:1:0;;-1:-1:-1;29136:29:0;;-1:-1:-1;29132:1:0;;-1:-1:-1;29116:62:0;;29075:115;29210:6;-1:-1:-1;29218:20:0;;-1:-1:-1;29218:20:0;;-1:-1:-1;27703:1556:0;;;;;;;;;:::o;29800:542::-;29896:20;29887:5;:29;;;;;;;;:::i;:::-;;29883:452;;29800:542;;:::o;29883:452::-;29994:29;29985:5;:38;;;;;;;;:::i;:::-;;29981:354;;30047:23;;-1:-1:-1;;;30047:23:0;;;;;;;;;;;29981:354;30101:35;30092:5;:44;;;;;;;;:::i;:::-;;30088:247;;30160:46;;-1:-1:-1;;;30160:46:0;;;;;529:25:1;;;502:18;;30160:46:0;383:177:1;30088:247:0;30237:30;30228:5;:39;;;;;;;;:::i;:::-;;30224:111;;30291:32;;-1:-1:-1;;;30291:32:0;;;;;529:25:1;;;502:18;;30291:32:0;383:177:1;30224:111:0;29800:542;;:::o;10113:398::-;10212:12;10265:5;10241:21;:29;10237:110;;;10294:41;;-1:-1:-1;;;10294:41:0;;10329:4;10294:41;;;1236:51:1;1209:18;;10294:41:0;1090:203:1;10237:110:0;10358:12;10372:23;10399:6;-1:-1:-1;;;;;10399:11:0;10418:5;10425:4;10399:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10357:73;;;;10448:55;10475:6;10483:7;10492:10;10448:26;:55::i;:::-;10441:62;;;;10113:398;;;;;;:::o;11589:597::-;11737:12;11767:7;11762:417;;11791:19;11799:10;11791:7;:19::i;:::-;11762:417;;;12019:17;;:22;:49;;;;-1:-1:-1;;;;;;12045:18:0;;;:23;12019:49;12015:121;;;12096:24;;-1:-1:-1;;;12096:24:0;;-1:-1:-1;;;;;1254:32:1;;12096:24:0;;;1236:51:1;1209:18;;12096:24:0;1090:203:1;12015:121:0;-1:-1:-1;12157:10:0;12150:17;;12739:528;12872:17;;:21;12868:392;;13104:10;13098:17;13161:15;13148:10;13144:2;13140:19;13133:44;12868:392;13231:17;;-1:-1:-1;;;13231:17:0;;;;;;;;;;;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;565:328::-;642:6;650;658;711:2;699:9;690:7;686:23;682:32;679:52;;;727:1;724;717:12;679:52;750:29;769:9;750:29;:::i;:::-;740:39;;798:38;832:2;821:9;817:18;798:38;:::i;:::-;788:48;;883:2;872:9;868:18;855:32;845:42;;565:328;;;;;:::o;1298:156::-;1364:20;;1424:4;1413:16;;1403:27;;1393:55;;1444:1;1441;1434:12;1459:1041;1541:6;1572:3;1616:2;1604:9;1595:7;1591:23;1587:32;1584:52;;;1632:1;1629;1622:12;1584:52;1665:2;1659:9;1695:15;;;;1740:18;1725:34;;1761:22;;;1722:62;1719:185;;;1826:10;1821:3;1817:20;1814:1;1807:31;1861:4;1858:1;1851:15;1889:4;1886:1;1879:15;1719:185;1924:10;1920:2;1913:22;1959:29;1978:9;1959:29;:::i;:::-;1951:6;1944:45;2022:38;2056:2;2045:9;2041:18;2022:38;:::i;:::-;2017:2;2009:6;2005:15;1998:63;2122:2;2111:9;2107:18;2094:32;2089:2;2081:6;2077:15;2070:57;2188:2;2177:9;2173:18;2160:32;2155:2;2147:6;2143:15;2136:57;2255:3;2244:9;2240:19;2227:33;2221:3;2213:6;2209:16;2202:59;2323:3;2312:9;2308:19;2295:33;2289:3;2281:6;2277:16;2270:59;2391:3;2380:9;2376:19;2363:33;2357:3;2349:6;2345:16;2338:59;2431:37;2463:3;2452:9;2448:19;2431:37;:::i;:::-;2425:3;2413:16;;2406:63;2417:6;1459:1041;-1:-1:-1;;;;1459:1041:1:o;2505:118::-;2591:5;2584:13;2577:21;2570:5;2567:32;2557:60;;2613:1;2610;2603:12;2628:241;2684:6;2737:2;2725:9;2716:7;2712:23;2708:32;2705:52;;;2753:1;2750;2743:12;2705:52;2792:9;2779:23;2811:28;2833:5;2811:28;:::i;4251:222::-;4316:9;;;4337:10;;;4334:133;;;4389:10;4384:3;4380:20;4377:1;4370:31;4424:4;4421:1;4414:15;4452:4;4449:1;4442:15;4478:184;4548:6;4601:2;4589:9;4580:7;4576:23;4572:32;4569:52;;;4617:1;4614;4607:12;4569:52;-1:-1:-1;4640:16:1;;4478:184;-1:-1:-1;4478:184:1:o;6918:245::-;6985:6;7038:2;7026:9;7017:7;7013:23;7009:32;7006:52;;;7054:1;7051;7044:12;7006:52;7086:9;7080:16;7105:28;7127:5;7105:28;:::i;7571:127::-;7632:10;7627:3;7623:20;7620:1;7613:31;7663:4;7660:1;7653:15;7687:4;7684:1;7677:15;7885:412;8014:3;8052:6;8046:13;8077:1;8087:129;8101:6;8098:1;8095:13;8087:129;;;8199:4;8183:14;;;8179:25;;8173:32;8160:11;;;8153:53;8116:12;8087:129;;;-1:-1:-1;8271:1:1;8235:16;;8260:13;;;-1:-1:-1;8235:16:1;7885:412;-1:-1:-1;7885:412:1:o
Swarm Source
ipfs://687c721b7eea4ac9dc6f8e2d65a396b91f4a65be6555534c568f083c42d98975
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000257 | 402,200 | $103.25 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.