More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 7,070 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 18251794 | 44 hrs ago | IN | 0 ETH | 0.00000269 | ||||
Approve | 18231289 | 2 days ago | IN | 0 ETH | 0.00000253 | ||||
Approve | 18231211 | 2 days ago | IN | 0 ETH | 0.00000249 | ||||
Approve | 18166224 | 4 days ago | IN | 0 ETH | 0.00000157 | ||||
Approve | 17917270 | 12 days ago | IN | 0 ETH | 0.00000269 | ||||
Approve | 17787313 | 16 days ago | IN | 0 ETH | 0.00000194 | ||||
Transfer | 17522765 | 24 days ago | IN | 0 ETH | 0.00000253 | ||||
Approve | 17225872 | 32 days ago | IN | 0 ETH | 0.00000156 | ||||
Approve | 17147754 | 34 days ago | IN | 0 ETH | 0.00000151 | ||||
Approve | 17049759 | 37 days ago | IN | 0 ETH | 0.00000221 | ||||
Approve | 16715656 | 45 days ago | IN | 0 ETH | 0.000002 | ||||
Approve | 16375180 | 54 days ago | IN | 0 ETH | 0.00000238 | ||||
Approve | 16296642 | 56 days ago | IN | 0 ETH | 0.00000308 | ||||
Approve | 16243659 | 57 days ago | IN | 0 ETH | 0.00000277 | ||||
Approve | 16057265 | 62 days ago | IN | 0 ETH | 0.00000703 | ||||
Approve | 16014672 | 63 days ago | IN | 0 ETH | 0.00000252 | ||||
Approve | 15972274 | 64 days ago | IN | 0 ETH | 0.0000017 | ||||
Approve | 15921096 | 65 days ago | IN | 0 ETH | 0.00000157 | ||||
Approve | 15881142 | 66 days ago | IN | 0 ETH | 0.00000565 | ||||
Approve | 15814923 | 68 days ago | IN | 0 ETH | 0.0000057 | ||||
Transfer | 15790346 | 68 days ago | IN | 0 ETH | 0.00000503 | ||||
Approve | 15765287 | 69 days ago | IN | 0 ETH | 0.0000016 | ||||
Approve | 15665393 | 71 days ago | IN | 0 ETH | 0.00000845 | ||||
Approve | 15499210 | 76 days ago | IN | 0 ETH | 0.00000497 | ||||
Approve | 15410126 | 78 days ago | IN | 0 ETH | 0.0000035 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18251804 | 44 hrs ago | 0 ETH | ||||
18251804 | 44 hrs ago | 0 ETH | ||||
18251804 | 44 hrs ago | 0 ETH | ||||
18251804 | 44 hrs ago | 0 ETH | ||||
18231290 | 2 days ago | 0 ETH | ||||
18231290 | 2 days ago | 0 ETH | ||||
18231290 | 2 days ago | 0 ETH | ||||
18231290 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231227 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH | ||||
18231185 | 2 days ago | 0 ETH |
Loading...
Loading
Contract Name:
LNS
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at lineascan.build/ on 2024-03-30 */ // Sources flattened with hardhat v2.7.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } interface LineaNameService { function primaryAddress(address account) external view returns (string memory); } pragma solidity ^0.8.0; contract LNS is Ownable, ERC20 { uint256 public _totalSupply=500000000*10**decimals(); bool public Active=true; mapping(address => bool) public claimed; mapping(uint8 => uint256) public categoryAmount; mapping(uint8 => address) public categorySigner; address linea_contract=0x7B9545C9Bd7F850381E7913399668e5Fc364B524; constructor() ERC20("LINEA NS", "LNS") { _mint(owner(), 175000000*10**decimals()); } function lineaPrimaryAddress(address _address) public view returns(string memory){ return LineaNameService(linea_contract).primaryAddress(_address); } function setCategory(uint8 _category,uint256 maxAmount, address _signer) external onlyOwner { categoryAmount[_category]=maxAmount; categorySigner[_category]=_signer; } function setActive(bool _setActive) external onlyOwner { Active = _setActive; } function Claim(uint256 _amount, uint8 category, bytes calldata signature) public payable { require(Active, "Not ready yet"); require(_amount+totalSupply()<_totalSupply,"SOLD OUT!"); require(categoryAmount[category]>=_amount, "ERROR"); require(canClaimAirdrop(signature,category,msg.sender),"Claimed!"); if (msg.value>0) { (bool success, ) = payable(owner()).call{value:msg.value}(''); } claimed[msg.sender]=true; _mint(msg.sender, _amount); } function canClaimAirdrop(bytes calldata signature,uint8 _category, address _caller) public view returns(bool) { if (recoverSigner(signature,_caller)==categorySigner[_category]) { if (claimed[msg.sender]==false) { return true; } else { return false; } } else { return false; } } function recoverSigner(bytes memory signature, address _caller) public pure returns (address) { bytes32 message = keccak256(abi.encodePacked(_caller)); bytes32 hash = ECDSA.toEthSignedMessageHash(message); address signer_ = ECDSA.recover(hash, signature); return signer_; } function burn(uint256 value) external { _burn(msg.sender, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"category","type":"uint8"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"Claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint8","name":"_category","type":"uint8"},{"internalType":"address","name":"_caller","type":"address"}],"name":"canClaimAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"categoryAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"categorySigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"lineaPrimaryAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"_caller","type":"address"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_category","type":"uint8"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"setCategory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052620000126012600a62000380565b6200002290631dcd650062000398565b6006556007805460ff19166001179055600b80546001600160a01b031916737b9545c9bd7f850381e7913399668e5fc364b5241790553480156200006557600080fd5b50604051806040016040528060088152602001674c494e4541204e5360c01b815250604051806040016040528060038152602001624c4e5360e81b815250620000bd620000b76200011b60201b60201c565b6200011f565b6004620000cb838262000456565b506005620000da828262000456565b50505062000115620000f16200016f60201b60201c565b620000ff6012600a62000380565b6200010f90630a6e49c062000398565b6200017e565b62000538565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031690565b6001600160a01b038216620001d95760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620001ed919062000522565b90915550506001600160a01b038216600090815260016020526040812080548392906200021c90849062000522565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620002c2578160001904821115620002a657620002a66200026b565b80851615620002b457918102915b93841c939080029062000286565b509250929050565b600082620002db575060016200037a565b81620002ea575060006200037a565b81600181146200030357600281146200030e576200032e565b60019150506200037a565b60ff8411156200032257620003226200026b565b50506001821b6200037a565b5060208310610133831016604e8410600b841016171562000353575081810a6200037a565b6200035f838362000281565b80600019048211156200037657620003766200026b565b0290505b92915050565b60006200039160ff841683620002ca565b9392505050565b80820281158282048414176200037a576200037a6200026b565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003dd57607f821691505b602082108103620003fe57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026657600081815260208120601f850160051c810160208610156200042d5750805b601f850160051c820191505b818110156200044e5782815560010162000439565b505050505050565b81516001600160401b03811115620004725762000472620003b2565b6200048a81620004838454620003c8565b8462000404565b602080601f831160018114620004c25760008415620004a95750858301515b600019600386901b1c1916600185901b1785556200044e565b600085815260208120601f198616915b82811015620004f357888601518255948401946001909101908401620004d2565b5085821015620005125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200037a576200037a6200026b565b61194880620005486000396000f3fe6080604052600436106101815760003560e01c8063754a8377116100d1578063acec338a1161008a578063c9b0a2a711610064578063c9b0a2a714610490578063cd2fcc2c146104aa578063dd62ed3e146104ca578063f2fde38b1461051057600080fd5b8063acec338a14610420578063adeb0d8814610440578063c884ef831461046057600080fd5b8063754a83771461037a5780637806d6161461038d5780638da5cb5b146103ad57806395d89b41146103cb578063a457c2d7146103e0578063a9059cbb1461040057600080fd5b8063313ce5671161013e57806342966c681161011857806342966c68146102e05780635eb8f05b1461030257806370a082311461032f578063715018a61461036557600080fd5b8063313ce5671461028e57806339509351146102aa5780633eaaf86b146102ca57600080fd5b806306fdde0314610186578063095ea7b3146101b1578063095fe2c3146101e157806318160ddd1461022f5780631cccb3321461024e57806323b872dd1461026e575b600080fd5b34801561019257600080fd5b5061019b610530565b6040516101a89190611435565b60405180910390f35b3480156101bd57600080fd5b506101d16101cc366004611484565b6105c2565b60405190151581526020016101a8565b3480156101ed57600080fd5b506102176101fc3660046114bf565b600a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101a8565b34801561023b57600080fd5b506003545b6040519081526020016101a8565b34801561025a57600080fd5b5061019b6102693660046114e1565b6105d9565b34801561027a57600080fd5b506101d16102893660046114fc565b61064c565b34801561029a57600080fd5b50604051601281526020016101a8565b3480156102b657600080fd5b506101d16102c5366004611484565b6106fb565b3480156102d657600080fd5b5061024060065481565b3480156102ec57600080fd5b506103006102fb366004611538565b610737565b005b34801561030e57600080fd5b5061024061031d3660046114bf565b60096020526000908152604090205481565b34801561033b57600080fd5b5061024061034a3660046114e1565b6001600160a01b031660009081526001602052604090205490565b34801561037157600080fd5b50610300610744565b610300610388366004611593565b61077a565b34801561039957600080fd5b506103006103a83660046115ed565b610919565b3480156103b957600080fd5b506000546001600160a01b0316610217565b3480156103d757600080fd5b5061019b610982565b3480156103ec57600080fd5b506101d16103fb366004611484565b610991565b34801561040c57600080fd5b506101d161041b366004611484565b610a2a565b34801561042c57600080fd5b5061030061043b366004611629565b610a37565b34801561044c57600080fd5b5061021761045b3660046116ba565b610a74565b34801561046c57600080fd5b506101d161047b3660046114e1565b60086020526000908152604090205460ff1681565b34801561049c57600080fd5b506007546101d19060ff1681565b3480156104b657600080fd5b506101d16104c536600461174b565b610b01565b3480156104d657600080fd5b506102406104e53660046117b0565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561051c57600080fd5b5061030061052b3660046114e1565b610b9a565b60606004805461053f906117da565b80601f016020809104026020016040519081016040528092919081815260200182805461056b906117da565b80156105b85780601f1061058d576101008083540402835291602001916105b8565b820191906000526020600020905b81548152906001019060200180831161059b57829003601f168201915b5050505050905090565b60006105cf338484610c32565b5060015b92915050565b600b546040516310d33ce760e31b81526001600160a01b0383811660048301526060921690638699e73890602401600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611814565b6000610659848484610d57565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156106e35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106f08533858403610c32565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916105cf9185906107329086906118a1565b610c32565b6107413382610f25565b50565b6000546001600160a01b0316331461076e5760405162461bcd60e51b81526004016106da906118b4565b610778600061106b565b565b60075460ff166107bc5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c9958591e481e595d609a1b60448201526064016106da565b6006546003546107cc90866118a1565b106108055760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b60448201526064016106da565b60ff831660009081526009602052604090205484111561084f5760405162461bcd60e51b815260206004820152600560248201526422a92927a960d91b60448201526064016106da565b61085b82828533610b01565b6108925760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b60448201526064016106da565b34156108ef57600080546040516001600160a01b039091169034908381818185875af1925050503d80600081146108e5576040519150601f19603f3d011682016040523d82523d6000602084013e6108ea565b606091505b505050505b336000818152600860205260409020805460ff1916600117905561091390856110bb565b50505050565b6000546001600160a01b031633146109435760405162461bcd60e51b81526004016106da906118b4565b60ff92909216600090815260096020908152604080832093909355600a90522080546001600160a01b0319166001600160a01b03909216919091179055565b60606005805461053f906117da565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610a135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106da565b610a203385858403610c32565b5060019392505050565b60006105cf338484610d57565b6000546001600160a01b03163314610a615760405162461bcd60e51b81526004016106da906118b4565b6007805460ff1916911515919091179055565b6040516bffffffffffffffffffffffff19606083901b16602082015260009081906034016040516020818303038152906040528051906020012090506000610ae9827f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b90506000610af7828761119a565b9695505050505050565b60ff82166000908152600a60209081526040808320548151601f88018490048402810184019092528682526001600160a01b031691610b5d91908890889081908401838280828437600092019190915250879250610a74915050565b6001600160a01b031603610b8e573360009081526008602052604081205460ff1615159003610b8e57506001610b92565b5060005b949350505050565b6000546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106da906118b4565b6001600160a01b038116610c295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106da565b6107418161106b565b6001600160a01b038316610c945760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106da565b6001600160a01b038216610cf55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106da565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610dbb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106da565b6001600160a01b038216610e1d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106da565b6001600160a01b03831660009081526001602052604090205481811015610e955760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106da565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610ecc9084906118a1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f1891815260200190565b60405180910390a3610913565b6001600160a01b038216610f855760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106da565b6001600160a01b03821660009081526001602052604090205481811015610ff95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106da565b6001600160a01b03831660009081526001602052604081208383039055600380548492906110289084906118e9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d4a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166111115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106da565b806003600082825461112391906118a1565b90915550506001600160a01b038216600090815260016020526040812080548392906111509084906118a1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008060006111a985856111be565b915091506111b681611203565b509392505050565b60008082516041036111f45760208301516040840151606085015160001a6111e88782858561134d565b945094505050506111fc565b506000905060025b9250929050565b6000816004811115611217576112176118fc565b0361121f5750565b6001816004811115611233576112336118fc565b036112805760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106da565b6002816004811115611294576112946118fc565b036112e15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106da565b60038160048111156112f5576112f56118fc565b036107415760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113845750600090506003611408565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156113d8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661140157600060019250925050611408565b9150600090505b94509492505050565b60005b8381101561142c578181015183820152602001611414565b50506000910152565b6020815260008251806020840152611454816040850160208701611411565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461147f57600080fd5b919050565b6000806040838503121561149757600080fd5b6114a083611468565b946020939093013593505050565b803560ff8116811461147f57600080fd5b6000602082840312156114d157600080fd5b6114da826114ae565b9392505050565b6000602082840312156114f357600080fd5b6114da82611468565b60008060006060848603121561151157600080fd5b61151a84611468565b925061152860208501611468565b9150604084013590509250925092565b60006020828403121561154a57600080fd5b5035919050565b60008083601f84011261156357600080fd5b50813567ffffffffffffffff81111561157b57600080fd5b6020830191508360208285010111156111fc57600080fd5b600080600080606085870312156115a957600080fd5b843593506115b9602086016114ae565b9250604085013567ffffffffffffffff8111156115d557600080fd5b6115e187828801611551565b95989497509550505050565b60008060006060848603121561160257600080fd5b61160b846114ae565b92506020840135915061162060408501611468565b90509250925092565b60006020828403121561163b57600080fd5b813580151581146114da57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561168a5761168a61164b565b604052919050565b600067ffffffffffffffff8211156116ac576116ac61164b565b50601f01601f191660200190565b600080604083850312156116cd57600080fd5b823567ffffffffffffffff8111156116e457600080fd5b8301601f810185136116f557600080fd5b803561170861170382611692565b611661565b81815286602083850101111561171d57600080fd5b8160208401602083013760006020838301015280945050505061174260208401611468565b90509250929050565b6000806000806060858703121561176157600080fd5b843567ffffffffffffffff81111561177857600080fd5b61178487828801611551565b90955093506117979050602086016114ae565b91506117a560408601611468565b905092959194509250565b600080604083850312156117c357600080fd5b6117cc83611468565b915061174260208401611468565b600181811c908216806117ee57607f821691505b60208210810361180e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561182657600080fd5b815167ffffffffffffffff81111561183d57600080fd5b8201601f8101841361184e57600080fd5b805161185c61170382611692565b81815285602083850101111561187157600080fd5b611882826020830160208601611411565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156105d3576105d361188b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b818103818111156105d3576105d361188b565b634e487b7160e01b600052602160045260246000fdfea26469706673582212205aa28ca09bc20e2de274f405ad150b38fcfbc30b6d290173a64a71ba4ae13f8364736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101815760003560e01c8063754a8377116100d1578063acec338a1161008a578063c9b0a2a711610064578063c9b0a2a714610490578063cd2fcc2c146104aa578063dd62ed3e146104ca578063f2fde38b1461051057600080fd5b8063acec338a14610420578063adeb0d8814610440578063c884ef831461046057600080fd5b8063754a83771461037a5780637806d6161461038d5780638da5cb5b146103ad57806395d89b41146103cb578063a457c2d7146103e0578063a9059cbb1461040057600080fd5b8063313ce5671161013e57806342966c681161011857806342966c68146102e05780635eb8f05b1461030257806370a082311461032f578063715018a61461036557600080fd5b8063313ce5671461028e57806339509351146102aa5780633eaaf86b146102ca57600080fd5b806306fdde0314610186578063095ea7b3146101b1578063095fe2c3146101e157806318160ddd1461022f5780631cccb3321461024e57806323b872dd1461026e575b600080fd5b34801561019257600080fd5b5061019b610530565b6040516101a89190611435565b60405180910390f35b3480156101bd57600080fd5b506101d16101cc366004611484565b6105c2565b60405190151581526020016101a8565b3480156101ed57600080fd5b506102176101fc3660046114bf565b600a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101a8565b34801561023b57600080fd5b506003545b6040519081526020016101a8565b34801561025a57600080fd5b5061019b6102693660046114e1565b6105d9565b34801561027a57600080fd5b506101d16102893660046114fc565b61064c565b34801561029a57600080fd5b50604051601281526020016101a8565b3480156102b657600080fd5b506101d16102c5366004611484565b6106fb565b3480156102d657600080fd5b5061024060065481565b3480156102ec57600080fd5b506103006102fb366004611538565b610737565b005b34801561030e57600080fd5b5061024061031d3660046114bf565b60096020526000908152604090205481565b34801561033b57600080fd5b5061024061034a3660046114e1565b6001600160a01b031660009081526001602052604090205490565b34801561037157600080fd5b50610300610744565b610300610388366004611593565b61077a565b34801561039957600080fd5b506103006103a83660046115ed565b610919565b3480156103b957600080fd5b506000546001600160a01b0316610217565b3480156103d757600080fd5b5061019b610982565b3480156103ec57600080fd5b506101d16103fb366004611484565b610991565b34801561040c57600080fd5b506101d161041b366004611484565b610a2a565b34801561042c57600080fd5b5061030061043b366004611629565b610a37565b34801561044c57600080fd5b5061021761045b3660046116ba565b610a74565b34801561046c57600080fd5b506101d161047b3660046114e1565b60086020526000908152604090205460ff1681565b34801561049c57600080fd5b506007546101d19060ff1681565b3480156104b657600080fd5b506101d16104c536600461174b565b610b01565b3480156104d657600080fd5b506102406104e53660046117b0565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561051c57600080fd5b5061030061052b3660046114e1565b610b9a565b60606004805461053f906117da565b80601f016020809104026020016040519081016040528092919081815260200182805461056b906117da565b80156105b85780601f1061058d576101008083540402835291602001916105b8565b820191906000526020600020905b81548152906001019060200180831161059b57829003601f168201915b5050505050905090565b60006105cf338484610c32565b5060015b92915050565b600b546040516310d33ce760e31b81526001600160a01b0383811660048301526060921690638699e73890602401600060405180830381865afa158015610624573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611814565b6000610659848484610d57565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156106e35760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106f08533858403610c32565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916105cf9185906107329086906118a1565b610c32565b6107413382610f25565b50565b6000546001600160a01b0316331461076e5760405162461bcd60e51b81526004016106da906118b4565b610778600061106b565b565b60075460ff166107bc5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c9958591e481e595d609a1b60448201526064016106da565b6006546003546107cc90866118a1565b106108055760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b60448201526064016106da565b60ff831660009081526009602052604090205484111561084f5760405162461bcd60e51b815260206004820152600560248201526422a92927a960d91b60448201526064016106da565b61085b82828533610b01565b6108925760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b60448201526064016106da565b34156108ef57600080546040516001600160a01b039091169034908381818185875af1925050503d80600081146108e5576040519150601f19603f3d011682016040523d82523d6000602084013e6108ea565b606091505b505050505b336000818152600860205260409020805460ff1916600117905561091390856110bb565b50505050565b6000546001600160a01b031633146109435760405162461bcd60e51b81526004016106da906118b4565b60ff92909216600090815260096020908152604080832093909355600a90522080546001600160a01b0319166001600160a01b03909216919091179055565b60606005805461053f906117da565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610a135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106da565b610a203385858403610c32565b5060019392505050565b60006105cf338484610d57565b6000546001600160a01b03163314610a615760405162461bcd60e51b81526004016106da906118b4565b6007805460ff1916911515919091179055565b6040516bffffffffffffffffffffffff19606083901b16602082015260009081906034016040516020818303038152906040528051906020012090506000610ae9827f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b90506000610af7828761119a565b9695505050505050565b60ff82166000908152600a60209081526040808320548151601f88018490048402810184019092528682526001600160a01b031691610b5d91908890889081908401838280828437600092019190915250879250610a74915050565b6001600160a01b031603610b8e573360009081526008602052604081205460ff1615159003610b8e57506001610b92565b5060005b949350505050565b6000546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106da906118b4565b6001600160a01b038116610c295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106da565b6107418161106b565b6001600160a01b038316610c945760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106da565b6001600160a01b038216610cf55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106da565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610dbb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106da565b6001600160a01b038216610e1d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106da565b6001600160a01b03831660009081526001602052604090205481811015610e955760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106da565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610ecc9084906118a1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f1891815260200190565b60405180910390a3610913565b6001600160a01b038216610f855760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106da565b6001600160a01b03821660009081526001602052604090205481811015610ff95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106da565b6001600160a01b03831660009081526001602052604081208383039055600380548492906110289084906118e9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d4a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166111115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106da565b806003600082825461112391906118a1565b90915550506001600160a01b038216600090815260016020526040812080548392906111509084906118a1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008060006111a985856111be565b915091506111b681611203565b509392505050565b60008082516041036111f45760208301516040840151606085015160001a6111e88782858561134d565b945094505050506111fc565b506000905060025b9250929050565b6000816004811115611217576112176118fc565b0361121f5750565b6001816004811115611233576112336118fc565b036112805760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106da565b6002816004811115611294576112946118fc565b036112e15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106da565b60038160048111156112f5576112f56118fc565b036107415760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113845750600090506003611408565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156113d8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661140157600060019250925050611408565b9150600090505b94509492505050565b60005b8381101561142c578181015183820152602001611414565b50506000910152565b6020815260008251806020840152611454816040850160208701611411565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461147f57600080fd5b919050565b6000806040838503121561149757600080fd5b6114a083611468565b946020939093013593505050565b803560ff8116811461147f57600080fd5b6000602082840312156114d157600080fd5b6114da826114ae565b9392505050565b6000602082840312156114f357600080fd5b6114da82611468565b60008060006060848603121561151157600080fd5b61151a84611468565b925061152860208501611468565b9150604084013590509250925092565b60006020828403121561154a57600080fd5b5035919050565b60008083601f84011261156357600080fd5b50813567ffffffffffffffff81111561157b57600080fd5b6020830191508360208285010111156111fc57600080fd5b600080600080606085870312156115a957600080fd5b843593506115b9602086016114ae565b9250604085013567ffffffffffffffff8111156115d557600080fd5b6115e187828801611551565b95989497509550505050565b60008060006060848603121561160257600080fd5b61160b846114ae565b92506020840135915061162060408501611468565b90509250925092565b60006020828403121561163b57600080fd5b813580151581146114da57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561168a5761168a61164b565b604052919050565b600067ffffffffffffffff8211156116ac576116ac61164b565b50601f01601f191660200190565b600080604083850312156116cd57600080fd5b823567ffffffffffffffff8111156116e457600080fd5b8301601f810185136116f557600080fd5b803561170861170382611692565b611661565b81815286602083850101111561171d57600080fd5b8160208401602083013760006020838301015280945050505061174260208401611468565b90509250929050565b6000806000806060858703121561176157600080fd5b843567ffffffffffffffff81111561177857600080fd5b61178487828801611551565b90955093506117979050602086016114ae565b91506117a560408601611468565b905092959194509250565b600080604083850312156117c357600080fd5b6117cc83611468565b915061174260208401611468565b600181811c908216806117ee57607f821691505b60208210810361180e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561182657600080fd5b815167ffffffffffffffff81111561183d57600080fd5b8201601f8101841361184e57600080fd5b805161185c61170382611692565b81815285602083850101111561187157600080fd5b611882826020830160208601611411565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156105d3576105d361188b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b818103818111156105d3576105d361188b565b634e487b7160e01b600052602160045260246000fdfea26469706673582212205aa28ca09bc20e2de274f405ad150b38fcfbc30b6d290173a64a71ba4ae13f8364736f6c63430008120033
Deployed Bytecode Sourcemap
45547:2341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11479:169;;;;;;;;;;-1:-1:-1;11479:169:0;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;11479:169:0;1107:187:1;45774:47:0;;;;;;;;;;-1:-1:-1;45774:47:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;45774:47:0;;;;;;-1:-1:-1;;;;;1811:32:1;;;1793:51;;1781:2;1766:18;45774:47:0;1647:203:1;10432:108:0;;;;;;;;;;-1:-1:-1;10520:12:0;;10432:108;;;2001:25:1;;;1989:2;1974:18;10432:108:0;1855:177:1;46019:164:0;;;;;;;;;;-1:-1:-1;46019:164:0;;;;;:::i;:::-;;:::i;12130:492::-;;;;;;;;;;-1:-1:-1;12130:492:0;;;;;:::i;:::-;;:::i;10274:93::-;;;;;;;;;;-1:-1:-1;10274:93:0;;10357:2;2703:36:1;;2691:2;2676:18;10274:93:0;2561:184:1;13031:215:0;;;;;;;;;;-1:-1:-1;13031:215:0;;;;;:::i;:::-;;:::i;45585:52::-;;;;;;;;;;;;;;;;47804:81;;;;;;;;;;-1:-1:-1;47804:81:0;;;;;:::i;:::-;;:::i;:::-;;45720:47;;;;;;;;;;-1:-1:-1;45720:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;10603:127;;;;;;;;;;-1:-1:-1;10603:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10704:18:0;10677:7;10704:18;;;:9;:18;;;;;;;10603:127;2713:103;;;;;;;;;;;;;:::i;46505:563::-;;;;;;:::i;:::-;;:::i;46193:190::-;;;;;;;;;;-1:-1:-1;46193:190:0;;;;;:::i;:::-;;:::i;2062:87::-;;;;;;;;;;-1:-1:-1;2108:7:0;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;9531:104;;;;;;;;;;;;;:::i;13749:413::-;;;;;;;;;;-1:-1:-1;13749:413:0;;;;;:::i;:::-;;:::i;10943:175::-;;;;;;;;;;-1:-1:-1;10943:175:0;;;;;:::i;:::-;;:::i;46398:93::-;;;;;;;;;;-1:-1:-1;46398:93:0;;;;;:::i;:::-;;:::i;47480:314::-;;;;;;;;;;-1:-1:-1;47480:314:0;;;;;:::i;:::-;;:::i;45674:39::-;;;;;;;;;;-1:-1:-1;45674:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45644:23;;;;;;;;;;-1:-1:-1;45644:23:0;;;;;;;;47082:390;;;;;;;;;;-1:-1:-1;47082:390:0;;;;;:::i;:::-;;:::i;11181:151::-;;;;;;;;;;-1:-1:-1;11181:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11297:18:0;;;11270:7;11297:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11181:151;2971:201;;;;;;;;;;-1:-1:-1;2971:201:0;;;;;:::i;:::-;;:::i;9312:100::-;9366:13;9399:5;9392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9312:100;:::o;11479:169::-;11562:4;11579:39;860:10;11602:7;11611:6;11579:8;:39::i;:::-;-1:-1:-1;11636:4:0;11479:169;;;;;:::o;46019:164::-;46135:14;;46118:57;;-1:-1:-1;;;46118:57:0;;-1:-1:-1;;;;;1811:32:1;;;46118:57:0;;;1793:51:1;46086:13:0;;46135:14;;46118:47;;1766:18:1;;46118:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46118:57:0;;;;;;;;;;;;:::i;12130:492::-;12270:4;12287:36;12297:6;12305:9;12316:6;12287:9;:36::i;:::-;-1:-1:-1;;;;;12363:19:0;;12336:24;12363:19;;;:11;:19;;;;;;;;860:10;12363:33;;;;;;;;12415:26;;;;12407:79;;;;-1:-1:-1;;;12407:79:0;;7872:2:1;12407:79:0;;;7854:21:1;7911:2;7891:18;;;7884:30;7950:34;7930:18;;;7923:62;-1:-1:-1;;;8001:18:1;;;7994:38;8049:19;;12407:79:0;;;;;;;;;12522:57;12531:6;860:10;12572:6;12553:16;:25;12522:8;:57::i;:::-;-1:-1:-1;12610:4:0;;12130:492;-1:-1:-1;;;;12130:492:0:o;13031:215::-;860:10;13119:4;13168:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13168:34:0;;;;;;;;;;13119:4;;13136:80;;13159:7;;13168:47;;13205:10;;13168:47;:::i;:::-;13136:8;:80::i;47804:81::-;47853:24;47859:10;47871:5;47853;:24::i;:::-;47804:81;:::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;46505:563::-;46639:6;;;;46631:32;;;;-1:-1:-1;;;46631:32:0;;8904:2:1;46631:32:0;;;8886:21:1;8943:2;8923:18;;;8916:30;-1:-1:-1;;;8962:18:1;;;8955:43;9015:18;;46631:32:0;8702:337:1;46631:32:0;46704:12;;10520;;46682:21;;:7;:21;:::i;:::-;:34;46674:55;;;;-1:-1:-1;;;46674:55:0;;9246:2:1;46674:55:0;;;9228:21:1;9285:1;9265:18;;;9258:29;-1:-1:-1;;;9303:18:1;;;9296:39;9352:18;;46674:55:0;9044:332:1;46674:55:0;46749:24;;;;;;;:14;:24;;;;;;:33;-1:-1:-1;46749:33:0;46741:51;;;;-1:-1:-1;;;46741:51:0;;9583:2:1;46741:51:0;;;9565:21:1;9622:1;9602:18;;;9595:29;-1:-1:-1;;;9640:18:1;;;9633:35;9685:18;;46741:51:0;9381:328:1;46741:51:0;46812:46;46828:9;;46838:8;46847:10;46812:15;:46::i;:::-;46804:66;;;;-1:-1:-1;;;46804:66:0;;9916:2:1;46804:66:0;;;9898:21:1;9955:1;9935:18;;;9928:29;-1:-1:-1;;;9973:18:1;;;9966:38;10021:18;;46804:66:0;9714:331:1;46804:66:0;46887:9;:11;46883:106;;46912:12;2135:6;;46930:42;;-1:-1:-1;;;;;2135:6:0;;;;46958:9;;46912:12;46930:42;46912:12;46930:42;46958:9;2135:6;46930:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;46883:106:0;47007:10;46999:19;;;;:7;:19;;;;;:24;;-1:-1:-1;;46999:24:0;47019:4;46999:24;;;47034:26;;47052:7;47034:5;:26::i;:::-;46505:563;;;;:::o;46193:190::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;46296:25:::1;::::0;;;::::1;;::::0;;;:14:::1;:25;::::0;;;;;;;:35;;;;46342:14:::1;:25:::0;;;:33;;-1:-1:-1;;;;;;46342:33:0::1;-1:-1:-1::0;;;;;46342:33:0;;::::1;::::0;;;::::1;::::0;;46193:190::o;9531:104::-;9587:13;9620:7;9613:14;;;;;:::i;13749:413::-;860:10;13842:4;13886:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13886:34:0;;;;;;;;;;13939:35;;;;13931:85;;;;-1:-1:-1;;;13931:85:0;;10462:2:1;13931:85:0;;;10444:21:1;10501:2;10481:18;;;10474:30;10540:34;10520:18;;;10513:62;-1:-1:-1;;;10591:18:1;;;10584:35;10636:19;;13931:85:0;10260:401:1;13931:85:0;14052:67;860:10;14075:7;14103:15;14084:16;:34;14052:8;:67::i;:::-;-1:-1:-1;14150:4:0;;13749:413;-1:-1:-1;;;13749:413:0:o;10943:175::-;11029:4;11046:42;860:10;11070:9;11081:6;11046:9;:42::i;46398:93::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;46464:6:::1;:19:::0;;-1:-1:-1;;46464:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46398:93::o;47480:314::-;47613:25;;-1:-1:-1;;10815:2:1;10811:15;;;10807:53;47613:25:0;;;10795:66:1;47565:7:0;;;;10877:12:1;;47613:25:0;;;;;;;;;;;;47603:36;;;;;;47585:54;;47650:12;47665:37;47694:7;26691:34;26486:15;26678:48;;;26747:4;26740:18;;;;26799:4;26783:21;;;26417:405;47665:37;47650:52;;47713:15;47731:30;47745:4;47751:9;47731:13;:30::i;:::-;47713:48;47480:314;-1:-1:-1;;;;;;47480:314:0:o;47082:390::-;47241:25;;;47186:4;47241:25;;;:14;:25;;;;;;;;;47207:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47241:25:0;;47207:32;;;47221:9;;;;;;47207:32;;47221:9;;;;47207:32;;;;;;;;;-1:-1:-1;47231:7:0;;-1:-1:-1;47207:13:0;;-1:-1:-1;;47207:32:0:i;:::-;-1:-1:-1;;;;;47207:59:0;;47203:262;;47295:10;47287:19;;;;:7;:19;;;;;;;;:26;;;;47283:133;;-1:-1:-1;47342:4:0;47335:11;;47283:133;-1:-1:-1;47394:5:0;47203:262;47082:390;;;;;;:::o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;11102:2:1;3052:73:0::1;::::0;::::1;11084:21:1::0;11141:2;11121:18;;;11114:30;11180:34;11160:18;;;11153:62;-1:-1:-1;;;11231:18:1;;;11224:36;11277:19;;3052:73:0::1;10900:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;17433:380::-:0;-1:-1:-1;;;;;17569:19:0;;17561:68;;;;-1:-1:-1;;;17561:68:0;;11509:2:1;17561:68:0;;;11491:21:1;11548:2;11528:18;;;11521:30;11587:34;11567:18;;;11560:62;-1:-1:-1;;;11638:18:1;;;11631:34;11682:19;;17561:68:0;11307:400:1;17561:68:0;-1:-1:-1;;;;;17648:21:0;;17640:68;;;;-1:-1:-1;;;17640:68:0;;11914:2:1;17640:68:0;;;11896:21:1;11953:2;11933:18;;;11926:30;11992:34;11972:18;;;11965:62;-1:-1:-1;;;12043:18:1;;;12036:32;12085:19;;17640:68:0;11712:398:1;17640:68:0;-1:-1:-1;;;;;17721:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17773:32;;2001:25:1;;;17773:32:0;;1974:18:1;17773:32:0;;;;;;;;17433:380;;;:::o;14652:733::-;-1:-1:-1;;;;;14792:20:0;;14784:70;;;;-1:-1:-1;;;14784:70:0;;12317:2:1;14784:70:0;;;12299:21:1;12356:2;12336:18;;;12329:30;12395:34;12375:18;;;12368:62;-1:-1:-1;;;12446:18:1;;;12439:35;12491:19;;14784:70:0;12115:401:1;14784:70:0;-1:-1:-1;;;;;14873:23:0;;14865:71;;;;-1:-1:-1;;;14865:71:0;;12723:2:1;14865:71:0;;;12705:21:1;12762:2;12742:18;;;12735:30;12801:34;12781:18;;;12774:62;-1:-1:-1;;;12852:18:1;;;12845:33;12895:19;;14865:71:0;12521:399:1;14865:71:0;-1:-1:-1;;;;;15033:17:0;;15009:21;15033:17;;;:9;:17;;;;;;15069:23;;;;15061:74;;;;-1:-1:-1;;;15061:74:0;;13127:2:1;15061:74:0;;;13109:21:1;13166:2;13146:18;;;13139:30;13205:34;13185:18;;;13178:62;-1:-1:-1;;;13256:18:1;;;13249:36;13302:19;;15061:74:0;12925:402:1;15061:74:0;-1:-1:-1;;;;;15171:17:0;;;;;;;:9;:17;;;;;;15191:22;;;15171:42;;15235:20;;;;;;;;:30;;15207:6;;15171:17;15235:30;;15207:6;;15235:30;:::i;:::-;;;;;;;;15300:9;-1:-1:-1;;;;;15283:35:0;15292:6;-1:-1:-1;;;;;15283:35:0;;15311:6;15283:35;;;;2001:25:1;;1989:2;1974:18;;1855:177;15283:35:0;;;;;;;;15331:46;16404:591;;-1:-1:-1;;;;;16488:21:0;;16480:67;;;;-1:-1:-1;;;16480:67:0;;13534:2:1;16480:67:0;;;13516:21:1;13573:2;13553:18;;;13546:30;13612:34;13592:18;;;13585:62;-1:-1:-1;;;13663:18:1;;;13656:31;13704:19;;16480:67:0;13332:397:1;16480:67:0;-1:-1:-1;;;;;16647:18:0;;16622:22;16647:18;;;:9;:18;;;;;;16684:24;;;;16676:71;;;;-1:-1:-1;;;16676:71:0;;13936:2:1;16676:71:0;;;13918:21:1;13975:2;13955:18;;;13948:30;14014:34;13994:18;;;13987:62;-1:-1:-1;;;14065:18:1;;;14058:32;14107:19;;16676:71:0;13734:398:1;16676:71:0;-1:-1:-1;;;;;16783:18:0;;;;;;:9;:18;;;;;16804:23;;;16783:44;;16849:12;:22;;16821:6;;16783:18;16849:22;;16821:6;;16849:22;:::i;:::-;;;;-1:-1:-1;;16889:37:0;;2001:25:1;;;16915:1:0;;-1:-1:-1;;;;;16889:37:0;;;;;1989:2:1;1974:18;16889:37:0;1855:177:1;3332:191:0;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;15672:399::-;-1:-1:-1;;;;;15756:21:0;;15748:65;;;;-1:-1:-1;;;15748:65:0;;14472:2:1;15748:65:0;;;14454:21:1;14511:2;14491:18;;;14484:30;14550:33;14530:18;;;14523:61;14601:18;;15748:65:0;14270:355:1;15748:65:0;15904:6;15888:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15921:18:0;;;;;;:9;:18;;;;;:28;;15943:6;;15921:18;:28;;15943:6;;15921:28;:::i;:::-;;;;-1:-1:-1;;15965:37:0;;2001:25:1;;;-1:-1:-1;;;;;15965:37:0;;;15982:1;;15965:37;;1989:2:1;1974:18;15965:37:0;;;;;;;15672:399;;:::o;22881:231::-;22959:7;22980:17;22999:18;23021:27;23032:4;23038:9;23021:10;:27::i;:::-;22979:69;;;;23059:18;23071:5;23059:11;:18::i;:::-;-1:-1:-1;23095:9:0;22881:231;-1:-1:-1;;;22881:231:0:o;21332:747::-;21413:7;21422:12;21451:9;:16;21471:2;21451:22;21447:625;;21795:4;21780:20;;21774:27;21845:4;21830:20;;21824:27;21903:4;21888:20;;21882:27;21490:9;21874:36;21946:25;21957:4;21874:36;21774:27;21824;21946:10;:25::i;:::-;21939:32;;;;;;;;;21447:625;-1:-1:-1;22020:1:0;;-1:-1:-1;22024:35:0;21447:625;21332:747;;;;;:::o;19725:521::-;19803:20;19794:5;:29;;;;;;;;:::i;:::-;;19790:449;;19725:521;:::o;19790:449::-;19901:29;19892:5;:38;;;;;;;;:::i;:::-;;19888:351;;19947:34;;-1:-1:-1;;;19947:34:0;;14964:2:1;19947:34:0;;;14946:21:1;15003:2;14983:18;;;14976:30;15042:26;15022:18;;;15015:54;15086:18;;19947:34:0;14762:348:1;19888:351:0;20012:35;20003:5;:44;;;;;;;;:::i;:::-;;19999:240;;20064:41;;-1:-1:-1;;;20064:41:0;;15317:2:1;20064:41:0;;;15299:21:1;15356:2;15336:18;;;15329:30;15395:33;15375:18;;;15368:61;15446:18;;20064:41:0;15115:355:1;19999:240:0;20136:30;20127:5;:39;;;;;;;;:::i;:::-;;20123:116;;20183:44;;-1:-1:-1;;;20183:44:0;;15677:2:1;20183:44:0;;;15659:21:1;15716:2;15696:18;;;15689:30;15755:34;15735:18;;;15728:62;-1:-1:-1;;;15806:18:1;;;15799:32;15848:19;;20183:44:0;15475:398:1;24265:1477:0;24353:7;;25287:66;25274:79;;25270:163;;;-1:-1:-1;25386:1:0;;-1:-1:-1;25390:30:0;25370:51;;25270:163;25547:24;;;25530:14;25547:24;;;;;;;;;16105:25:1;;;16178:4;16166:17;;16146:18;;;16139:45;;;;16200:18;;;16193:34;;;16243:18;;;16236:34;;;25547:24:0;;16077:19:1;;25547:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25547:24:0;;-1:-1:-1;;25547:24:0;;;-1:-1:-1;;;;;;;25586:20:0;;25582:103;;25639:1;25643:29;25623:50;;;;;;;25582:103;25705:6;-1:-1:-1;25713:20:0;;-1:-1:-1;24265:1477:0;;;;;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:173::-;738:20;;-1:-1:-1;;;;;787:31:1;;777:42;;767:70;;833:1;830;823:12;767:70;670:173;;;:::o;848:254::-;916:6;924;977:2;965:9;956:7;952:23;948:32;945:52;;;993:1;990;983:12;945:52;1016:29;1035:9;1016:29;:::i;:::-;1006:39;1092:2;1077:18;;;;1064:32;;-1:-1:-1;;;848:254:1:o;1299:156::-;1365:20;;1425:4;1414:16;;1404:27;;1394:55;;1445:1;1442;1435:12;1460:182;1517:6;1570:2;1558:9;1549:7;1545:23;1541:32;1538:52;;;1586:1;1583;1576:12;1538:52;1609:27;1626:9;1609:27;:::i;:::-;1599:37;1460:182;-1:-1:-1;;;1460:182:1:o;2037:186::-;2096:6;2149:2;2137:9;2128:7;2124:23;2120:32;2117:52;;;2165:1;2162;2155:12;2117:52;2188:29;2207:9;2188:29;:::i;2228:328::-;2305:6;2313;2321;2374:2;2362:9;2353:7;2349:23;2345:32;2342:52;;;2390:1;2387;2380:12;2342:52;2413:29;2432:9;2413:29;:::i;:::-;2403:39;;2461:38;2495:2;2484:9;2480:18;2461:38;:::i;:::-;2451:48;;2546:2;2535:9;2531:18;2518:32;2508:42;;2228:328;;;;;:::o;2750:180::-;2809:6;2862:2;2850:9;2841:7;2837:23;2833:32;2830:52;;;2878:1;2875;2868:12;2830:52;-1:-1:-1;2901:23:1;;2750:180;-1:-1:-1;2750:180:1:o;2935:347::-;2986:8;2996:6;3050:3;3043:4;3035:6;3031:17;3027:27;3017:55;;3068:1;3065;3058:12;3017:55;-1:-1:-1;3091:20:1;;3134:18;3123:30;;3120:50;;;3166:1;3163;3156:12;3120:50;3203:4;3195:6;3191:17;3179:29;;3255:3;3248:4;3239:6;3231;3227:19;3223:30;3220:39;3217:59;;;3272:1;3269;3262:12;3287:547;3373:6;3381;3389;3397;3450:2;3438:9;3429:7;3425:23;3421:32;3418:52;;;3466:1;3463;3456:12;3418:52;3502:9;3489:23;3479:33;;3531:36;3563:2;3552:9;3548:18;3531:36;:::i;:::-;3521:46;;3618:2;3607:9;3603:18;3590:32;3645:18;3637:6;3634:30;3631:50;;;3677:1;3674;3667:12;3631:50;3716:58;3766:7;3757:6;3746:9;3742:22;3716:58;:::i;:::-;3287:547;;;;-1:-1:-1;3793:8:1;-1:-1:-1;;;;3287:547:1:o;3839:324::-;3914:6;3922;3930;3983:2;3971:9;3962:7;3958:23;3954:32;3951:52;;;3999:1;3996;3989:12;3951:52;4022:27;4039:9;4022:27;:::i;:::-;4012:37;;4096:2;4085:9;4081:18;4068:32;4058:42;;4119:38;4153:2;4142:9;4138:18;4119:38;:::i;:::-;4109:48;;3839:324;;;;;:::o;4168:273::-;4224:6;4277:2;4265:9;4256:7;4252:23;4248:32;4245:52;;;4293:1;4290;4283:12;4245:52;4332:9;4319:23;4385:5;4378:13;4371:21;4364:5;4361:32;4351:60;;4407:1;4404;4397:12;4446:127;4507:10;4502:3;4498:20;4495:1;4488:31;4538:4;4535:1;4528:15;4562:4;4559:1;4552:15;4578:275;4649:2;4643:9;4714:2;4695:13;;-1:-1:-1;;4691:27:1;4679:40;;4749:18;4734:34;;4770:22;;;4731:62;4728:88;;;4796:18;;:::i;:::-;4832:2;4825:22;4578:275;;-1:-1:-1;4578:275:1:o;4858:186::-;4906:4;4939:18;4931:6;4928:30;4925:56;;;4961:18;;:::i;:::-;-1:-1:-1;5027:2:1;5006:15;-1:-1:-1;;5002:29:1;5033:4;4998:40;;4858:186::o;5049:755::-;5126:6;5134;5187:2;5175:9;5166:7;5162:23;5158:32;5155:52;;;5203:1;5200;5193:12;5155:52;5243:9;5230:23;5276:18;5268:6;5265:30;5262:50;;;5308:1;5305;5298:12;5262:50;5331:22;;5384:4;5376:13;;5372:27;-1:-1:-1;5362:55:1;;5413:1;5410;5403:12;5362:55;5449:2;5436:16;5474:48;5490:31;5518:2;5490:31;:::i;:::-;5474:48;:::i;:::-;5545:2;5538:5;5531:17;5587:7;5580:4;5575:2;5571;5567:11;5563:22;5560:35;5557:55;;;5608:1;5605;5598:12;5557:55;5667:2;5660:4;5656:2;5652:13;5645:4;5638:5;5634:16;5621:49;5713:1;5706:4;5701:2;5694:5;5690:14;5686:25;5679:36;5734:5;5724:15;;;;;5758:40;5792:4;5781:9;5777:20;5758:40;:::i;:::-;5748:50;;5049:755;;;;;:::o;5809:553::-;5895:6;5903;5911;5919;5972:2;5960:9;5951:7;5947:23;5943:32;5940:52;;;5988:1;5985;5978:12;5940:52;6028:9;6015:23;6061:18;6053:6;6050:30;6047:50;;;6093:1;6090;6083:12;6047:50;6132:58;6182:7;6173:6;6162:9;6158:22;6132:58;:::i;:::-;6209:8;;-1:-1:-1;6106:84:1;-1:-1:-1;6263:36:1;;-1:-1:-1;6295:2:1;6280:18;;6263:36;:::i;:::-;6253:46;;6318:38;6352:2;6341:9;6337:18;6318:38;:::i;:::-;6308:48;;5809:553;;;;;;;:::o;6367:260::-;6435:6;6443;6496:2;6484:9;6475:7;6471:23;6467:32;6464:52;;;6512:1;6509;6502:12;6464:52;6535:29;6554:9;6535:29;:::i;:::-;6525:39;;6583:38;6617:2;6606:9;6602:18;6583:38;:::i;6632:380::-;6711:1;6707:12;;;;6754;;;6775:61;;6829:4;6821:6;6817:17;6807:27;;6775:61;6882:2;6874:6;6871:14;6851:18;6848:38;6845:161;;6928:10;6923:3;6919:20;6916:1;6909:31;6963:4;6960:1;6953:15;6991:4;6988:1;6981:15;6845:161;;6632:380;;;:::o;7017:648::-;7097:6;7150:2;7138:9;7129:7;7125:23;7121:32;7118:52;;;7166:1;7163;7156:12;7118:52;7199:9;7193:16;7232:18;7224:6;7221:30;7218:50;;;7264:1;7261;7254:12;7218:50;7287:22;;7340:4;7332:13;;7328:27;-1:-1:-1;7318:55:1;;7369:1;7366;7359:12;7318:55;7398:2;7392:9;7423:48;7439:31;7467:2;7439:31;:::i;7423:48::-;7494:2;7487:5;7480:17;7534:7;7529:2;7524;7520;7516:11;7512:20;7509:33;7506:53;;;7555:1;7552;7545:12;7506:53;7568:67;7632:2;7627;7620:5;7616:14;7611:2;7607;7603:11;7568:67;:::i;:::-;7654:5;7017:648;-1:-1:-1;;;;;7017:648:1:o;8079:127::-;8140:10;8135:3;8131:20;8128:1;8121:31;8171:4;8168:1;8161:15;8195:4;8192:1;8185:15;8211:125;8276:9;;;8297:10;;;8294:36;;;8310:18;;:::i;8341:356::-;8543:2;8525:21;;;8562:18;;;8555:30;8621:34;8616:2;8601:18;;8594:62;8688:2;8673:18;;8341:356::o;14137:128::-;14204:9;;;14225:11;;;14222:37;;;14239:18;;:::i;14630:127::-;14691:10;14686:3;14682:20;14679:1;14672:31;14722:4;14719:1;14712:15;14746:4;14743:1;14736:15
Swarm Source
ipfs://5aa28ca09bc20e2de274f405ad150b38fcfbc30b6d290173a64a71ba4ae13f83
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BASE | 100.00% | $1,792.52 | 0.0009 | $1.61 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.