REKT's REKT Distributor contract on Arbitrum. This nametag was submitted by Kleros Scout.
Latest 25 from a total of 271,872 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 138738442 | 769 days ago | IN | 0 ETH | 0.00003473 | ||||
| Claim | 114487329 | 845 days ago | IN | 0 ETH | 0.00015178 | ||||
| Claim | 97900290 | 894 days ago | IN | 0 ETH | 0.00008252 | ||||
| Airdrop | 93661374 | 906 days ago | IN | 0 ETH | 0.00031329 | ||||
| Claim | 93099055 | 908 days ago | IN | 0 ETH | 0.00009386 | ||||
| Claim | 91883575 | 912 days ago | IN | 0 ETH | 0.0001291 | ||||
| Claim | 90210204 | 917 days ago | IN | 0 ETH | 0.00013476 | ||||
| Claim | 89677731 | 918 days ago | IN | 0 ETH | 0.00038729 | ||||
| Claim | 89088139 | 920 days ago | IN | 0 ETH | 0.00019692 | ||||
| Claim | 86212108 | 929 days ago | IN | 0 ETH | 0.00018533 | ||||
| Claim | 86212069 | 929 days ago | IN | 0 ETH | 0.00018533 | ||||
| Set Signer | 86127825 | 929 days ago | IN | 0 ETH | 0.00006594 | ||||
| Claim | 85835695 | 930 days ago | IN | 0 ETH | 0.00010224 | ||||
| Claim | 85680968 | 930 days ago | IN | 0 ETH | 0.00010796 | ||||
| Claim | 85599616 | 930 days ago | IN | 0 ETH | 0.00012928 | ||||
| Claim | 85487343 | 931 days ago | IN | 0 ETH | 0.00011294 | ||||
| Claim | 85220201 | 931 days ago | IN | 0 ETH | 0.00011698 | ||||
| Claim | 84889566 | 932 days ago | IN | 0 ETH | 0.00013107 | ||||
| Claim | 84851308 | 933 days ago | IN | 0 ETH | 0.00010865 | ||||
| Claim | 84846850 | 933 days ago | IN | 0 ETH | 0.00011711 | ||||
| Claim | 84843756 | 933 days ago | IN | 0 ETH | 0.00013243 | ||||
| Claim | 84843749 | 933 days ago | IN | 0 ETH | 0.00013379 | ||||
| Claim | 84843564 | 933 days ago | IN | 0 ETH | 0.00013403 | ||||
| Claim | 84843043 | 933 days ago | IN | 0 ETH | 0.00013379 | ||||
| Claim | 84842700 | 933 days ago | IN | 0 ETH | 0.00013403 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RektDistributor
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
contract RektDistributor is Ownable {
using ECDSA for bytes32;
IERC20 public token;
address public signer;
uint256 public constant MAX_ADDRESSES = 625_143;
uint256 public constant MAX_TOKEN = 84_000_000_000_000 * 1e6;
uint256 public constant INIT_CLAIM = 516_800_000 * 1e6;
uint256 public constant MAX_REFER_TOKEN = 4_200_000_000_000 * 1e6;
mapping(uint256 => bool) public _usedNonce;
mapping(address => bool) public _claimedUser;
mapping(address => uint256) public inviteRewards;
uint256 public claimedSupply = 0;
uint256 public claimedCount = 0;
uint256 public claimedPercentage = 0;
mapping(address => uint256) public inviteUsers;
uint256 public referReward = 0;
event Claim(address indexed user, uint128 nonce, uint256 amount, address referrer, uint timestamp);
function canClaimAmount() public view returns(uint256) {
if (claimedCount >= MAX_ADDRESSES) {
return 0;
}
uint256 supplyPerAddress = INIT_CLAIM;
uint256 curClaimedCount = claimedCount + 1;
uint256 claimedPercent = curClaimedCount * 100e6 / MAX_ADDRESSES;
uint256 curPercent = 5e6;
while (curPercent <= claimedPercent) {
supplyPerAddress = (supplyPerAddress * 80) / 100;
curPercent += 5e6;
}
return supplyPerAddress;
}
function claim(uint128 nonce, bytes calldata signature, address referrer) public {
require(_usedNonce[nonce] == false, "REKT: nonce already used");
require(_claimedUser[_msgSender()] == false, "REKT: already claimed");
_claimedUser[_msgSender()] = true;
require(isValidSignature(nonce, signature), "REKT: only auth claims");
_usedNonce[nonce] = true;
uint256 supplyPerAddress = canClaimAmount();
require(supplyPerAddress >= 1e6, "REKT: airdrop has ended");
uint256 amount = canClaimAmount();
token.transfer(_msgSender(), amount);
claimedCount++;
claimedSupply += supplyPerAddress;
if (claimedCount > 0) {
claimedPercentage = (claimedCount * 100) / MAX_ADDRESSES;
}
if (referrer != address(0) && referrer != _msgSender() && referReward < MAX_REFER_TOKEN) {
uint256 num = amount * 100 / 1000;
token.transfer(referrer, num);
inviteRewards[referrer] += num;
inviteUsers[referrer]++;
referReward += num;
}
emit Claim(_msgSender(), nonce, amount, referrer, block.timestamp);
}
function setSigner(address val) public onlyOwner() {
require(val != address(0), "REKT: val is the zero address");
signer = val;
}
function setToken(address _tokenAddress) public onlyOwner() {
token = IERC20(_tokenAddress);
}
function isValidSignature(
uint128 nonce,
bytes memory signature
) view internal returns (bool) {
bytes32 data = keccak256(abi.encodePacked(address(this), _msgSender(), nonce));
return signer == data.toEthSignedMessageHash().recover(signature);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @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 anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC1271 standard signature validation method for
* contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].
*
* _Available since v4.1._
*/
interface IERC1271 {
/**
* @dev Should return whether the signature provided is valid for the provided data
* @param hash Hash of the data to be signed
* @param signature Signature byte array associated with _data
*/
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @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) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @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) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/SignatureChecker.sol)
pragma solidity ^0.8.0;
import "./ECDSA.sol";
import "../Address.sol";
import "../../interfaces/IERC1271.sol";
/**
* @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA
* signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like
* Argent and Gnosis Safe.
*
* _Available since v4.1._
*/
library SignatureChecker {
/**
* @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the
* signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.
*
* NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus
* change through time. It could return true at block N and false at block N+1 (or the opposite).
*/
function isValidSignatureNow(
address signer,
bytes32 hash,
bytes memory signature
) internal view returns (bool) {
(address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);
if (error == ECDSA.RecoverError.NoError && recovered == signer) {
return true;
}
(bool success, bytes memory result) = signer.staticcall(
abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)
);
return (success &&
result.length == 32 &&
abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint128","name":"nonce","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"INIT_CLAIM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ADDRESSES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REFER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_claimedUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_usedNonce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"nonce","type":"uint128"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"referrer","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimedPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"inviteRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"inviteUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526000600655600060075560006008556000600a5534801561002457600080fd5b5061004161003661004660201b60201c565b61004e60201b60201c565b610112565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e4f806101216000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80638431165e116100b8578063c08fa1a41161007c578063c08fa1a41461032e578063e14204b51461034c578063ef45e2401461036a578063f2fde38b14610388578063f6303ef5146103a4578063fc0c546a146103c057610137565b80638431165e146102745780638d2c5d44146102925780638da5cb5b146102c257806397b63b04146102e0578063bfc2aa2a1461031057610137565b8063634da787116100ff578063634da787146101f45780636c19e783146102125780636e1bd3231461022e578063715018a61461024c5780637b0a64451461025657610137565b8063144fa6d71461013c578063238ac9331461015857806325d3ab5c146101765780635b8aca6c146101a65780635cdd060c146101d6575b600080fd5b610156600480360381019061015191906112aa565b6103de565b005b61016061042a565b60405161016d91906112e6565b60405180910390f35b610190600480360381019061018b9190611337565b610450565b60405161019d919061137f565b60405180910390f35b6101c060048036038101906101bb91906112aa565b610470565b6040516101cd91906113a9565b60405180910390f35b6101de610488565b6040516101eb91906113a9565b60405180910390f35b6101fc610494565b60405161020991906113a9565b60405180910390f35b61022c600480360381019061022791906112aa565b61049b565b005b610236610556565b60405161024391906113a9565b60405180910390f35b610254610563565b005b61025e610577565b60405161026b91906113a9565b60405180910390f35b61027c61057d565b60405161028991906113a9565b60405180910390f35b6102ac60048036038101906102a791906112aa565b610621565b6040516102b991906113a9565b60405180910390f35b6102ca610639565b6040516102d791906112e6565b60405180910390f35b6102fa60048036038101906102f591906112aa565b610662565b604051610307919061137f565b60405180910390f35b610318610682565b60405161032591906113a9565b60405180910390f35b610336610688565b60405161034391906113a9565b60405180910390f35b61035461068e565b60405161036191906113a9565b60405180910390f35b610372610699565b60405161037f91906113a9565b60405180910390f35b6103a2600480360381019061039d91906112aa565b61069f565b005b6103be60048036038101906103b99190611471565b610722565b005b6103c8610d37565b6040516103d59190611544565b60405180910390f35b6103e6610d5d565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b60096020528060005260406000206000915090505481565b673a4965bf58a4000081565b620989f781565b6104a3610d5d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610509906115bc565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b68048dbbf2f2ecd0000081565b61056b610d5d565b6105756000610ddb565b565b600a5481565b6000620989f760075410610594576000905061061e565b60006601d606e06b80009050600060016007546105b1919061160b565b90506000620989f76305f5e100836105c9919061163f565b6105d391906116b0565b90506000624c4b4090505b8181116106165760646050856105f4919061163f565b6105fe91906116b0565b9350624c4b408161060f919061160b565b90506105de565b839450505050505b90565b60056020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915054906101000a900460ff1681565b60065481565b60075481565b6601d606e06b800081565b60085481565b6106a7610d5d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070d90611753565b60405180910390fd5b61071f81610ddb565b50565b6000151560036000866fffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461079b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610792906117bf565b60405180910390fd5b60001515600460006107ab610e9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c9061182b565b60405180910390fd5b600160046000610843610e9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506108e28484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610ea7565b610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890611897565b60405180910390fd5b600160036000866fffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061096961057d565b9050620f42408110156109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890611903565b60405180910390fd5b60006109bb61057d565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610a03610e9f565b836040518363ffffffff1660e01b8152600401610a21929190611923565b6020604051808303816000875af1158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a649190611978565b5060076000815480929190610a78906119a5565b91905055508160066000828254610a8f919061160b565b9250508190555060006007541115610ac557620989f76064600754610ab4919061163f565b610abe91906116b0565b6008819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015610b355750610b05610e9f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015610b4a5750673a4965bf58a40000600a54105b15610cd45760006103e8606483610b61919061163f565b610b6b91906116b0565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610bca929190611923565b6020604051808303816000875af1158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190611978565b5080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c5d919061160b565b92505081905550600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cb4906119a5565b919050555080600a6000828254610ccb919061160b565b92505081905550505b610cdc610e9f565b73ffffffffffffffffffffffffffffffffffffffff167f43df200563d66c23d96ffc5da991b910cb5fc0e45018c64c7fe558830feec39287838642604051610d2794939291906119fc565b60405180910390a2505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d65610e9f565b73ffffffffffffffffffffffffffffffffffffffff16610d83610639565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd090611a8d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008030610eb3610e9f565b85604051602001610ec693929190611b2b565b604051602081830303815290604052805190602001209050610ef983610eeb83610f52565b610f8290919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b600081604051602001610f659190611bea565b604051602081830303815290604052805190602001209050919050565b6000806000610f918585610fa9565b91509150610f9e81610ffa565b819250505092915050565b6000806041835103610fea5760008060006020860151925060408601519150606086015160001a9050610fde87828585611160565b94509450505050610ff3565b60006002915091505b9250929050565b6000600481111561100e5761100d611c10565b5b81600481111561102157611020611c10565b5b031561115d576001600481111561103b5761103a611c10565b5b81600481111561104e5761104d611c10565b5b0361108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590611c8b565b60405180910390fd5b600260048111156110a2576110a1611c10565b5b8160048111156110b5576110b4611c10565b5b036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90611cf7565b60405180910390fd5b6003600481111561110957611108611c10565b5b81600481111561111c5761111b611c10565b5b0361115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390611d89565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561119b576000600391509150611239565b6000600187878787604051600081526020016040526040516111c09493929190611dd4565b6020604051602081039080840390855afa1580156111e2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361123057600060019250925050611239565b80600092509250505b94509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006112778261124c565b9050919050565b6112878161126c565b811461129257600080fd5b50565b6000813590506112a48161127e565b92915050565b6000602082840312156112c0576112bf611242565b5b60006112ce84828501611295565b91505092915050565b6112e08161126c565b82525050565b60006020820190506112fb60008301846112d7565b92915050565b6000819050919050565b61131481611301565b811461131f57600080fd5b50565b6000813590506113318161130b565b92915050565b60006020828403121561134d5761134c611242565b5b600061135b84828501611322565b91505092915050565b60008115159050919050565b61137981611364565b82525050565b60006020820190506113946000830184611370565b92915050565b6113a381611301565b82525050565b60006020820190506113be600083018461139a565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6113e9816113c4565b81146113f457600080fd5b50565b600081359050611406816113e0565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126114315761143061140c565b5b8235905067ffffffffffffffff81111561144e5761144d611411565b5b60208301915083600182028301111561146a57611469611416565b5b9250929050565b6000806000806060858703121561148b5761148a611242565b5b6000611499878288016113f7565b945050602085013567ffffffffffffffff8111156114ba576114b9611247565b5b6114c68782880161141b565b935093505060406114d987828801611295565b91505092959194509250565b6000819050919050565b600061150a6115056115008461124c565b6114e5565b61124c565b9050919050565b600061151c826114ef565b9050919050565b600061152e82611511565b9050919050565b61153e81611523565b82525050565b60006020820190506115596000830184611535565b92915050565b600082825260208201905092915050565b7f52454b543a2076616c20697320746865207a65726f2061646472657373000000600082015250565b60006115a6601d8361155f565b91506115b182611570565b602082019050919050565b600060208201905081810360008301526115d581611599565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061161682611301565b915061162183611301565b9250828201905080821115611639576116386115dc565b5b92915050565b600061164a82611301565b915061165583611301565b925082820261166381611301565b9150828204841483151761167a576116796115dc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116bb82611301565b91506116c683611301565b9250826116d6576116d5611681565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061173d60268361155f565b9150611748826116e1565b604082019050919050565b6000602082019050818103600083015261176c81611730565b9050919050565b7f52454b543a206e6f6e636520616c726561647920757365640000000000000000600082015250565b60006117a960188361155f565b91506117b482611773565b602082019050919050565b600060208201905081810360008301526117d88161179c565b9050919050565b7f52454b543a20616c726561647920636c61696d65640000000000000000000000600082015250565b600061181560158361155f565b9150611820826117df565b602082019050919050565b6000602082019050818103600083015261184481611808565b9050919050565b7f52454b543a206f6e6c79206175746820636c61696d7300000000000000000000600082015250565b600061188160168361155f565b915061188c8261184b565b602082019050919050565b600060208201905081810360008301526118b081611874565b9050919050565b7f52454b543a2061697264726f702068617320656e646564000000000000000000600082015250565b60006118ed60178361155f565b91506118f8826118b7565b602082019050919050565b6000602082019050818103600083015261191c816118e0565b9050919050565b600060408201905061193860008301856112d7565b611945602083018461139a565b9392505050565b61195581611364565b811461196057600080fd5b50565b6000815190506119728161194c565b92915050565b60006020828403121561198e5761198d611242565b5b600061199c84828501611963565b91505092915050565b60006119b082611301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036119e2576119e16115dc565b5b600182019050919050565b6119f6816113c4565b82525050565b6000608082019050611a1160008301876119ed565b611a1e602083018661139a565b611a2b60408301856112d7565b611a38606083018461139a565b95945050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611a7760208361155f565b9150611a8282611a41565b602082019050919050565b60006020820190508181036000830152611aa681611a6a565b9050919050565b60008160601b9050919050565b6000611ac582611aad565b9050919050565b6000611ad782611aba565b9050919050565b611aef611aea8261126c565b611acc565b82525050565b60008160801b9050919050565b6000611b0d82611af5565b9050919050565b611b25611b20826113c4565b611b02565b82525050565b6000611b378286611ade565b601482019150611b478285611ade565b601482019150611b578284611b14565b601082019150819050949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000611ba9601c83611b68565b9150611bb482611b73565b601c82019050919050565b6000819050919050565b6000819050919050565b611be4611bdf82611bbf565b611bc9565b82525050565b6000611bf582611b9c565b9150611c018284611bd3565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611c7560188361155f565b9150611c8082611c3f565b602082019050919050565b60006020820190508181036000830152611ca481611c68565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611ce1601f8361155f565b9150611cec82611cab565b602082019050919050565b60006020820190508181036000830152611d1081611cd4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d7360228361155f565b9150611d7e82611d17565b604082019050919050565b60006020820190508181036000830152611da281611d66565b9050919050565b611db281611bbf565b82525050565b600060ff82169050919050565b611dce81611db8565b82525050565b6000608082019050611de96000830187611da9565b611df66020830186611dc5565b611e036040830185611da9565b611e106060830184611da9565b9594505050505056fea2646970667358221220076c2a00c65c0af9f2fc040b7d6995b22b3edd729bdd833e5c413a8b5f3e0a8264736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80638431165e116100b8578063c08fa1a41161007c578063c08fa1a41461032e578063e14204b51461034c578063ef45e2401461036a578063f2fde38b14610388578063f6303ef5146103a4578063fc0c546a146103c057610137565b80638431165e146102745780638d2c5d44146102925780638da5cb5b146102c257806397b63b04146102e0578063bfc2aa2a1461031057610137565b8063634da787116100ff578063634da787146101f45780636c19e783146102125780636e1bd3231461022e578063715018a61461024c5780637b0a64451461025657610137565b8063144fa6d71461013c578063238ac9331461015857806325d3ab5c146101765780635b8aca6c146101a65780635cdd060c146101d6575b600080fd5b610156600480360381019061015191906112aa565b6103de565b005b61016061042a565b60405161016d91906112e6565b60405180910390f35b610190600480360381019061018b9190611337565b610450565b60405161019d919061137f565b60405180910390f35b6101c060048036038101906101bb91906112aa565b610470565b6040516101cd91906113a9565b60405180910390f35b6101de610488565b6040516101eb91906113a9565b60405180910390f35b6101fc610494565b60405161020991906113a9565b60405180910390f35b61022c600480360381019061022791906112aa565b61049b565b005b610236610556565b60405161024391906113a9565b60405180910390f35b610254610563565b005b61025e610577565b60405161026b91906113a9565b60405180910390f35b61027c61057d565b60405161028991906113a9565b60405180910390f35b6102ac60048036038101906102a791906112aa565b610621565b6040516102b991906113a9565b60405180910390f35b6102ca610639565b6040516102d791906112e6565b60405180910390f35b6102fa60048036038101906102f591906112aa565b610662565b604051610307919061137f565b60405180910390f35b610318610682565b60405161032591906113a9565b60405180910390f35b610336610688565b60405161034391906113a9565b60405180910390f35b61035461068e565b60405161036191906113a9565b60405180910390f35b610372610699565b60405161037f91906113a9565b60405180910390f35b6103a2600480360381019061039d91906112aa565b61069f565b005b6103be60048036038101906103b99190611471565b610722565b005b6103c8610d37565b6040516103d59190611544565b60405180910390f35b6103e6610d5d565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b60096020528060005260406000206000915090505481565b673a4965bf58a4000081565b620989f781565b6104a3610d5d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610509906115bc565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b68048dbbf2f2ecd0000081565b61056b610d5d565b6105756000610ddb565b565b600a5481565b6000620989f760075410610594576000905061061e565b60006601d606e06b80009050600060016007546105b1919061160b565b90506000620989f76305f5e100836105c9919061163f565b6105d391906116b0565b90506000624c4b4090505b8181116106165760646050856105f4919061163f565b6105fe91906116b0565b9350624c4b408161060f919061160b565b90506105de565b839450505050505b90565b60056020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60046020528060005260406000206000915054906101000a900460ff1681565b60065481565b60075481565b6601d606e06b800081565b60085481565b6106a7610d5d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070d90611753565b60405180910390fd5b61071f81610ddb565b50565b6000151560036000866fffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461079b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610792906117bf565b60405180910390fd5b60001515600460006107ab610e9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082c9061182b565b60405180910390fd5b600160046000610843610e9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506108e28484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610ea7565b610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890611897565b60405180910390fd5b600160036000866fffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061096961057d565b9050620f42408110156109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890611903565b60405180910390fd5b60006109bb61057d565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610a03610e9f565b836040518363ffffffff1660e01b8152600401610a21929190611923565b6020604051808303816000875af1158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a649190611978565b5060076000815480929190610a78906119a5565b91905055508160066000828254610a8f919061160b565b9250508190555060006007541115610ac557620989f76064600754610ab4919061163f565b610abe91906116b0565b6008819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015610b355750610b05610e9f565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015610b4a5750673a4965bf58a40000600a54105b15610cd45760006103e8606483610b61919061163f565b610b6b91906116b0565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610bca929190611923565b6020604051808303816000875af1158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190611978565b5080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c5d919061160b565b92505081905550600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cb4906119a5565b919050555080600a6000828254610ccb919061160b565b92505081905550505b610cdc610e9f565b73ffffffffffffffffffffffffffffffffffffffff167f43df200563d66c23d96ffc5da991b910cb5fc0e45018c64c7fe558830feec39287838642604051610d2794939291906119fc565b60405180910390a2505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d65610e9f565b73ffffffffffffffffffffffffffffffffffffffff16610d83610639565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd090611a8d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008030610eb3610e9f565b85604051602001610ec693929190611b2b565b604051602081830303815290604052805190602001209050610ef983610eeb83610f52565b610f8290919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161491505092915050565b600081604051602001610f659190611bea565b604051602081830303815290604052805190602001209050919050565b6000806000610f918585610fa9565b91509150610f9e81610ffa565b819250505092915050565b6000806041835103610fea5760008060006020860151925060408601519150606086015160001a9050610fde87828585611160565b94509450505050610ff3565b60006002915091505b9250929050565b6000600481111561100e5761100d611c10565b5b81600481111561102157611020611c10565b5b031561115d576001600481111561103b5761103a611c10565b5b81600481111561104e5761104d611c10565b5b0361108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590611c8b565b60405180910390fd5b600260048111156110a2576110a1611c10565b5b8160048111156110b5576110b4611c10565b5b036110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec90611cf7565b60405180910390fd5b6003600481111561110957611108611c10565b5b81600481111561111c5761111b611c10565b5b0361115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390611d89565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561119b576000600391509150611239565b6000600187878787604051600081526020016040526040516111c09493929190611dd4565b6020604051602081039080840390855afa1580156111e2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361123057600060019250925050611239565b80600092509250505b94509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006112778261124c565b9050919050565b6112878161126c565b811461129257600080fd5b50565b6000813590506112a48161127e565b92915050565b6000602082840312156112c0576112bf611242565b5b60006112ce84828501611295565b91505092915050565b6112e08161126c565b82525050565b60006020820190506112fb60008301846112d7565b92915050565b6000819050919050565b61131481611301565b811461131f57600080fd5b50565b6000813590506113318161130b565b92915050565b60006020828403121561134d5761134c611242565b5b600061135b84828501611322565b91505092915050565b60008115159050919050565b61137981611364565b82525050565b60006020820190506113946000830184611370565b92915050565b6113a381611301565b82525050565b60006020820190506113be600083018461139a565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6113e9816113c4565b81146113f457600080fd5b50565b600081359050611406816113e0565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126114315761143061140c565b5b8235905067ffffffffffffffff81111561144e5761144d611411565b5b60208301915083600182028301111561146a57611469611416565b5b9250929050565b6000806000806060858703121561148b5761148a611242565b5b6000611499878288016113f7565b945050602085013567ffffffffffffffff8111156114ba576114b9611247565b5b6114c68782880161141b565b935093505060406114d987828801611295565b91505092959194509250565b6000819050919050565b600061150a6115056115008461124c565b6114e5565b61124c565b9050919050565b600061151c826114ef565b9050919050565b600061152e82611511565b9050919050565b61153e81611523565b82525050565b60006020820190506115596000830184611535565b92915050565b600082825260208201905092915050565b7f52454b543a2076616c20697320746865207a65726f2061646472657373000000600082015250565b60006115a6601d8361155f565b91506115b182611570565b602082019050919050565b600060208201905081810360008301526115d581611599565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061161682611301565b915061162183611301565b9250828201905080821115611639576116386115dc565b5b92915050565b600061164a82611301565b915061165583611301565b925082820261166381611301565b9150828204841483151761167a576116796115dc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116bb82611301565b91506116c683611301565b9250826116d6576116d5611681565b5b828204905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061173d60268361155f565b9150611748826116e1565b604082019050919050565b6000602082019050818103600083015261176c81611730565b9050919050565b7f52454b543a206e6f6e636520616c726561647920757365640000000000000000600082015250565b60006117a960188361155f565b91506117b482611773565b602082019050919050565b600060208201905081810360008301526117d88161179c565b9050919050565b7f52454b543a20616c726561647920636c61696d65640000000000000000000000600082015250565b600061181560158361155f565b9150611820826117df565b602082019050919050565b6000602082019050818103600083015261184481611808565b9050919050565b7f52454b543a206f6e6c79206175746820636c61696d7300000000000000000000600082015250565b600061188160168361155f565b915061188c8261184b565b602082019050919050565b600060208201905081810360008301526118b081611874565b9050919050565b7f52454b543a2061697264726f702068617320656e646564000000000000000000600082015250565b60006118ed60178361155f565b91506118f8826118b7565b602082019050919050565b6000602082019050818103600083015261191c816118e0565b9050919050565b600060408201905061193860008301856112d7565b611945602083018461139a565b9392505050565b61195581611364565b811461196057600080fd5b50565b6000815190506119728161194c565b92915050565b60006020828403121561198e5761198d611242565b5b600061199c84828501611963565b91505092915050565b60006119b082611301565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036119e2576119e16115dc565b5b600182019050919050565b6119f6816113c4565b82525050565b6000608082019050611a1160008301876119ed565b611a1e602083018661139a565b611a2b60408301856112d7565b611a38606083018461139a565b95945050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611a7760208361155f565b9150611a8282611a41565b602082019050919050565b60006020820190508181036000830152611aa681611a6a565b9050919050565b60008160601b9050919050565b6000611ac582611aad565b9050919050565b6000611ad782611aba565b9050919050565b611aef611aea8261126c565b611acc565b82525050565b60008160801b9050919050565b6000611b0d82611af5565b9050919050565b611b25611b20826113c4565b611b02565b82525050565b6000611b378286611ade565b601482019150611b478285611ade565b601482019150611b578284611b14565b601082019150819050949350505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000611ba9601c83611b68565b9150611bb482611b73565b601c82019050919050565b6000819050919050565b6000819050919050565b611be4611bdf82611bbf565b611bc9565b82525050565b6000611bf582611b9c565b9150611c018284611bd3565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611c7560188361155f565b9150611c8082611c3f565b602082019050919050565b60006020820190508181036000830152611ca481611c68565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611ce1601f8361155f565b9150611cec82611cab565b602082019050919050565b60006020820190508181036000830152611d1081611cd4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d7360228361155f565b9150611d7e82611d17565b604082019050919050565b60006020820190508181036000830152611da281611d66565b9050919050565b611db281611bbf565b82525050565b600060ff82169050919050565b611dce81611db8565b82525050565b6000608082019050611de96000830187611da9565b611df66020830186611dc5565b611e036040830185611da9565b611e106060830184611da9565b9594505050505056fea2646970667358221220076c2a00c65c0af9f2fc040b7d6995b22b3edd729bdd833e5c413a8b5f3e0a8264736f6c63430008120033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 100.00% | <$0.000001 | 11,293,614,877,892.607 | $1,129.36 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.