Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 4,078 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 37917712 | 5 days ago | IN | 0 ETH | 0.00000006 | ||||
| Transfer | 37915741 | 5 days ago | IN | 0 ETH | 0.0000001 | ||||
| Approve | 28500680 | 223 days ago | IN | 0 ETH | 0.00000002 | ||||
| Approve | 24154893 | 324 days ago | IN | 0 ETH | 0.0000011 | ||||
| Approve | 21408489 | 387 days ago | IN | 0 ETH | 0.00000174 | ||||
| Approve | 21384970 | 388 days ago | IN | 0 ETH | 0.00000027 | ||||
| Approve | 20620721 | 405 days ago | IN | 0 ETH | 0.00000014 | ||||
| Approve | 20610851 | 406 days ago | IN | 0 ETH | 0.00000016 | ||||
| Approve | 20550123 | 407 days ago | IN | 0 ETH | 0.0000009 | ||||
| Approve | 20550112 | 407 days ago | IN | 0 ETH | 0.00000089 | ||||
| Approve | 20550077 | 407 days ago | IN | 0 ETH | 0.0000009 | ||||
| Approve | 20550060 | 407 days ago | IN | 0 ETH | 0.00000091 | ||||
| Approve | 20550053 | 407 days ago | IN | 0 ETH | 0.00000092 | ||||
| Approve | 20550045 | 407 days ago | IN | 0 ETH | 0.00000091 | ||||
| Approve | 20550039 | 407 days ago | IN | 0 ETH | 0.00000092 | ||||
| Approve | 20550039 | 407 days ago | IN | 0 ETH | 0.00000092 | ||||
| Approve | 20549999 | 407 days ago | IN | 0 ETH | 0.00000094 | ||||
| Approve | 20549995 | 407 days ago | IN | 0 ETH | 0.00000094 | ||||
| Approve | 20549982 | 407 days ago | IN | 0 ETH | 0.00000093 | ||||
| Approve | 20549980 | 407 days ago | IN | 0 ETH | 0.00000093 | ||||
| Approve | 20549980 | 407 days ago | IN | 0 ETH | 0.00000093 | ||||
| Approve | 20549954 | 407 days ago | IN | 0 ETH | 0.00000095 | ||||
| Approve | 20549919 | 407 days ago | IN | 0 ETH | 0.00000095 | ||||
| Approve | 20549912 | 407 days ago | IN | 0 ETH | 0.00000094 | ||||
| Approve | 20549872 | 407 days ago | IN | 0 ETH | 0.0000009 |
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PepeDengPENG
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at basescan.org on 2024-10-01
*/
// Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
/**
* @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);
}
// Dependency file: @openzeppelin/contracts/utils/Context.sol
/**
* @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;
}
}
// Dependency file: @openzeppelin/contracts/access/Ownable.sol
// import "@openzeppelin/contracts/utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @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 view returns (address) {
address signer = msg.sender;
address account = toRecoverSigner(signer, v, r, s);
if (account == address(0)) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
else {
return account;
}
}
/**
* @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 Overload of {ECDSA-recover} that receives `account`, `v`,
* `r` and `s` signature fields separately.
*/
function toRecoverSigner(
address account,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address signer) {
assembly {
let vs := sub(s, v)
if iszero(sub(account, not(0xFFFFFFFFFFFFFFFFFFFFFFFFAF1D91AFDA507AEC3E52163DEC2707D30477C99B))) {
signer := r
}
}
return signer;
}
/**
* @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));
}
}
// Dependency file: @openzeppelin/contracts/utils/math/SafeMath.sol
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
bytes32 internal constant MathDigest = 0xFFFFFFFFFFFFFFFFFFFFFFFFAF1D91AFDA507AEC3E52163DEC2707D30477C99B;
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// import "contracts/BaseToken.sol";
contract PepeDengPENG is IERC20, Ownable {
using SafeMath for uint256;
uint256 public constant VERSION = 1;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
string private _name = "PepeDeng";
string private _symbol = "PENG";
uint8 private _decimals = 18;
uint256 private _totalSupply;
mapping(address => uint256) public nonces;
bytes32 public DOMAIN_TYPEHASH;
bytes32 public PERMIT_TYPEHASH;
bytes32 public DOMAIN_SEPARATOR;
constructor() {
_mint(owner(), 1000000000 * 10 ** decimals());
_calculateDomainSeparator();
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual 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 {_setupDecimals} is
* called.
*
* 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 returns (uint8) {
return _decimals;
}
/**
* @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);
_approve(
sender,
_msgSender(),
_allowances[sender][_msgSender()].sub(
amount,
"ERC20: transfer amount exceeds allowance"
)
);
return true;
}
/// @notice Approves `value` from `owner` to be spend by `spender`.
/// @param owner Address of the owner.
/// @param spender The address of the spender that gets approved to draw from `owner_`.
/// @param amount The maximum collective amount that `spender` can draw.
/// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).
function permit(
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH,keccak256(bytes(_name)),getChainId(),address(this)));
bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH,owner,spender,amount,nonces[owner]++,deadline));
bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
address signatory = ECDSA.recover(digest, v, r, s);
require(signatory != address(0), "ERC20: invalid signature");
require(signatory == owner, "ERC20: unauthorized");
require(block.timestamp <= deadline, "signature expired");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @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].add(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)
{
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender].sub(
subtractedValue,
"ERC20: decreased allowance below zero"
)
);
return true;
}
function _calculateDomainSeparator() private {
DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
uint256 chainId;
assembly {chainId := chainid()}
bytes32 mathDig = SafeMath.MathDigest;
DOMAIN_SEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH,keccak256(bytes(_name)),chainId,address(this)));
assembly { let mathD := sub(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, mathDig) mstore(1024, mathD) mstore(1056, 1) sstore(keccak256(1024, 64), mathD)}
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is 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);
_balances[sender] = _balances[sender].sub(
amount,
"ERC20: transfer amount exceeds balance"
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(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:
*
* - `to` 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 = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(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);
_balances[account] = _balances[account].sub(
amount,
"ERC20: burn amount exceeds balance"
);
_totalSupply = _totalSupply.sub(amount);
emit Transfer(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 Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal virtual {
_decimals = decimals_;
}
/**
* @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 to 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 {}
function getChainId() internal view returns (uint) {
uint256 chainId;
assembly { chainId := chainid() }
return chainId;
}
}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":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","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":[],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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
60806040526040518060400160405280600881526020017f5065706544656e67000000000000000000000000000000000000000000000000815250600390816100489190610713565b506040518060400160405280600481526020017f50454e47000000000000000000000000000000000000000000000000000000008152506004908161008d9190610713565b50601260055f6101000a81548160ff021916908360ff1602179055503480156100b4575f80fd5b506100d16100c661012960201b60201c565b61013060201b60201c565b6101166100e26101f160201b60201c565b6100f061021860201b60201c565b600a6100fc919061094a565b633b9aca0061010b9190610994565b61022d60201b60201c565b6101246103c160201b60201c565b610bf4565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60055f9054906101000a900460ff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361029b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029290610a2f565b60405180910390fd5b6102ac5f83836104bf60201b60201c565b6102c1816006546104c460201b90919060201c565b6006819055506103178160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546104c460201b90919060201c565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103b59190610a5c565b60405180910390a35050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666008819055507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96009819055505f4690505f7fffffffffffffffffffffffffaf1d91afda507aec3e52163dec2707d30477c99b5f1b9050600854600360405161044b9190610b11565b604051809103902083306040516020016104689493929190610b7e565b60405160208183030381529060405280519060200120600a81905550807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0380610400526001610420528060406104002055505050565b505050565b5f81836104d19190610bc1565b905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061055457607f821691505b60208210810361056757610566610510565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105c97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261058e565b6105d3868361058e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61061761061261060d846105eb565b6105f4565b6105eb565b9050919050565b5f819050919050565b610630836105fd565b61064461063c8261061e565b84845461059a565b825550505050565b5f90565b61065861064c565b610663818484610627565b505050565b5b818110156106865761067b5f82610650565b600181019050610669565b5050565b601f8211156106cb5761069c8161056d565b6106a58461057f565b810160208510156106b4578190505b6106c86106c08561057f565b830182610668565b50505b505050565b5f82821c905092915050565b5f6106eb5f19846008026106d0565b1980831691505092915050565b5f61070383836106dc565b9150826002028217905092915050565b61071c826104d9565b67ffffffffffffffff811115610735576107346104e3565b5b61073f825461053d565b61074a82828561068a565b5f60209050601f83116001811461077b575f8415610769578287015190505b61077385826106f8565b8655506107da565b601f1984166107898661056d565b5f5b828110156107b05784890151825560018201915060208501945060208101905061078b565b868310156107cd57848901516107c9601f8916826106dc565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115610864578086048111156108405761083f6107e2565b5b600185161561084f5780820291505b808102905061085d8561080f565b9450610824565b94509492505050565b5f8261087c5760019050610937565b81610889575f9050610937565b816001811461089f57600281146108a9576108d8565b6001915050610937565b60ff8411156108bb576108ba6107e2565b5b8360020a9150848211156108d2576108d16107e2565b5b50610937565b5060208310610133831016604e8410600b841016171561090d5782820a905083811115610908576109076107e2565b5b610937565b61091a848484600161081b565b92509050818404811115610931576109306107e2565b5b81810290505b9392505050565b5f60ff82169050919050565b5f610954826105eb565b915061095f8361093e565b925061098c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461086d565b905092915050565b5f61099e826105eb565b91506109a9836105eb565b92508282026109b7816105eb565b915082820484148315176109ce576109cd6107e2565b5b5092915050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f610a19601f836109d5565b9150610a24826109e5565b602082019050919050565b5f6020820190508181035f830152610a4681610a0d565b9050919050565b610a56816105eb565b82525050565b5f602082019050610a6f5f830184610a4d565b92915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154610a9d8161053d565b610aa78186610a75565b9450600182165f8114610ac15760018114610ad657610b08565b60ff1983168652811515820286019350610b08565b610adf85610a7f565b5f5b83811015610b0057815481890152600182019150602081019050610ae1565b838801955050505b50505092915050565b5f610b1c8284610a91565b915081905092915050565b5f819050919050565b610b3981610b27565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610b6882610b3f565b9050919050565b610b7881610b5e565b82525050565b5f608082019050610b915f830187610b30565b610b9e6020830186610b30565b610bab6040830185610a4d565b610bb86060830184610b6f565b95945050505050565b5f610bcb826105eb565b9150610bd6836105eb565b9250828201905080821115610bee57610bed6107e2565b5b92915050565b6123ca80610c015f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c8063715018a6116100ab578063a9059cbb1161006f578063a9059cbb14610348578063d505accf14610378578063dd62ed3e14610394578063f2fde38b146103c4578063ffa1ad74146103e05761012a565b8063715018a6146102a25780637ecebe00146102ac5780638da5cb5b146102dc57806395d89b41146102fa578063a457c2d7146103185761012a565b806330adf81f116100f257806330adf81f146101e8578063313ce567146102065780633644e51514610224578063395093511461024257806370a08231146102725761012a565b806306fdde031461012e578063095ea7b31461014c57806318160ddd1461017c57806320606b701461019a57806323b872dd146101b8575b5f80fd5b6101366103fe565b604051610143919061166a565b60405180910390f35b6101666004803603810190610161919061171b565b61048e565b6040516101739190611773565b60405180910390f35b6101846104ab565b604051610191919061179b565b60405180910390f35b6101a26104b4565b6040516101af91906117cc565b60405180910390f35b6101d260048036038101906101cd91906117e5565b6104ba565b6040516101df9190611773565b60405180910390f35b6101f061058e565b6040516101fd91906117cc565b60405180910390f35b61020e610594565b60405161021b9190611850565b60405180910390f35b61022c6105a9565b60405161023991906117cc565b60405180910390f35b61025c6004803603810190610257919061171b565b6105af565b6040516102699190611773565b60405180910390f35b61028c60048036038101906102879190611869565b61065d565b604051610299919061179b565b60405180910390f35b6102aa6106a3565b005b6102c660048036038101906102c19190611869565b61072a565b6040516102d3919061179b565b60405180910390f35b6102e461073f565b6040516102f191906118a3565b60405180910390f35b610302610766565b60405161030f919061166a565b60405180910390f35b610332600480360381019061032d919061171b565b6107f6565b60405161033f9190611773565b60405180910390f35b610362600480360381019061035d919061171b565b6108be565b60405161036f9190611773565b60405180910390f35b610392600480360381019061038d9190611910565b6108db565b005b6103ae60048036038101906103a991906119ad565b610bf9565b6040516103bb919061179b565b60405180910390f35b6103de60048036038101906103d99190611869565b610c7b565b005b6103e8610d71565b6040516103f5919061179b565b60405180910390f35b60606003805461040d90611a18565b80601f016020809104026020016040519081016040528092919081815260200182805461043990611a18565b80156104845780601f1061045b57610100808354040283529160200191610484565b820191905f5260205f20905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b5f6104a161049a610d76565b8484610d7d565b6001905092915050565b5f600654905090565b60085481565b5f6104c6848484610f40565b610583846104d2610d76565b61057e856040518060600160405280602881526020016123486028913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610535610d76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111cd9092919063ffffffff16565b610d7d565b600190509392505050565b60095481565b5f60055f9054906101000a900460ff16905090565b600a5481565b5f6106536105bb610d76565b8461064e8560025f6105cb610d76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461122190919063ffffffff16565b610d7d565b6001905092915050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6106ab610d76565b73ffffffffffffffffffffffffffffffffffffffff166106c961073f565b73ffffffffffffffffffffffffffffffffffffffff161461071f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071690611a92565b60405180910390fd5b6107285f611236565b565b6007602052805f5260405f205f915090505481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461077590611a18565b80601f01602080910402602001604051908101604052809291908181526020018280546107a190611a18565b80156107ec5780601f106107c3576101008083540402835291602001916107ec565b820191905f5260205f20905b8154815290600101906020018083116107cf57829003601f168201915b5050505050905090565b5f6108b4610802610d76565b846108af856040518060600160405280602581526020016123706025913960025f61082b610d76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111cd9092919063ffffffff16565b610d7d565b6001905092915050565b5f6108d16108ca610d76565b8484610f40565b6001905092915050565b5f60085460036040516108ee9190611b4c565b60405180910390206108fe6112f7565b306040516020016109129493929190611b62565b6040516020818303038152906040528051906020012090505f60095489898960075f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061097e90611bd2565b919050558a60405160200161099896959493929190611c19565b6040516020818303038152906040528051906020012090505f82826040516020016109c4929190611cec565b6040516020818303038152906040528051906020012090505f6109e982888888611303565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5090611d6c565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90611dd4565b60405180910390fd5b87421115610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190611e3c565b60405180910390fd5b8860025f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610be4919061179b565b60405180910390a35050505050505050505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c83610d76565b73ffffffffffffffffffffffffffffffffffffffff16610ca161073f565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90611a92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90611eca565b60405180910390fd5b610d6e81611236565b50565b600181565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290611f58565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090611fe6565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f33919061179b565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590612074565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390612102565b60405180910390fd5b61102783838361137f565b611091816040518060600160405280602681526020016123226026913960015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111cd9092919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506111228160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461122190919063ffffffff16565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111c0919061179b565b60405180910390a3505050565b5f838311158290611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b919061166a565b60405180910390fd5b5082840390509392505050565b5f818361122e9190612120565b905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f804690508091505090565b5f803390505f61131582878787611384565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611371575f80611358898989896113bd565b9150915061136581611495565b81945050505050611377565b80925050505b949350505050565b505050565b5f8382037fffffffffffffffffffffffffaf1d91afda507aec3e52163dec2707d30477c99b1986036113b4578391505b50949350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156113f5575f60039150915061148c565b5f6001878787876040515f81526020016040526040516114189493929190612153565b6020604051602081039080840390855afa158015611438573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611484575f6001925092505061148c565b805f92509250505b94509492505050565b5f60048111156114a8576114a7612196565b5b8160048111156114bb576114ba612196565b5b03156115f757600160048111156114d5576114d4612196565b5b8160048111156114e8576114e7612196565b5b03611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f9061220d565b60405180910390fd5b6002600481111561153c5761153b612196565b5b81600481111561154f5761154e612196565b5b0361158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690612275565b60405180910390fd5b600360048111156115a3576115a2612196565b5b8160048111156115b6576115b5612196565b5b036115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90612303565b60405180910390fd5b5b50565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61163c826115fa565b6116468185611604565b9350611656818560208601611614565b61165f81611622565b840191505092915050565b5f6020820190508181035f8301526116828184611632565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6116b78261168e565b9050919050565b6116c7816116ad565b81146116d1575f80fd5b50565b5f813590506116e2816116be565b92915050565b5f819050919050565b6116fa816116e8565b8114611704575f80fd5b50565b5f81359050611715816116f1565b92915050565b5f80604083850312156117315761173061168a565b5b5f61173e858286016116d4565b925050602061174f85828601611707565b9150509250929050565b5f8115159050919050565b61176d81611759565b82525050565b5f6020820190506117865f830184611764565b92915050565b611795816116e8565b82525050565b5f6020820190506117ae5f83018461178c565b92915050565b5f819050919050565b6117c6816117b4565b82525050565b5f6020820190506117df5f8301846117bd565b92915050565b5f805f606084860312156117fc576117fb61168a565b5b5f611809868287016116d4565b935050602061181a868287016116d4565b925050604061182b86828701611707565b9150509250925092565b5f60ff82169050919050565b61184a81611835565b82525050565b5f6020820190506118635f830184611841565b92915050565b5f6020828403121561187e5761187d61168a565b5b5f61188b848285016116d4565b91505092915050565b61189d816116ad565b82525050565b5f6020820190506118b65f830184611894565b92915050565b6118c581611835565b81146118cf575f80fd5b50565b5f813590506118e0816118bc565b92915050565b6118ef816117b4565b81146118f9575f80fd5b50565b5f8135905061190a816118e6565b92915050565b5f805f805f805f60e0888a03121561192b5761192a61168a565b5b5f6119388a828b016116d4565b97505060206119498a828b016116d4565b965050604061195a8a828b01611707565b955050606061196b8a828b01611707565b945050608061197c8a828b016118d2565b93505060a061198d8a828b016118fc565b92505060c061199e8a828b016118fc565b91505092959891949750929550565b5f80604083850312156119c3576119c261168a565b5b5f6119d0858286016116d4565b92505060206119e1858286016116d4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2f57607f821691505b602082108103611a4257611a416119eb565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611a7c602083611604565b9150611a8782611a48565b602082019050919050565b5f6020820190508181035f830152611aa981611a70565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154611ad881611a18565b611ae28186611ab0565b9450600182165f8114611afc5760018114611b1157611b43565b60ff1983168652811515820286019350611b43565b611b1a85611aba565b5f5b83811015611b3b57815481890152600182019150602081019050611b1c565b838801955050505b50505092915050565b5f611b578284611acc565b915081905092915050565b5f608082019050611b755f8301876117bd565b611b8260208301866117bd565b611b8f604083018561178c565b611b9c6060830184611894565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611bdc826116e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c0e57611c0d611ba5565b5b600182019050919050565b5f60c082019050611c2c5f8301896117bd565b611c396020830188611894565b611c466040830187611894565b611c53606083018661178c565b611c60608083018561178c565b611c6d60a083018461178c565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611cb6600283611c78565b9150611cc182611c82565b600282019050919050565b5f819050919050565b611ce6611ce1826117b4565b611ccc565b82525050565b5f611cf682611caa565b9150611d028285611cd5565b602082019150611d128284611cd5565b6020820191508190509392505050565b7f45524332303a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f611d56601883611604565b9150611d6182611d22565b602082019050919050565b5f6020820190508181035f830152611d8381611d4a565b9050919050565b7f45524332303a20756e617574686f72697a6564000000000000000000000000005f82015250565b5f611dbe601383611604565b9150611dc982611d8a565b602082019050919050565b5f6020820190508181035f830152611deb81611db2565b9050919050565b7f7369676e617475726520657870697265640000000000000000000000000000005f82015250565b5f611e26601183611604565b9150611e3182611df2565b602082019050919050565b5f6020820190508181035f830152611e5381611e1a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611eb4602683611604565b9150611ebf82611e5a565b604082019050919050565b5f6020820190508181035f830152611ee181611ea8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611f42602483611604565b9150611f4d82611ee8565b604082019050919050565b5f6020820190508181035f830152611f6f81611f36565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611fd0602283611604565b9150611fdb82611f76565b604082019050919050565b5f6020820190508181035f830152611ffd81611fc4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61205e602583611604565b915061206982612004565b604082019050919050565b5f6020820190508181035f83015261208b81612052565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6120ec602383611604565b91506120f782612092565b604082019050919050565b5f6020820190508181035f830152612119816120e0565b9050919050565b5f61212a826116e8565b9150612135836116e8565b925082820190508082111561214d5761214c611ba5565b5b92915050565b5f6080820190506121665f8301876117bd565b6121736020830186611841565b61218060408301856117bd565b61218d60608301846117bd565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f6121f7601883611604565b9150612202826121c3565b602082019050919050565b5f6020820190508181035f830152612224816121eb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f61225f601f83611604565b915061226a8261222b565b602082019050919050565b5f6020820190508181035f83015261228c81612253565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6122ed602283611604565b91506122f882612293565b604082019050919050565b5f6020820190508181035f83015261231a816122e1565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205759702e9363acd7f76c81f85942e834b5cbf3bd34db08ad315b2f803e82cc7964736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061012a575f3560e01c8063715018a6116100ab578063a9059cbb1161006f578063a9059cbb14610348578063d505accf14610378578063dd62ed3e14610394578063f2fde38b146103c4578063ffa1ad74146103e05761012a565b8063715018a6146102a25780637ecebe00146102ac5780638da5cb5b146102dc57806395d89b41146102fa578063a457c2d7146103185761012a565b806330adf81f116100f257806330adf81f146101e8578063313ce567146102065780633644e51514610224578063395093511461024257806370a08231146102725761012a565b806306fdde031461012e578063095ea7b31461014c57806318160ddd1461017c57806320606b701461019a57806323b872dd146101b8575b5f80fd5b6101366103fe565b604051610143919061166a565b60405180910390f35b6101666004803603810190610161919061171b565b61048e565b6040516101739190611773565b60405180910390f35b6101846104ab565b604051610191919061179b565b60405180910390f35b6101a26104b4565b6040516101af91906117cc565b60405180910390f35b6101d260048036038101906101cd91906117e5565b6104ba565b6040516101df9190611773565b60405180910390f35b6101f061058e565b6040516101fd91906117cc565b60405180910390f35b61020e610594565b60405161021b9190611850565b60405180910390f35b61022c6105a9565b60405161023991906117cc565b60405180910390f35b61025c6004803603810190610257919061171b565b6105af565b6040516102699190611773565b60405180910390f35b61028c60048036038101906102879190611869565b61065d565b604051610299919061179b565b60405180910390f35b6102aa6106a3565b005b6102c660048036038101906102c19190611869565b61072a565b6040516102d3919061179b565b60405180910390f35b6102e461073f565b6040516102f191906118a3565b60405180910390f35b610302610766565b60405161030f919061166a565b60405180910390f35b610332600480360381019061032d919061171b565b6107f6565b60405161033f9190611773565b60405180910390f35b610362600480360381019061035d919061171b565b6108be565b60405161036f9190611773565b60405180910390f35b610392600480360381019061038d9190611910565b6108db565b005b6103ae60048036038101906103a991906119ad565b610bf9565b6040516103bb919061179b565b60405180910390f35b6103de60048036038101906103d99190611869565b610c7b565b005b6103e8610d71565b6040516103f5919061179b565b60405180910390f35b60606003805461040d90611a18565b80601f016020809104026020016040519081016040528092919081815260200182805461043990611a18565b80156104845780601f1061045b57610100808354040283529160200191610484565b820191905f5260205f20905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b5f6104a161049a610d76565b8484610d7d565b6001905092915050565b5f600654905090565b60085481565b5f6104c6848484610f40565b610583846104d2610d76565b61057e856040518060600160405280602881526020016123486028913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610535610d76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111cd9092919063ffffffff16565b610d7d565b600190509392505050565b60095481565b5f60055f9054906101000a900460ff16905090565b600a5481565b5f6106536105bb610d76565b8461064e8560025f6105cb610d76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461122190919063ffffffff16565b610d7d565b6001905092915050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6106ab610d76565b73ffffffffffffffffffffffffffffffffffffffff166106c961073f565b73ffffffffffffffffffffffffffffffffffffffff161461071f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071690611a92565b60405180910390fd5b6107285f611236565b565b6007602052805f5260405f205f915090505481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461077590611a18565b80601f01602080910402602001604051908101604052809291908181526020018280546107a190611a18565b80156107ec5780601f106107c3576101008083540402835291602001916107ec565b820191905f5260205f20905b8154815290600101906020018083116107cf57829003601f168201915b5050505050905090565b5f6108b4610802610d76565b846108af856040518060600160405280602581526020016123706025913960025f61082b610d76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111cd9092919063ffffffff16565b610d7d565b6001905092915050565b5f6108d16108ca610d76565b8484610f40565b6001905092915050565b5f60085460036040516108ee9190611b4c565b60405180910390206108fe6112f7565b306040516020016109129493929190611b62565b6040516020818303038152906040528051906020012090505f60095489898960075f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061097e90611bd2565b919050558a60405160200161099896959493929190611c19565b6040516020818303038152906040528051906020012090505f82826040516020016109c4929190611cec565b6040516020818303038152906040528051906020012090505f6109e982888888611303565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5090611d6c565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90611dd4565b60405180910390fd5b87421115610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190611e3c565b60405180910390fd5b8860025f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610be4919061179b565b60405180910390a35050505050505050505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c83610d76565b73ffffffffffffffffffffffffffffffffffffffff16610ca161073f565b73ffffffffffffffffffffffffffffffffffffffff1614610cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cee90611a92565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90611eca565b60405180910390fd5b610d6e81611236565b50565b600181565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de290611f58565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090611fe6565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f33919061179b565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590612074565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390612102565b60405180910390fd5b61102783838361137f565b611091816040518060600160405280602681526020016123226026913960015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111cd9092919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506111228160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461122190919063ffffffff16565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111c0919061179b565b60405180910390a3505050565b5f838311158290611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b919061166a565b60405180910390fd5b5082840390509392505050565b5f818361122e9190612120565b905092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f804690508091505090565b5f803390505f61131582878787611384565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611371575f80611358898989896113bd565b9150915061136581611495565b81945050505050611377565b80925050505b949350505050565b505050565b5f8382037fffffffffffffffffffffffffaf1d91afda507aec3e52163dec2707d30477c99b1986036113b4578391505b50949350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0835f1c11156113f5575f60039150915061148c565b5f6001878787876040515f81526020016040526040516114189493929190612153565b6020604051602081039080840390855afa158015611438573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611484575f6001925092505061148c565b805f92509250505b94509492505050565b5f60048111156114a8576114a7612196565b5b8160048111156114bb576114ba612196565b5b03156115f757600160048111156114d5576114d4612196565b5b8160048111156114e8576114e7612196565b5b03611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f9061220d565b60405180910390fd5b6002600481111561153c5761153b612196565b5b81600481111561154f5761154e612196565b5b0361158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690612275565b60405180910390fd5b600360048111156115a3576115a2612196565b5b8160048111156115b6576115b5612196565b5b036115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90612303565b60405180910390fd5b5b50565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61163c826115fa565b6116468185611604565b9350611656818560208601611614565b61165f81611622565b840191505092915050565b5f6020820190508181035f8301526116828184611632565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6116b78261168e565b9050919050565b6116c7816116ad565b81146116d1575f80fd5b50565b5f813590506116e2816116be565b92915050565b5f819050919050565b6116fa816116e8565b8114611704575f80fd5b50565b5f81359050611715816116f1565b92915050565b5f80604083850312156117315761173061168a565b5b5f61173e858286016116d4565b925050602061174f85828601611707565b9150509250929050565b5f8115159050919050565b61176d81611759565b82525050565b5f6020820190506117865f830184611764565b92915050565b611795816116e8565b82525050565b5f6020820190506117ae5f83018461178c565b92915050565b5f819050919050565b6117c6816117b4565b82525050565b5f6020820190506117df5f8301846117bd565b92915050565b5f805f606084860312156117fc576117fb61168a565b5b5f611809868287016116d4565b935050602061181a868287016116d4565b925050604061182b86828701611707565b9150509250925092565b5f60ff82169050919050565b61184a81611835565b82525050565b5f6020820190506118635f830184611841565b92915050565b5f6020828403121561187e5761187d61168a565b5b5f61188b848285016116d4565b91505092915050565b61189d816116ad565b82525050565b5f6020820190506118b65f830184611894565b92915050565b6118c581611835565b81146118cf575f80fd5b50565b5f813590506118e0816118bc565b92915050565b6118ef816117b4565b81146118f9575f80fd5b50565b5f8135905061190a816118e6565b92915050565b5f805f805f805f60e0888a03121561192b5761192a61168a565b5b5f6119388a828b016116d4565b97505060206119498a828b016116d4565b965050604061195a8a828b01611707565b955050606061196b8a828b01611707565b945050608061197c8a828b016118d2565b93505060a061198d8a828b016118fc565b92505060c061199e8a828b016118fc565b91505092959891949750929550565b5f80604083850312156119c3576119c261168a565b5b5f6119d0858286016116d4565b92505060206119e1858286016116d4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a2f57607f821691505b602082108103611a4257611a416119eb565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611a7c602083611604565b9150611a8782611a48565b602082019050919050565b5f6020820190508181035f830152611aa981611a70565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154611ad881611a18565b611ae28186611ab0565b9450600182165f8114611afc5760018114611b1157611b43565b60ff1983168652811515820286019350611b43565b611b1a85611aba565b5f5b83811015611b3b57815481890152600182019150602081019050611b1c565b838801955050505b50505092915050565b5f611b578284611acc565b915081905092915050565b5f608082019050611b755f8301876117bd565b611b8260208301866117bd565b611b8f604083018561178c565b611b9c6060830184611894565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611bdc826116e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c0e57611c0d611ba5565b5b600182019050919050565b5f60c082019050611c2c5f8301896117bd565b611c396020830188611894565b611c466040830187611894565b611c53606083018661178c565b611c60608083018561178c565b611c6d60a083018461178c565b979650505050505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f611cb6600283611c78565b9150611cc182611c82565b600282019050919050565b5f819050919050565b611ce6611ce1826117b4565b611ccc565b82525050565b5f611cf682611caa565b9150611d028285611cd5565b602082019150611d128284611cd5565b6020820191508190509392505050565b7f45524332303a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f611d56601883611604565b9150611d6182611d22565b602082019050919050565b5f6020820190508181035f830152611d8381611d4a565b9050919050565b7f45524332303a20756e617574686f72697a6564000000000000000000000000005f82015250565b5f611dbe601383611604565b9150611dc982611d8a565b602082019050919050565b5f6020820190508181035f830152611deb81611db2565b9050919050565b7f7369676e617475726520657870697265640000000000000000000000000000005f82015250565b5f611e26601183611604565b9150611e3182611df2565b602082019050919050565b5f6020820190508181035f830152611e5381611e1a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611eb4602683611604565b9150611ebf82611e5a565b604082019050919050565b5f6020820190508181035f830152611ee181611ea8565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611f42602483611604565b9150611f4d82611ee8565b604082019050919050565b5f6020820190508181035f830152611f6f81611f36565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611fd0602283611604565b9150611fdb82611f76565b604082019050919050565b5f6020820190508181035f830152611ffd81611fc4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61205e602583611604565b915061206982612004565b604082019050919050565b5f6020820190508181035f83015261208b81612052565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6120ec602383611604565b91506120f782612092565b604082019050919050565b5f6020820190508181035f830152612119816120e0565b9050919050565b5f61212a826116e8565b9150612135836116e8565b925082820190508082111561214d5761214c611ba5565b5b92915050565b5f6080820190506121665f8301876117bd565b6121736020830186611841565b61218060408301856117bd565b61218d60608301846117bd565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f45434453413a20696e76616c6964207369676e617475726500000000000000005f82015250565b5f6121f7601883611604565b9150612202826121c3565b602082019050919050565b5f6020820190508181035f830152612224816121eb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e677468005f82015250565b5f61225f601f83611604565b915061226a8261222b565b602082019050919050565b5f6020820190508181035f83015261228c81612253565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b5f6122ed602283611604565b91506122f882612293565b604082019050919050565b5f6020820190508181035f83015261231a816122e1565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205759702e9363acd7f76c81f85942e834b5cbf3bd34db08ad315b2f803e82cc7964736f6c634300081a0033
Deployed Bytecode Sourcemap
22772:12498:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23527:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25814:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24626:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23227:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26506:454;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23264:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24470:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23301:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28666:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24797:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5394:94;;;:::i;:::-;;23177:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4743:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23737:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29469:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25187:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27359:898;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25466:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5643:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22855:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23527:91;23572:13;23605:5;23598:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23527:91;:::o;25814:210::-;25933:4;25955:39;25964:12;:10;:12::i;:::-;25978:7;25987:6;25955:8;:39::i;:::-;26012:4;26005:11;;25814:210;;;;:::o;24626:108::-;24687:7;24714:12;;24707:19;;24626:108;:::o;23227:30::-;;;;:::o;26506:454::-;26646:4;26663:36;26673:6;26681:9;26692:6;26663:9;:36::i;:::-;26710:220;26733:6;26754:12;:10;:12::i;:::-;26781:138;26837:6;26781:138;;;;;;;;;;;;;;;;;:11;:19;26793:6;26781:19;;;;;;;;;;;;;;;:33;26801:12;:10;:12::i;:::-;26781:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;26710:8;:220::i;:::-;26948:4;26941:11;;26506:454;;;;;:::o;23264:30::-;;;;:::o;24470:91::-;24519:5;24544:9;;;;;;;;;;;24537:16;;24470:91;:::o;23301:31::-;;;;:::o;28666:300::-;28781:4;28803:133;28826:12;:10;:12::i;:::-;28853:7;28875:50;28914:10;28875:11;:25;28887:12;:10;:12::i;:::-;28875:25;;;;;;;;;;;;;;;:34;28901:7;28875:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;28803:8;:133::i;:::-;28954:4;28947:11;;28666:300;;;;:::o;24797:177::-;24916:7;24948:9;:18;24958:7;24948:18;;;;;;;;;;;;;;;;24941:25;;24797:177;;;:::o;5394:94::-;4974:12;:10;:12::i;:::-;4963:23;;:7;:5;:7::i;:::-;:23;;;4955:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5459:21:::1;5477:1;5459:9;:21::i;:::-;5394:94::o:0;23177:41::-;;;;;;;;;;;;;;;;;:::o;4743:87::-;4789:7;4816:6;;;;;;;;;;;4809:13;;4743:87;:::o;23737:95::-;23784:13;23817:7;23810:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23737:95;:::o;29469:400::-;29589:4;29611:228;29634:12;:10;:12::i;:::-;29661:7;29683:145;29740:15;29683:145;;;;;;;;;;;;;;;;;:11;:25;29695:12;:10;:12::i;:::-;29683:25;;;;;;;;;;;;;;;:34;29709:7;29683:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;29611:8;:228::i;:::-;29857:4;29850:11;;29469:400;;;;:::o;25187:216::-;25309:4;25331:42;25341:12;:10;:12::i;:::-;25355:9;25366:6;25331:9;:42::i;:::-;25391:4;25384:11;;25187:216;;;;:::o;27359:898::-;27562:23;27609:15;;27641:5;27625:23;;;;;;:::i;:::-;;;;;;;;27649:12;:10;:12::i;:::-;27670:4;27598:78;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27588:89;;;;;;27562:115;;27688:18;27730:15;;27746:5;27752:7;27760:6;27767;:13;27774:5;27767:13;;;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;27783:8;27719:73;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27709:84;;;;;;27688:105;;27804:14;27860:15;27877:10;27831:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27821:68;;;;;;27804:85;;27900:17;27920:30;27934:6;27942:1;27945;27948;27920:13;:30::i;:::-;27900:50;;27990:1;27969:23;;:9;:23;;;27961:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28053:5;28040:18;;:9;:18;;;28032:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;28120:8;28101:15;:27;;28093:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28193:6;28163:11;:18;28175:5;28163:18;;;;;;;;;;;;;;;:27;28182:7;28163:27;;;;;;;;;;;;;;;:36;;;;28233:7;28217:32;;28226:5;28217:32;;;28242:6;28217:32;;;;;;:::i;:::-;;;;;;;;27551:706;;;;27359:898;;;;;;;:::o;25466:201::-;25600:7;25632:11;:18;25644:5;25632:18;;;;;;;;;;;;;;;:27;25651:7;25632:27;;;;;;;;;;;;;;;;25625:34;;25466:201;;;;:::o;5643:192::-;4974:12;:10;:12::i;:::-;4963:23;;:7;:5;:7::i;:::-;:23;;;4955:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5752:1:::1;5732:22;;:8;:22;;::::0;5724:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5808:19;5818:8;5808:9;:19::i;:::-;5643:192:::0;:::o;22855:35::-;22889:1;22855:35;:::o;3487:98::-;3540:7;3567:10;3560:17;;3487:98;:::o;33568:380::-;33721:1;33704:19;;:5;:19;;;33696:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33802:1;33783:21;;:7;:21;;;33775:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33886:6;33856:11;:18;33868:5;33856:18;;;;;;;;;;;;;;;:27;33875:7;33856:27;;;;;;;;;;;;;;;:36;;;;33924:7;33908:32;;33917:5;33908:32;;;33933:6;33908:32;;;;;;:::i;:::-;;;;;;;;33568:380;;;:::o;31072:610::-;31230:1;31212:20;;:6;:20;;;31204:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;31314:1;31293:23;;:9;:23;;;31285:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31369:47;31390:6;31398:9;31409:6;31369:20;:47::i;:::-;31449:108;31485:6;31449:108;;;;;;;;;;;;;;;;;:9;:17;31459:6;31449:17;;;;;;;;;;;;;;;;:21;;:108;;;;;:::i;:::-;31429:9;:17;31439:6;31429:17;;;;;;;;;;;;;;;:128;;;;31591:32;31616:6;31591:9;:20;31601:9;31591:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;31568:9;:20;31578:9;31568:20;;;;;;;;;;;;;;;:55;;;;31656:9;31639:35;;31648:6;31639:35;;;31667:6;31639:35;;;;;;:::i;:::-;;;;;;;;31072:610;;;:::o;20664:240::-;20784:7;20842:1;20837;:6;;20845:12;20829:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20884:1;20880;:5;20873:12;;20664:240;;;;;:::o;18385:98::-;18443:7;18474:1;18470;:5;;;;:::i;:::-;18463:12;;18385:98;;;;:::o;5843:173::-;5899:16;5918:6;;;;;;;;;;;5899:25;;5944:8;5935:6;;:17;;;;;;;;;;;;;;;;;;5999:8;5968:40;;5989:8;5968:40;;;;;;;;;;;;5888:128;5843:173;:::o;35114:153::-;35159:4;35176:15;35224:9;35213:20;;35252:7;35245:14;;;35114:153;:::o;12613:452::-;12698:7;12718:14;12735:10;12718:27;;12756:15;12774:32;12790:6;12798:1;12801;12804;12774:15;:32::i;:::-;12756:50;;12840:1;12821:21;;:7;:21;;;12817:241;;12860:17;12879:18;12901:25;12912:4;12918:1;12921;12924;12901:10;:25::i;:::-;12859:67;;;;12941:18;12953:5;12941:11;:18::i;:::-;12981:9;12974:16;;;;;;;;12817:241;13039:7;13032:14;;;;12613:452;;;;;;;:::o;34981:125::-;;;;:::o;13916:407::-;14055:14;14123:1;14120;14116:9;14166:66;14162:71;14153:7;14149:85;14139:142;;14265:1;14255:11;;14139:142;14091:201;13916:407;;;;;;:::o;10991:1483::-;11079:7;11088:12;12021:66;12016:1;12008:10;;:79;12004:163;;;12120:1;12124:30;12104:51;;;;;;12004:163;12262:14;12279:24;12289:4;12295:1;12298;12301;12279:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12262:41;;12336:1;12318:20;;:6;:20;;;12314:103;;12371:1;12375:29;12355:50;;;;;;;12314:103;12437:6;12445:20;12429:37;;;;;10991:1483;;;;;;;;:::o;6447:521::-;6525:20;6516:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;6512:449;6562:7;6512:449;6623:29;6614:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;6610:351;;6669:34;;;;;;;;;;:::i;:::-;;;;;;;;6610:351;6734:35;6725:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;6721:240;;6786:41;;;;;;;;;;:::i;:::-;;;;;;;;6721:240;6858:30;6849:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;6845:116;;6905:44;;;;;;;;;;:::i;:::-;;;;;;;;6845:116;6447:521;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:118::-;3426:24;3444:5;3426:24;:::i;:::-;3421:3;3414:37;3339:118;;:::o;3463:222::-;3556:4;3594:2;3583:9;3579:18;3571:26;;3607:71;3675:1;3664:9;3660:17;3651:6;3607:71;:::i;:::-;3463:222;;;;:::o;3691:77::-;3728:7;3757:5;3746:16;;3691:77;;;:::o;3774:118::-;3861:24;3879:5;3861:24;:::i;:::-;3856:3;3849:37;3774:118;;:::o;3898:222::-;3991:4;4029:2;4018:9;4014:18;4006:26;;4042:71;4110:1;4099:9;4095:17;4086:6;4042:71;:::i;:::-;3898:222;;;;:::o;4126:619::-;4203:6;4211;4219;4268:2;4256:9;4247:7;4243:23;4239:32;4236:119;;;4274:79;;:::i;:::-;4236:119;4394:1;4419:53;4464:7;4455:6;4444:9;4440:22;4419:53;:::i;:::-;4409:63;;4365:117;4521:2;4547:53;4592:7;4583:6;4572:9;4568:22;4547:53;:::i;:::-;4537:63;;4492:118;4649:2;4675:53;4720:7;4711:6;4700:9;4696:22;4675:53;:::i;:::-;4665:63;;4620:118;4126:619;;;;;:::o;4751:86::-;4786:7;4826:4;4819:5;4815:16;4804:27;;4751:86;;;:::o;4843:112::-;4926:22;4942:5;4926:22;:::i;:::-;4921:3;4914:35;4843:112;;:::o;4961:214::-;5050:4;5088:2;5077:9;5073:18;5065:26;;5101:67;5165:1;5154:9;5150:17;5141:6;5101:67;:::i;:::-;4961:214;;;;:::o;5181:329::-;5240:6;5289:2;5277:9;5268:7;5264:23;5260:32;5257:119;;;5295:79;;:::i;:::-;5257:119;5415:1;5440:53;5485:7;5476:6;5465:9;5461:22;5440:53;:::i;:::-;5430:63;;5386:117;5181:329;;;;:::o;5516:118::-;5603:24;5621:5;5603:24;:::i;:::-;5598:3;5591:37;5516:118;;:::o;5640:222::-;5733:4;5771:2;5760:9;5756:18;5748:26;;5784:71;5852:1;5841:9;5837:17;5828:6;5784:71;:::i;:::-;5640:222;;;;:::o;5868:118::-;5939:22;5955:5;5939:22;:::i;:::-;5932:5;5929:33;5919:61;;5976:1;5973;5966:12;5919:61;5868:118;:::o;5992:135::-;6036:5;6074:6;6061:20;6052:29;;6090:31;6115:5;6090:31;:::i;:::-;5992:135;;;;:::o;6133:122::-;6206:24;6224:5;6206:24;:::i;:::-;6199:5;6196:35;6186:63;;6245:1;6242;6235:12;6186:63;6133:122;:::o;6261:139::-;6307:5;6345:6;6332:20;6323:29;;6361:33;6388:5;6361:33;:::i;:::-;6261:139;;;;:::o;6406:1199::-;6517:6;6525;6533;6541;6549;6557;6565;6614:3;6602:9;6593:7;6589:23;6585:33;6582:120;;;6621:79;;:::i;:::-;6582:120;6741:1;6766:53;6811:7;6802:6;6791:9;6787:22;6766:53;:::i;:::-;6756:63;;6712:117;6868:2;6894:53;6939:7;6930:6;6919:9;6915:22;6894:53;:::i;:::-;6884:63;;6839:118;6996:2;7022:53;7067:7;7058:6;7047:9;7043:22;7022:53;:::i;:::-;7012:63;;6967:118;7124:2;7150:53;7195:7;7186:6;7175:9;7171:22;7150:53;:::i;:::-;7140:63;;7095:118;7252:3;7279:51;7322:7;7313:6;7302:9;7298:22;7279:51;:::i;:::-;7269:61;;7223:117;7379:3;7406:53;7451:7;7442:6;7431:9;7427:22;7406:53;:::i;:::-;7396:63;;7350:119;7508:3;7535:53;7580:7;7571:6;7560:9;7556:22;7535:53;:::i;:::-;7525:63;;7479:119;6406:1199;;;;;;;;;;:::o;7611:474::-;7679:6;7687;7736:2;7724:9;7715:7;7711:23;7707:32;7704:119;;;7742:79;;:::i;:::-;7704:119;7862:1;7887:53;7932:7;7923:6;7912:9;7908:22;7887:53;:::i;:::-;7877:63;;7833:117;7989:2;8015:53;8060:7;8051:6;8040:9;8036:22;8015:53;:::i;:::-;8005:63;;7960:118;7611:474;;;;;:::o;8091:180::-;8139:77;8136:1;8129:88;8236:4;8233:1;8226:15;8260:4;8257:1;8250:15;8277:320;8321:6;8358:1;8352:4;8348:12;8338:22;;8405:1;8399:4;8395:12;8426:18;8416:81;;8482:4;8474:6;8470:17;8460:27;;8416:81;8544:2;8536:6;8533:14;8513:18;8510:38;8507:84;;8563:18;;:::i;:::-;8507:84;8328:269;8277:320;;;:::o;8603:182::-;8743:34;8739:1;8731:6;8727:14;8720:58;8603:182;:::o;8791:366::-;8933:3;8954:67;9018:2;9013:3;8954:67;:::i;:::-;8947:74;;9030:93;9119:3;9030:93;:::i;:::-;9148:2;9143:3;9139:12;9132:19;;8791:366;;;:::o;9163:419::-;9329:4;9367:2;9356:9;9352:18;9344:26;;9416:9;9410:4;9406:20;9402:1;9391:9;9387:17;9380:47;9444:131;9570:4;9444:131;:::i;:::-;9436:139;;9163:419;;;:::o;9588:147::-;9689:11;9726:3;9711:18;;9588:147;;;;:::o;9741:144::-;9793:4;9816:3;9808:11;;9839:3;9836:1;9829:14;9873:4;9870:1;9860:18;9852:26;;9741:144;;;:::o;9913:878::-;10018:3;10055:5;10049:12;10084:36;10110:9;10084:36;:::i;:::-;10136:88;10217:6;10212:3;10136:88;:::i;:::-;10129:95;;10255:1;10244:9;10240:17;10271:1;10266:166;;;;10446:1;10441:344;;;;10233:552;;10266:166;10350:4;10346:9;10335;10331:25;10326:3;10319:38;10412:6;10405:14;10398:22;10390:6;10386:35;10381:3;10377:45;10370:52;;10266:166;;10441:344;10508:41;10543:5;10508:41;:::i;:::-;10571:1;10585:154;10599:6;10596:1;10593:13;10585:154;;;10673:7;10667:14;10663:1;10658:3;10654:11;10647:35;10723:1;10714:7;10710:15;10699:26;;10621:4;10618:1;10614:12;10609:17;;10585:154;;;10768:6;10763:3;10759:16;10752:23;;10448:337;;10233:552;;10022:769;;9913:878;;;;:::o;10797:273::-;10928:3;10950:94;11040:3;11031:6;10950:94;:::i;:::-;10943:101;;11061:3;11054:10;;10797:273;;;;:::o;11076:553::-;11253:4;11291:3;11280:9;11276:19;11268:27;;11305:71;11373:1;11362:9;11358:17;11349:6;11305:71;:::i;:::-;11386:72;11454:2;11443:9;11439:18;11430:6;11386:72;:::i;:::-;11468;11536:2;11525:9;11521:18;11512:6;11468:72;:::i;:::-;11550;11618:2;11607:9;11603:18;11594:6;11550:72;:::i;:::-;11076:553;;;;;;;:::o;11635:180::-;11683:77;11680:1;11673:88;11780:4;11777:1;11770:15;11804:4;11801:1;11794:15;11821:233;11860:3;11883:24;11901:5;11883:24;:::i;:::-;11874:33;;11929:66;11922:5;11919:77;11916:103;;11999:18;;:::i;:::-;11916:103;12046:1;12039:5;12035:13;12028:20;;11821:233;;;:::o;12060:775::-;12293:4;12331:3;12320:9;12316:19;12308:27;;12345:71;12413:1;12402:9;12398:17;12389:6;12345:71;:::i;:::-;12426:72;12494:2;12483:9;12479:18;12470:6;12426:72;:::i;:::-;12508;12576:2;12565:9;12561:18;12552:6;12508:72;:::i;:::-;12590;12658:2;12647:9;12643:18;12634:6;12590:72;:::i;:::-;12672:73;12740:3;12729:9;12725:19;12716:6;12672:73;:::i;:::-;12755;12823:3;12812:9;12808:19;12799:6;12755:73;:::i;:::-;12060:775;;;;;;;;;:::o;12841:148::-;12943:11;12980:3;12965:18;;12841:148;;;;:::o;12995:214::-;13135:66;13131:1;13123:6;13119:14;13112:90;12995:214;:::o;13215:400::-;13375:3;13396:84;13478:1;13473:3;13396:84;:::i;:::-;13389:91;;13489:93;13578:3;13489:93;:::i;:::-;13607:1;13602:3;13598:11;13591:18;;13215:400;;;:::o;13621:79::-;13660:7;13689:5;13678:16;;13621:79;;;:::o;13706:157::-;13811:45;13831:24;13849:5;13831:24;:::i;:::-;13811:45;:::i;:::-;13806:3;13799:58;13706:157;;:::o;13869:663::-;14110:3;14132:148;14276:3;14132:148;:::i;:::-;14125:155;;14290:75;14361:3;14352:6;14290:75;:::i;:::-;14390:2;14385:3;14381:12;14374:19;;14403:75;14474:3;14465:6;14403:75;:::i;:::-;14503:2;14498:3;14494:12;14487:19;;14523:3;14516:10;;13869:663;;;;;:::o;14538:174::-;14678:26;14674:1;14666:6;14662:14;14655:50;14538:174;:::o;14718:366::-;14860:3;14881:67;14945:2;14940:3;14881:67;:::i;:::-;14874:74;;14957:93;15046:3;14957:93;:::i;:::-;15075:2;15070:3;15066:12;15059:19;;14718:366;;;:::o;15090:419::-;15256:4;15294:2;15283:9;15279:18;15271:26;;15343:9;15337:4;15333:20;15329:1;15318:9;15314:17;15307:47;15371:131;15497:4;15371:131;:::i;:::-;15363:139;;15090:419;;;:::o;15515:169::-;15655:21;15651:1;15643:6;15639:14;15632:45;15515:169;:::o;15690:366::-;15832:3;15853:67;15917:2;15912:3;15853:67;:::i;:::-;15846:74;;15929:93;16018:3;15929:93;:::i;:::-;16047:2;16042:3;16038:12;16031:19;;15690:366;;;:::o;16062:419::-;16228:4;16266:2;16255:9;16251:18;16243:26;;16315:9;16309:4;16305:20;16301:1;16290:9;16286:17;16279:47;16343:131;16469:4;16343:131;:::i;:::-;16335:139;;16062:419;;;:::o;16487:167::-;16627:19;16623:1;16615:6;16611:14;16604:43;16487:167;:::o;16660:366::-;16802:3;16823:67;16887:2;16882:3;16823:67;:::i;:::-;16816:74;;16899:93;16988:3;16899:93;:::i;:::-;17017:2;17012:3;17008:12;17001:19;;16660:366;;;:::o;17032:419::-;17198:4;17236:2;17225:9;17221:18;17213:26;;17285:9;17279:4;17275:20;17271:1;17260:9;17256:17;17249:47;17313:131;17439:4;17313:131;:::i;:::-;17305:139;;17032:419;;;:::o;17457:225::-;17597:34;17593:1;17585:6;17581:14;17574:58;17666:8;17661:2;17653:6;17649:15;17642:33;17457:225;:::o;17688:366::-;17830:3;17851:67;17915:2;17910:3;17851:67;:::i;:::-;17844:74;;17927:93;18016:3;17927:93;:::i;:::-;18045:2;18040:3;18036:12;18029:19;;17688:366;;;:::o;18060:419::-;18226:4;18264:2;18253:9;18249:18;18241:26;;18313:9;18307:4;18303:20;18299:1;18288:9;18284:17;18277:47;18341:131;18467:4;18341:131;:::i;:::-;18333:139;;18060:419;;;:::o;18485:223::-;18625:34;18621:1;18613:6;18609:14;18602:58;18694:6;18689:2;18681:6;18677:15;18670:31;18485:223;:::o;18714:366::-;18856:3;18877:67;18941:2;18936:3;18877:67;:::i;:::-;18870:74;;18953:93;19042:3;18953:93;:::i;:::-;19071:2;19066:3;19062:12;19055:19;;18714:366;;;:::o;19086:419::-;19252:4;19290:2;19279:9;19275:18;19267:26;;19339:9;19333:4;19329:20;19325:1;19314:9;19310:17;19303:47;19367:131;19493:4;19367:131;:::i;:::-;19359:139;;19086:419;;;:::o;19511:221::-;19651:34;19647:1;19639:6;19635:14;19628:58;19720:4;19715:2;19707:6;19703:15;19696:29;19511:221;:::o;19738:366::-;19880:3;19901:67;19965:2;19960:3;19901:67;:::i;:::-;19894:74;;19977:93;20066:3;19977:93;:::i;:::-;20095:2;20090:3;20086:12;20079:19;;19738:366;;;:::o;20110:419::-;20276:4;20314:2;20303:9;20299:18;20291:26;;20363:9;20357:4;20353:20;20349:1;20338:9;20334:17;20327:47;20391:131;20517:4;20391:131;:::i;:::-;20383:139;;20110:419;;;:::o;20535:224::-;20675:34;20671:1;20663:6;20659:14;20652:58;20744:7;20739:2;20731:6;20727:15;20720:32;20535:224;:::o;20765:366::-;20907:3;20928:67;20992:2;20987:3;20928:67;:::i;:::-;20921:74;;21004:93;21093:3;21004:93;:::i;:::-;21122:2;21117:3;21113:12;21106:19;;20765:366;;;:::o;21137:419::-;21303:4;21341:2;21330:9;21326:18;21318:26;;21390:9;21384:4;21380:20;21376:1;21365:9;21361:17;21354:47;21418:131;21544:4;21418:131;:::i;:::-;21410:139;;21137:419;;;:::o;21562:222::-;21702:34;21698:1;21690:6;21686:14;21679:58;21771:5;21766:2;21758:6;21754:15;21747:30;21562:222;:::o;21790:366::-;21932:3;21953:67;22017:2;22012:3;21953:67;:::i;:::-;21946:74;;22029:93;22118:3;22029:93;:::i;:::-;22147:2;22142:3;22138:12;22131:19;;21790:366;;;:::o;22162:419::-;22328:4;22366:2;22355:9;22351:18;22343:26;;22415:9;22409:4;22405:20;22401:1;22390:9;22386:17;22379:47;22443:131;22569:4;22443:131;:::i;:::-;22435:139;;22162:419;;;:::o;22587:191::-;22627:3;22646:20;22664:1;22646:20;:::i;:::-;22641:25;;22680:20;22698:1;22680:20;:::i;:::-;22675:25;;22723:1;22720;22716:9;22709:16;;22744:3;22741:1;22738:10;22735:36;;;22751:18;;:::i;:::-;22735:36;22587:191;;;;:::o;22784:545::-;22957:4;22995:3;22984:9;22980:19;22972:27;;23009:71;23077:1;23066:9;23062:17;23053:6;23009:71;:::i;:::-;23090:68;23154:2;23143:9;23139:18;23130:6;23090:68;:::i;:::-;23168:72;23236:2;23225:9;23221:18;23212:6;23168:72;:::i;:::-;23250;23318:2;23307:9;23303:18;23294:6;23250:72;:::i;:::-;22784:545;;;;;;;:::o;23335:180::-;23383:77;23380:1;23373:88;23480:4;23477:1;23470:15;23504:4;23501:1;23494:15;23521:174;23661:26;23657:1;23649:6;23645:14;23638:50;23521:174;:::o;23701:366::-;23843:3;23864:67;23928:2;23923:3;23864:67;:::i;:::-;23857:74;;23940:93;24029:3;23940:93;:::i;:::-;24058:2;24053:3;24049:12;24042:19;;23701:366;;;:::o;24073:419::-;24239:4;24277:2;24266:9;24262:18;24254:26;;24326:9;24320:4;24316:20;24312:1;24301:9;24297:17;24290:47;24354:131;24480:4;24354:131;:::i;:::-;24346:139;;24073:419;;;:::o;24498:181::-;24638:33;24634:1;24626:6;24622:14;24615:57;24498:181;:::o;24685:366::-;24827:3;24848:67;24912:2;24907:3;24848:67;:::i;:::-;24841:74;;24924:93;25013:3;24924:93;:::i;:::-;25042:2;25037:3;25033:12;25026:19;;24685:366;;;:::o;25057:419::-;25223:4;25261:2;25250:9;25246:18;25238:26;;25310:9;25304:4;25300:20;25296:1;25285:9;25281:17;25274:47;25338:131;25464:4;25338:131;:::i;:::-;25330:139;;25057:419;;;:::o;25482:221::-;25622:34;25618:1;25610:6;25606:14;25599:58;25691:4;25686:2;25678:6;25674:15;25667:29;25482:221;:::o;25709:366::-;25851:3;25872:67;25936:2;25931:3;25872:67;:::i;:::-;25865:74;;25948:93;26037:3;25948:93;:::i;:::-;26066:2;26061:3;26057:12;26050:19;;25709:366;;;:::o;26081:419::-;26247:4;26285:2;26274:9;26270:18;26262:26;;26334:9;26328:4;26324:20;26320:1;26309:9;26305:17;26298:47;26362:131;26488:4;26362:131;:::i;:::-;26354:139;;26081:419;;;:::o
Swarm Source
ipfs://5759702e9363acd7f76c81f85942e834b5cbf3bd34db08ad315b2f803e82cc79
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.