Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 55 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 23618222 | 157 days ago | IN | 0 ETH | 0.00001596 | ||||
| Transfer Ownersh... | 21708866 | 424 days ago | IN | 0 ETH | 0.00023723 | ||||
| Transfer | 21164126 | 500 days ago | IN | 0 ETH | 0.00072294 | ||||
| Transfer | 21164126 | 500 days ago | IN | 0 ETH | 0.00092403 | ||||
| Burn | 21163953 | 500 days ago | IN | 0 ETH | 0.00043835 | ||||
| Burn | 21163941 | 500 days ago | IN | 0 ETH | 0.00049744 | ||||
| Burn | 21163916 | 500 days ago | IN | 0 ETH | 0.00047123 | ||||
| Burn | 20791568 | 552 days ago | IN | 0 ETH | 0.00055568 | ||||
| Burn | 20791514 | 552 days ago | IN | 0 ETH | 0.00049686 | ||||
| Burn | 20791372 | 552 days ago | IN | 0 ETH | 0.00034411 | ||||
| Approve | 20791083 | 552 days ago | IN | 0 ETH | 0.00036604 | ||||
| Approve | 20791037 | 552 days ago | IN | 0 ETH | 0.00058733 | ||||
| Approve | 20790961 | 552 days ago | IN | 0 ETH | 0.00041703 | ||||
| Increase Allowan... | 20790008 | 552 days ago | IN | 0 ETH | 0.0003266 | ||||
| Transfer | 20788781 | 552 days ago | IN | 0 ETH | 0.00040856 | ||||
| Transfer | 20788778 | 552 days ago | IN | 0 ETH | 0.00040628 | ||||
| Transfer | 20788753 | 552 days ago | IN | 0 ETH | 0.00041434 | ||||
| Transfer | 20788750 | 552 days ago | IN | 0 ETH | 0.00041124 | ||||
| Transfer | 20788745 | 552 days ago | IN | 0 ETH | 0.0004513 | ||||
| Transfer | 20788700 | 552 days ago | IN | 0 ETH | 0.00052354 | ||||
| Transfer | 20788697 | 552 days ago | IN | 0 ETH | 0.00053788 | ||||
| Transfer | 20788621 | 552 days ago | IN | 0 ETH | 0.00040997 | ||||
| Transfer | 20768511 | 555 days ago | IN | 0 ETH | 0.00016573 | ||||
| Approve | 20768259 | 555 days ago | IN | 0 ETH | 0.00010882 | ||||
| Transfer | 20748125 | 558 days ago | IN | 0 ETH | 0.00010488 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NOBELIS
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-09-12
*/
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, 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}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, 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}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/token/ERC20/extensions/ERC20Burnable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)
pragma solidity ^0.8.0;
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
_spendAllowance(account, _msgSender(), amount);
_burn(account, amount);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/access/IAccessControl.sol
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/math/Math.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.0/contracts/access/AccessControl.sol
// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File: contracts/NOBELIS.sol
pragma solidity ^0.8.20;
// Import non-upgradeable versions of OpenZeppelin Contracts
contract NOBELIS is ERC20, ERC20Burnable, AccessControl {
// Roles
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
// Limits
uint256 public constant MAX_HOLD = 10_099 * 10**18; // Max tokens a single address can hold
uint256 public constant MAX_TX_AMOUNT = 1_099 * 10**18; // Max amount per transaction
// Fee percentages
uint256 public constant BURN_FEE = 3; // 3% burn fee
uint256 public constant LIQUIDITY_FEE = 4; // 4% liquidity fee
uint256 public constant INVESTMENT_FEE = 2; // 2% investment fee
uint256 private constant TOTAL_FEE = BURN_FEE + LIQUIDITY_FEE + INVESTMENT_FEE; // Total fee percentage
// Wallet addresses
address public liquidityWallet;
address public investmentWallet;
constructor() ERC20("NOBELIS", "NOB") {
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setupRole(ADMIN_ROLE, msg.sender);
_mint(msg.sender, 10_000_000_000 * 10**18); // Initial supply
}
// Set wallet addresses for liquidity and investment
function setWalletAddresses(address _liquidityWallet, address _investmentWallet) external onlyRole(ADMIN_ROLE) {
liquidityWallet = _liquidityWallet;
investmentWallet = _investmentWallet;
}
// Renounce the admin role
function renounceOwnership() external onlyRole(ADMIN_ROLE) {
_revokeRole(ADMIN_ROLE, msg.sender);
}
// Transfer ownership to a new address
function transferOwnership(address newAdmin) external onlyRole(ADMIN_ROLE) {
require(newAdmin != address(0), "New admin cannot be the zero address");
_grantRole(ADMIN_ROLE, newAdmin);
_revokeRole(ADMIN_ROLE, msg.sender);
}
// Transfer with fees and limits
function transfer(address recipient, uint256 amount) public override returns (bool) {
require(amount <= MAX_TX_AMOUNT, "Tx exceeds max limit");
require(balanceOf(recipient) + amount <= MAX_HOLD, "Recipient exceeds max hold");
uint256 feeAmount = (amount * TOTAL_FEE) / 100;
uint256 netAmount = amount - feeAmount;
uint256 burnAmount = (feeAmount * BURN_FEE) / TOTAL_FEE;
uint256 liquidityAmount = (feeAmount * LIQUIDITY_FEE) / TOTAL_FEE;
uint256 investmentAmount = feeAmount - burnAmount - liquidityAmount;
// Use unchecked for arithmetic operations to save gas
unchecked {
if (burnAmount > 0) _burn(_msgSender(), burnAmount);
if (liquidityAmount > 0 && liquidityWallet != address(0)) _transfer(_msgSender(), liquidityWallet, liquidityAmount);
if (investmentAmount > 0 && investmentWallet != address(0)) _transfer(_msgSender(), investmentWallet, investmentAmount);
if (netAmount > 0) _transfer(_msgSender(), recipient, netAmount);
}
return true;
}
}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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVESTMENT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_HOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"investmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityWallet","type":"address"},{"internalType":"address","name":"_investmentWallet","type":"address"}],"name":"setWalletAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801562000010575f80fd5b506040518060400160405280600781526020017f4e4f42454c4953000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e4f42000000000000000000000000000000000000000000000000000000000081525081600390816200008e91906200064d565b508060049081620000a091906200064d565b505050620000b75f801b336200010d60201b60201c565b620000e97fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336200010d60201b60201c565b62000107336b204fce5e3e250261100000006200012360201b60201c565b62000842565b6200011f82826200028860201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000194576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018b906200078f565b60405180910390fd5b620001a75f83836200037460201b60201c565b8060025f828254620001ba9190620007dc565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000269919062000827565b60405180910390a3620002845f83836200037960201b60201c565b5050565b6200029a82826200037e60201b60201c565b6200037057600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555062000315620003e260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b505050565b505050565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200046557607f821691505b6020821081036200047b576200047a62000420565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004a2565b620004eb8683620004a2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005356200052f620005298462000503565b6200050c565b62000503565b9050919050565b5f819050919050565b620005508362000515565b620005686200055f826200053c565b848454620004ae565b825550505050565b5f90565b6200057e62000570565b6200058b81848462000545565b505050565b5b81811015620005b257620005a65f8262000574565b60018101905062000591565b5050565b601f8211156200060157620005cb8162000481565b620005d68462000493565b81016020851015620005e6578190505b620005fe620005f58562000493565b83018262000590565b50505b505050565b5f82821c905092915050565b5f620006235f198460080262000606565b1980831691505092915050565b5f6200063d838362000612565b9150826002028217905092915050565b6200065882620003e9565b67ffffffffffffffff811115620006745762000673620003f3565b5b6200068082546200044d565b6200068d828285620005b6565b5f60209050601f831160018114620006c3575f8415620006ae578287015190505b620006ba858262000630565b86555062000729565b601f198416620006d38662000481565b5f5b82811015620006fc57848901518255600182019150602085019450602081019050620006d5565b868310156200071c578489015162000718601f89168262000612565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62000777601f8362000731565b9150620007848262000741565b602082019050919050565b5f6020820190508181035f830152620007a88162000769565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620007e88262000503565b9150620007f58362000503565b925082820190508082111562000810576200080f620007af565b5b92915050565b620008218162000503565b82525050565b5f6020820190506200083c5f83018462000816565b92915050565b612aec80620008505f395ff3fe608060405234801561000f575f80fd5b50600436106101e3575f3560e01c806375b238fc1161010d578063a457c2d7116100a0578063d46980161161006f578063d469801614610595578063d547741f146105b3578063dd62ed3e146105cf578063f2fde38b146105ff576101e3565b8063a457c2d7146104f9578063a9059cbb14610529578063b6fa37bc14610559578063d40a9c4f14610577576101e3565b80638e8f9d0d116100dc5780638e8f9d0d1461046f57806391d148541461048d57806395d89b41146104bd578063a217fddf146104db576101e3565b806375b238fc146103fb57806379cc67901461041957806388847825146104355780638ae2702f14610451576101e3565b8063313ce56711610185578063480df05811610154578063480df0581461038557806353ab431b146103a357806370a08231146103c1578063715018a6146103f1576101e3565b8063313ce567146102ff57806336568abe1461031d578063395093511461033957806342966c6814610369576101e3565b806318160ddd116101c157806318160ddd1461026557806323b872dd14610283578063248a9ca3146102b35780632f2ff15d146102e3576101e3565b806301ffc9a7146101e757806306fdde0314610217578063095ea7b314610235575b5f80fd5b61020160048036038101906101fc9190611c75565b61061b565b60405161020e9190611cba565b60405180910390f35b61021f610694565b60405161022c9190611d5d565b60405180910390f35b61024f600480360381019061024a9190611e0a565b610724565b60405161025c9190611cba565b60405180910390f35b61026d610746565b60405161027a9190611e57565b60405180910390f35b61029d60048036038101906102989190611e70565b61074f565b6040516102aa9190611cba565b60405180910390f35b6102cd60048036038101906102c89190611ef3565b61077d565b6040516102da9190611f2d565b60405180910390f35b6102fd60048036038101906102f89190611f46565b61079a565b005b6103076107bb565b6040516103149190611f9f565b60405180910390f35b61033760048036038101906103329190611f46565b6107c3565b005b610353600480360381019061034e9190611e0a565b610846565b6040516103609190611cba565b60405180910390f35b610383600480360381019061037e9190611fb8565b61087c565b005b61038d610890565b60405161039a9190611e57565b60405180910390f35b6103ab610895565b6040516103b89190611e57565b60405180910390f35b6103db60048036038101906103d69190611fe3565b61089a565b6040516103e89190611e57565b60405180910390f35b6103f96108df565b005b610403610936565b6040516104109190611f2d565b60405180910390f35b610433600480360381019061042e9190611e0a565b61095a565b005b61044f600480360381019061044a919061200e565b61097a565b005b610459610a29565b6040516104669190611e57565b60405180910390f35b610477610a36565b6040516104849190611e57565b60405180910390f35b6104a760048036038101906104a29190611f46565b610a3b565b6040516104b49190611cba565b60405180910390f35b6104c5610a9f565b6040516104d29190611d5d565b60405180910390f35b6104e3610b2f565b6040516104f09190611f2d565b60405180910390f35b610513600480360381019061050e9190611e0a565b610b35565b6040516105209190611cba565b60405180910390f35b610543600480360381019061053e9190611e0a565b610baa565b6040516105509190611cba565b60405180910390f35b610561610e8a565b60405161056e919061205b565b60405180910390f35b61057f610eaf565b60405161058c9190611e57565b60405180910390f35b61059d610ebd565b6040516105aa919061205b565b60405180910390f35b6105cd60048036038101906105c89190611f46565b610ee2565b005b6105e960048036038101906105e4919061200e565b610f03565b6040516105f69190611e57565b60405180910390f35b61061960048036038101906106149190611fe3565b610f85565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068d575061068c82611075565b5b9050919050565b6060600380546106a3906120a1565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf906120a1565b801561071a5780601f106106f15761010080835404028352916020019161071a565b820191905f5260205f20905b8154815290600101906020018083116106fd57829003601f168201915b5050505050905090565b5f8061072e6110de565b905061073b8185856110e5565b600191505092915050565b5f600254905090565b5f806107596110de565b90506107668582856112a8565b610771858585611333565b60019150509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b6107a38261077d565b6107ac8161159f565b6107b683836115b3565b505050565b5f6012905090565b6107cb6110de565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082f90612141565b60405180910390fd5b610842828261168e565b5050565b5f806108506110de565b90506108718185856108628589610f03565b61086c919061218c565b6110e5565b600191505092915050565b61088d6108876110de565b82611769565b50565b600381565b600481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109098161159f565b6109337fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217753361168e565b50565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b61096c826109666110de565b836112a8565b6109768282611769565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109a48161159f565b8260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b683b93b0553f9a4c000081565b600281565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054610aae906120a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada906120a1565b8015610b255780601f10610afc57610100808354040283529160200191610b25565b820191905f5260205f20905b815481529060010190602001808311610b0857829003601f168201915b5050505050905090565b5f801b81565b5f80610b3f6110de565b90505f610b4c8286610f03565b905083811015610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b889061222f565b60405180910390fd5b610b9e82868684036110e5565b60019250505092915050565b5f683b93b0553f9a4c0000821115610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee90612297565b60405180910390fd5b69022377c771346dec000082610c0c8561089a565b610c16919061218c565b1115610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e906122ff565b60405180910390fd5b5f6064600260046003610c6a919061218c565b610c74919061218c565b84610c7f919061231d565b610c89919061238b565b90505f8184610c9891906123bb565b90505f600260046003610cab919061218c565b610cb5919061218c565b600384610cc2919061231d565b610ccc919061238b565b90505f600260046003610cdf919061218c565b610ce9919061218c565b600485610cf6919061231d565b610d00919061238b565b90505f818386610d1091906123bb565b610d1a91906123bb565b90505f831115610d3657610d35610d2f6110de565b84611769565b5b5f82118015610d9257505f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610dcb57610dca610da26110de565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611333565b5b5f81118015610e2757505f73ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610e6057610e5f610e376110de565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611333565b5b5f841115610e7b57610e7a610e736110de565b8986611333565b5b60019550505050505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b69022377c771346dec000081565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610eeb8261077d565b610ef48161159f565b610efe838361168e565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610faf8161159f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110149061245e565b60405180910390fd5b6110477fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775836115b3565b6110717fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217753361168e565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a906124ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b89061257a565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161129b9190611e57565b60405180910390a3505050565b5f6112b38484610f03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461132d578181101561131f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611316906125e2565b60405180910390fd5b61132c84848484036110e5565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890612670565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361140f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611406906126fe565b60405180910390fd5b61141a83838361192c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561149d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114949061278c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115869190611e57565b60405180910390a3611599848484611931565b50505050565b6115b0816115ab6110de565b611936565b50565b6115bd8282610a3b565b61168a57600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061162f6110de565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116988282610a3b565b15611765575f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061170a6110de565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce9061281a565b60405180910390fd5b6117e2825f8361192c565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906128a8565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119149190611e57565b60405180910390a3611927835f84611931565b505050565b505050565b505050565b6119408282610a3b565b6119b65761194d816119ba565b61195a835f1c60206119e7565b60405160200161196b929190612994565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad9190611d5d565b60405180910390fd5b5050565b60606119e08273ffffffffffffffffffffffffffffffffffffffff16601460ff166119e7565b9050919050565b60605f60028360026119f9919061231d565b611a03919061218c565b67ffffffffffffffff811115611a1c57611a1b6129cd565b5b6040519080825280601f01601f191660200182016040528015611a4e5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611a8557611a846129fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ae857611ae76129fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611b26919061231d565b611b30919061218c565b90505b6001811115611bcf577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611b7257611b716129fa565b5b1a60f81b828281518110611b8957611b886129fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611bc890612a27565b9050611b33565b505f8414611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0990612a98565b60405180910390fd5b8091505092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c5481611c20565b8114611c5e575f80fd5b50565b5f81359050611c6f81611c4b565b92915050565b5f60208284031215611c8a57611c89611c1c565b5b5f611c9784828501611c61565b91505092915050565b5f8115159050919050565b611cb481611ca0565b82525050565b5f602082019050611ccd5f830184611cab565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611d0a578082015181840152602081019050611cef565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611d2f82611cd3565b611d398185611cdd565b9350611d49818560208601611ced565b611d5281611d15565b840191505092915050565b5f6020820190508181035f830152611d758184611d25565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611da682611d7d565b9050919050565b611db681611d9c565b8114611dc0575f80fd5b50565b5f81359050611dd181611dad565b92915050565b5f819050919050565b611de981611dd7565b8114611df3575f80fd5b50565b5f81359050611e0481611de0565b92915050565b5f8060408385031215611e2057611e1f611c1c565b5b5f611e2d85828601611dc3565b9250506020611e3e85828601611df6565b9150509250929050565b611e5181611dd7565b82525050565b5f602082019050611e6a5f830184611e48565b92915050565b5f805f60608486031215611e8757611e86611c1c565b5b5f611e9486828701611dc3565b9350506020611ea586828701611dc3565b9250506040611eb686828701611df6565b9150509250925092565b5f819050919050565b611ed281611ec0565b8114611edc575f80fd5b50565b5f81359050611eed81611ec9565b92915050565b5f60208284031215611f0857611f07611c1c565b5b5f611f1584828501611edf565b91505092915050565b611f2781611ec0565b82525050565b5f602082019050611f405f830184611f1e565b92915050565b5f8060408385031215611f5c57611f5b611c1c565b5b5f611f6985828601611edf565b9250506020611f7a85828601611dc3565b9150509250929050565b5f60ff82169050919050565b611f9981611f84565b82525050565b5f602082019050611fb25f830184611f90565b92915050565b5f60208284031215611fcd57611fcc611c1c565b5b5f611fda84828501611df6565b91505092915050565b5f60208284031215611ff857611ff7611c1c565b5b5f61200584828501611dc3565b91505092915050565b5f806040838503121561202457612023611c1c565b5b5f61203185828601611dc3565b925050602061204285828601611dc3565b9150509250929050565b61205581611d9c565b82525050565b5f60208201905061206e5f83018461204c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806120b857607f821691505b6020821081036120cb576120ca612074565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f61212b602f83611cdd565b9150612136826120d1565b604082019050919050565b5f6020820190508181035f8301526121588161211f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61219682611dd7565b91506121a183611dd7565b92508282019050808211156121b9576121b861215f565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f612219602583611cdd565b9150612224826121bf565b604082019050919050565b5f6020820190508181035f8301526122468161220d565b9050919050565b7f54782065786365656473206d6178206c696d69740000000000000000000000005f82015250565b5f612281601483611cdd565b915061228c8261224d565b602082019050919050565b5f6020820190508181035f8301526122ae81612275565b9050919050565b7f526563697069656e742065786365656473206d617820686f6c640000000000005f82015250565b5f6122e9601a83611cdd565b91506122f4826122b5565b602082019050919050565b5f6020820190508181035f830152612316816122dd565b9050919050565b5f61232782611dd7565b915061233283611dd7565b925082820261234081611dd7565b915082820484148315176123575761235661215f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61239582611dd7565b91506123a083611dd7565b9250826123b0576123af61235e565b5b828204905092915050565b5f6123c582611dd7565b91506123d083611dd7565b92508282039050818111156123e8576123e761215f565b5b92915050565b7f4e65772061646d696e2063616e6e6f7420626520746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612448602483611cdd565b9150612453826123ee565b604082019050919050565b5f6020820190508181035f8301526124758161243c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6124d6602483611cdd565b91506124e18261247c565b604082019050919050565b5f6020820190508181035f830152612503816124ca565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612564602283611cdd565b915061256f8261250a565b604082019050919050565b5f6020820190508181035f83015261259181612558565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f6125cc601d83611cdd565b91506125d782612598565b602082019050919050565b5f6020820190508181035f8301526125f9816125c0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61265a602583611cdd565b915061266582612600565b604082019050919050565b5f6020820190508181035f8301526126878161264e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6126e8602383611cdd565b91506126f38261268e565b604082019050919050565b5f6020820190508181035f830152612715816126dc565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612776602683611cdd565b91506127818261271c565b604082019050919050565b5f6020820190508181035f8301526127a38161276a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612804602183611cdd565b915061280f826127aa565b604082019050919050565b5f6020820190508181035f830152612831816127f8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612892602283611cdd565b915061289d82612838565b604082019050919050565b5f6020820190508181035f8301526128bf81612886565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f6129046017836128c6565b915061290f826128d0565b601782019050919050565b5f61292482611cd3565b61292e81856128c6565b935061293e818560208601611ced565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61297e6011836128c6565b91506129898261294a565b601182019050919050565b5f61299e826128f8565b91506129aa828561291a565b91506129b582612972565b91506129c1828461291a565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612a3182611dd7565b91505f8203612a4357612a4261215f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f612a82602083611cdd565b9150612a8d82612a4e565b602082019050919050565b5f6020820190508181035f830152612aaf81612a76565b905091905056fea26469706673582212206b09b7f1f262f523ce51c93353c138016904d054853fcad37c6070fbf457792464736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101e3575f3560e01c806375b238fc1161010d578063a457c2d7116100a0578063d46980161161006f578063d469801614610595578063d547741f146105b3578063dd62ed3e146105cf578063f2fde38b146105ff576101e3565b8063a457c2d7146104f9578063a9059cbb14610529578063b6fa37bc14610559578063d40a9c4f14610577576101e3565b80638e8f9d0d116100dc5780638e8f9d0d1461046f57806391d148541461048d57806395d89b41146104bd578063a217fddf146104db576101e3565b806375b238fc146103fb57806379cc67901461041957806388847825146104355780638ae2702f14610451576101e3565b8063313ce56711610185578063480df05811610154578063480df0581461038557806353ab431b146103a357806370a08231146103c1578063715018a6146103f1576101e3565b8063313ce567146102ff57806336568abe1461031d578063395093511461033957806342966c6814610369576101e3565b806318160ddd116101c157806318160ddd1461026557806323b872dd14610283578063248a9ca3146102b35780632f2ff15d146102e3576101e3565b806301ffc9a7146101e757806306fdde0314610217578063095ea7b314610235575b5f80fd5b61020160048036038101906101fc9190611c75565b61061b565b60405161020e9190611cba565b60405180910390f35b61021f610694565b60405161022c9190611d5d565b60405180910390f35b61024f600480360381019061024a9190611e0a565b610724565b60405161025c9190611cba565b60405180910390f35b61026d610746565b60405161027a9190611e57565b60405180910390f35b61029d60048036038101906102989190611e70565b61074f565b6040516102aa9190611cba565b60405180910390f35b6102cd60048036038101906102c89190611ef3565b61077d565b6040516102da9190611f2d565b60405180910390f35b6102fd60048036038101906102f89190611f46565b61079a565b005b6103076107bb565b6040516103149190611f9f565b60405180910390f35b61033760048036038101906103329190611f46565b6107c3565b005b610353600480360381019061034e9190611e0a565b610846565b6040516103609190611cba565b60405180910390f35b610383600480360381019061037e9190611fb8565b61087c565b005b61038d610890565b60405161039a9190611e57565b60405180910390f35b6103ab610895565b6040516103b89190611e57565b60405180910390f35b6103db60048036038101906103d69190611fe3565b61089a565b6040516103e89190611e57565b60405180910390f35b6103f96108df565b005b610403610936565b6040516104109190611f2d565b60405180910390f35b610433600480360381019061042e9190611e0a565b61095a565b005b61044f600480360381019061044a919061200e565b61097a565b005b610459610a29565b6040516104669190611e57565b60405180910390f35b610477610a36565b6040516104849190611e57565b60405180910390f35b6104a760048036038101906104a29190611f46565b610a3b565b6040516104b49190611cba565b60405180910390f35b6104c5610a9f565b6040516104d29190611d5d565b60405180910390f35b6104e3610b2f565b6040516104f09190611f2d565b60405180910390f35b610513600480360381019061050e9190611e0a565b610b35565b6040516105209190611cba565b60405180910390f35b610543600480360381019061053e9190611e0a565b610baa565b6040516105509190611cba565b60405180910390f35b610561610e8a565b60405161056e919061205b565b60405180910390f35b61057f610eaf565b60405161058c9190611e57565b60405180910390f35b61059d610ebd565b6040516105aa919061205b565b60405180910390f35b6105cd60048036038101906105c89190611f46565b610ee2565b005b6105e960048036038101906105e4919061200e565b610f03565b6040516105f69190611e57565b60405180910390f35b61061960048036038101906106149190611fe3565b610f85565b005b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068d575061068c82611075565b5b9050919050565b6060600380546106a3906120a1565b80601f01602080910402602001604051908101604052809291908181526020018280546106cf906120a1565b801561071a5780601f106106f15761010080835404028352916020019161071a565b820191905f5260205f20905b8154815290600101906020018083116106fd57829003601f168201915b5050505050905090565b5f8061072e6110de565b905061073b8185856110e5565b600191505092915050565b5f600254905090565b5f806107596110de565b90506107668582856112a8565b610771858585611333565b60019150509392505050565b5f60055f8381526020019081526020015f20600101549050919050565b6107a38261077d565b6107ac8161159f565b6107b683836115b3565b505050565b5f6012905090565b6107cb6110de565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082f90612141565b60405180910390fd5b610842828261168e565b5050565b5f806108506110de565b90506108718185856108628589610f03565b61086c919061218c565b6110e5565b600191505092915050565b61088d6108876110de565b82611769565b50565b600381565b600481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109098161159f565b6109337fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217753361168e565b50565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b61096c826109666110de565b836112a8565b6109768282611769565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109a48161159f565b8260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b683b93b0553f9a4c000081565b600281565b5f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b606060048054610aae906120a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada906120a1565b8015610b255780601f10610afc57610100808354040283529160200191610b25565b820191905f5260205f20905b815481529060010190602001808311610b0857829003601f168201915b5050505050905090565b5f801b81565b5f80610b3f6110de565b90505f610b4c8286610f03565b905083811015610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b889061222f565b60405180910390fd5b610b9e82868684036110e5565b60019250505092915050565b5f683b93b0553f9a4c0000821115610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee90612297565b60405180910390fd5b69022377c771346dec000082610c0c8561089a565b610c16919061218c565b1115610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e906122ff565b60405180910390fd5b5f6064600260046003610c6a919061218c565b610c74919061218c565b84610c7f919061231d565b610c89919061238b565b90505f8184610c9891906123bb565b90505f600260046003610cab919061218c565b610cb5919061218c565b600384610cc2919061231d565b610ccc919061238b565b90505f600260046003610cdf919061218c565b610ce9919061218c565b600485610cf6919061231d565b610d00919061238b565b90505f818386610d1091906123bb565b610d1a91906123bb565b90505f831115610d3657610d35610d2f6110de565b84611769565b5b5f82118015610d9257505f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610dcb57610dca610da26110de565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611333565b5b5f81118015610e2757505f73ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610e6057610e5f610e376110de565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611333565b5b5f841115610e7b57610e7a610e736110de565b8986611333565b5b60019550505050505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b69022377c771346dec000081565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610eeb8261077d565b610ef48161159f565b610efe838361168e565b505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610faf8161159f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361101d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110149061245e565b60405180910390fd5b6110477fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775836115b3565b6110717fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217753361168e565b5050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a906124ec565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b89061257a565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161129b9190611e57565b60405180910390a3505050565b5f6112b38484610f03565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461132d578181101561131f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611316906125e2565b60405180910390fd5b61132c84848484036110e5565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139890612670565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361140f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611406906126fe565b60405180910390fd5b61141a83838361192c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561149d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114949061278c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115869190611e57565b60405180910390a3611599848484611931565b50505050565b6115b0816115ab6110de565b611936565b50565b6115bd8282610a3b565b61168a57600160055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061162f6110de565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116988282610a3b565b15611765575f60055f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061170a6110de565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce9061281a565b60405180910390fd5b6117e2825f8361192c565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906128a8565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119149190611e57565b60405180910390a3611927835f84611931565b505050565b505050565b505050565b6119408282610a3b565b6119b65761194d816119ba565b61195a835f1c60206119e7565b60405160200161196b929190612994565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad9190611d5d565b60405180910390fd5b5050565b60606119e08273ffffffffffffffffffffffffffffffffffffffff16601460ff166119e7565b9050919050565b60605f60028360026119f9919061231d565b611a03919061218c565b67ffffffffffffffff811115611a1c57611a1b6129cd565b5b6040519080825280601f01601f191660200182016040528015611a4e5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f81518110611a8557611a846129fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ae857611ae76129fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002611b26919061231d565b611b30919061218c565b90505b6001811115611bcf577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611b7257611b716129fa565b5b1a60f81b828281518110611b8957611b886129fa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080611bc890612a27565b9050611b33565b505f8414611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0990612a98565b60405180910390fd5b8091505092915050565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c5481611c20565b8114611c5e575f80fd5b50565b5f81359050611c6f81611c4b565b92915050565b5f60208284031215611c8a57611c89611c1c565b5b5f611c9784828501611c61565b91505092915050565b5f8115159050919050565b611cb481611ca0565b82525050565b5f602082019050611ccd5f830184611cab565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611d0a578082015181840152602081019050611cef565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611d2f82611cd3565b611d398185611cdd565b9350611d49818560208601611ced565b611d5281611d15565b840191505092915050565b5f6020820190508181035f830152611d758184611d25565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611da682611d7d565b9050919050565b611db681611d9c565b8114611dc0575f80fd5b50565b5f81359050611dd181611dad565b92915050565b5f819050919050565b611de981611dd7565b8114611df3575f80fd5b50565b5f81359050611e0481611de0565b92915050565b5f8060408385031215611e2057611e1f611c1c565b5b5f611e2d85828601611dc3565b9250506020611e3e85828601611df6565b9150509250929050565b611e5181611dd7565b82525050565b5f602082019050611e6a5f830184611e48565b92915050565b5f805f60608486031215611e8757611e86611c1c565b5b5f611e9486828701611dc3565b9350506020611ea586828701611dc3565b9250506040611eb686828701611df6565b9150509250925092565b5f819050919050565b611ed281611ec0565b8114611edc575f80fd5b50565b5f81359050611eed81611ec9565b92915050565b5f60208284031215611f0857611f07611c1c565b5b5f611f1584828501611edf565b91505092915050565b611f2781611ec0565b82525050565b5f602082019050611f405f830184611f1e565b92915050565b5f8060408385031215611f5c57611f5b611c1c565b5b5f611f6985828601611edf565b9250506020611f7a85828601611dc3565b9150509250929050565b5f60ff82169050919050565b611f9981611f84565b82525050565b5f602082019050611fb25f830184611f90565b92915050565b5f60208284031215611fcd57611fcc611c1c565b5b5f611fda84828501611df6565b91505092915050565b5f60208284031215611ff857611ff7611c1c565b5b5f61200584828501611dc3565b91505092915050565b5f806040838503121561202457612023611c1c565b5b5f61203185828601611dc3565b925050602061204285828601611dc3565b9150509250929050565b61205581611d9c565b82525050565b5f60208201905061206e5f83018461204c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806120b857607f821691505b6020821081036120cb576120ca612074565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e63655f8201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b5f61212b602f83611cdd565b9150612136826120d1565b604082019050919050565b5f6020820190508181035f8301526121588161211f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61219682611dd7565b91506121a183611dd7565b92508282019050808211156121b9576121b861215f565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f612219602583611cdd565b9150612224826121bf565b604082019050919050565b5f6020820190508181035f8301526122468161220d565b9050919050565b7f54782065786365656473206d6178206c696d69740000000000000000000000005f82015250565b5f612281601483611cdd565b915061228c8261224d565b602082019050919050565b5f6020820190508181035f8301526122ae81612275565b9050919050565b7f526563697069656e742065786365656473206d617820686f6c640000000000005f82015250565b5f6122e9601a83611cdd565b91506122f4826122b5565b602082019050919050565b5f6020820190508181035f830152612316816122dd565b9050919050565b5f61232782611dd7565b915061233283611dd7565b925082820261234081611dd7565b915082820484148315176123575761235661215f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61239582611dd7565b91506123a083611dd7565b9250826123b0576123af61235e565b5b828204905092915050565b5f6123c582611dd7565b91506123d083611dd7565b92508282039050818111156123e8576123e761215f565b5b92915050565b7f4e65772061646d696e2063616e6e6f7420626520746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612448602483611cdd565b9150612453826123ee565b604082019050919050565b5f6020820190508181035f8301526124758161243c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6124d6602483611cdd565b91506124e18261247c565b604082019050919050565b5f6020820190508181035f830152612503816124ca565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f612564602283611cdd565b915061256f8261250a565b604082019050919050565b5f6020820190508181035f83015261259181612558565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f6125cc601d83611cdd565b91506125d782612598565b602082019050919050565b5f6020820190508181035f8301526125f9816125c0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61265a602583611cdd565b915061266582612600565b604082019050919050565b5f6020820190508181035f8301526126878161264e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6126e8602383611cdd565b91506126f38261268e565b604082019050919050565b5f6020820190508181035f830152612715816126dc565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612776602683611cdd565b91506127818261271c565b604082019050919050565b5f6020820190508181035f8301526127a38161276a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612804602183611cdd565b915061280f826127aa565b604082019050919050565b5f6020820190508181035f830152612831816127f8565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612892602283611cdd565b915061289d82612838565b604082019050919050565b5f6020820190508181035f8301526128bf81612886565b9050919050565b5f81905092915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000005f82015250565b5f6129046017836128c6565b915061290f826128d0565b601782019050919050565b5f61292482611cd3565b61292e81856128c6565b935061293e818560208601611ced565b80840191505092915050565b7f206973206d697373696e6720726f6c65200000000000000000000000000000005f82015250565b5f61297e6011836128c6565b91506129898261294a565b601182019050919050565b5f61299e826128f8565b91506129aa828561291a565b91506129b582612972565b91506129c1828461291a565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612a3182611dd7565b91505f8203612a4357612a4261215f565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f612a82602083611cdd565b9150612a8d82612a4e565b602082019050919050565b5f6020820190508181035f830152612aaf81612a76565b905091905056fea26469706673582212206b09b7f1f262f523ce51c93353c138016904d054853fcad37c6070fbf457792464736f6c63430008140033
Deployed Bytecode Sourcemap
48152:2902:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42349:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6863:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9214:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7983:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9995:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44172:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44613:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7825:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45757:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10699:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18687:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48529:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48588:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8154:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49475:113;;;:::i;:::-;;48229:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19097:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49224:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48411:54;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48657:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42645:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7082:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41750:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11440:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49940:1111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48902:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48313:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48865:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45053:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8743:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49640:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42349:204;42434:4;42473:32;42458:47;;;:11;:47;;;;:87;;;;42509:36;42533:11;42509:23;:36::i;:::-;42458:87;42451:94;;42349:204;;;:::o;6863:100::-;6917:13;6950:5;6943:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6863:100;:::o;9214:201::-;9297:4;9314:13;9330:12;:10;:12::i;:::-;9314:28;;9353:32;9362:5;9369:7;9378:6;9353:8;:32::i;:::-;9403:4;9396:11;;;9214:201;;;;:::o;7983:108::-;8044:7;8071:12;;8064:19;;7983:108;:::o;9995:295::-;10126:4;10143:15;10161:12;:10;:12::i;:::-;10143:30;;10184:38;10200:4;10206:7;10215:6;10184:15;:38::i;:::-;10233:27;10243:4;10249:2;10253:6;10233:9;:27::i;:::-;10278:4;10271:11;;;9995:295;;;;;:::o;44172:131::-;44246:7;44273:6;:12;44280:4;44273:12;;;;;;;;;;;:22;;;44266:29;;44172:131;;;:::o;44613:147::-;44696:18;44709:4;44696:12;:18::i;:::-;42241:16;42252:4;42241:10;:16::i;:::-;44727:25:::1;44738:4;44744:7;44727:10;:25::i;:::-;44613:147:::0;;;:::o;7825:93::-;7883:5;7908:2;7901:9;;7825:93;:::o;45757:218::-;45864:12;:10;:12::i;:::-;45853:23;;:7;:23;;;45845:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;45941:26;45953:4;45959:7;45941:11;:26::i;:::-;45757:218;;:::o;10699:238::-;10787:4;10804:13;10820:12;:10;:12::i;:::-;10804:28;;10843:64;10852:5;10859:7;10896:10;10868:25;10878:5;10885:7;10868:9;:25::i;:::-;:38;;;;:::i;:::-;10843:8;:64::i;:::-;10925:4;10918:11;;;10699:238;;;;:::o;18687:91::-;18743:27;18749:12;:10;:12::i;:::-;18763:6;18743:5;:27::i;:::-;18687:91;:::o;48529:36::-;48564:1;48529:36;:::o;48588:41::-;48628:1;48588:41;:::o;8154:127::-;8228:7;8255:9;:18;8265:7;8255:18;;;;;;;;;;;;;;;;8248:25;;8154:127;;;:::o;49475:113::-;48266:23;42241:16;42252:4;42241:10;:16::i;:::-;49545:35:::1;48266:23;49569:10;49545:11;:35::i;:::-;49475:113:::0;:::o;48229:60::-;48266:23;48229:60;:::o;19097:164::-;19174:46;19190:7;19199:12;:10;:12::i;:::-;19213:6;19174:15;:46::i;:::-;19231:22;19237:7;19246:6;19231:5;:22::i;:::-;19097:164;;:::o;49224:211::-;48266:23;42241:16;42252:4;42241:10;:16::i;:::-;49364::::1;49346:15;;:34;;;;;;;;;;;;;;;;;;49410:17;49391:16;;:36;;;;;;;;;;;;;;;;;;49224:211:::0;;;:::o;48411:54::-;48451:14;48411:54;:::o;48657:42::-;48698:1;48657:42;:::o;42645:147::-;42731:4;42755:6;:12;42762:4;42755:12;;;;;;;;;;;:20;;:29;42776:7;42755:29;;;;;;;;;;;;;;;;;;;;;;;;;42748:36;;42645:147;;;;:::o;7082:104::-;7138:13;7171:7;7164:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7082:104;:::o;41750:49::-;41795:4;41750:49;;;:::o;11440:436::-;11533:4;11550:13;11566:12;:10;:12::i;:::-;11550:28;;11589:24;11616:25;11626:5;11633:7;11616:9;:25::i;:::-;11589:52;;11680:15;11660:16;:35;;11652:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11773:60;11782:5;11789:7;11817:15;11798:16;:34;11773:8;:60::i;:::-;11864:4;11857:11;;;;11440:436;;;;:::o;49940:1111::-;50018:4;48451:14;50043:6;:23;;50035:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;48348:15;50133:6;50110:20;50120:9;50110;:20::i;:::-;:29;;;;:::i;:::-;:41;;50102:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;50195:17;50238:3;48698:1;48628;48564;48765:24;;;;:::i;:::-;:41;;;;:::i;:::-;50216:6;:18;;;;:::i;:::-;50215:26;;;;:::i;:::-;50195:46;;50252:17;50281:9;50272:6;:18;;;;:::i;:::-;50252:38;;50303:18;48698:1;48628;48564;48765:24;;;;:::i;:::-;:41;;;;:::i;:::-;48564:1;50325:9;:20;;;;:::i;:::-;50324:34;;;;:::i;:::-;50303:55;;50369:23;48698:1;48628;48564;48765:24;;;;:::i;:::-;:41;;;;:::i;:::-;48628:1;50396:9;:25;;;;:::i;:::-;50395:39;;;;:::i;:::-;50369:65;;50445:24;50497:15;50484:10;50472:9;:22;;;;:::i;:::-;:40;;;;:::i;:::-;50445:67;;50631:1;50618:10;:14;50614:51;;;50634:31;50640:12;:10;:12::i;:::-;50654:10;50634:5;:31::i;:::-;50614:51;50702:1;50684:15;:19;:52;;;;;50734:1;50707:29;;:15;;;;;;;;;;;:29;;;;50684:52;50680:115;;;50738:57;50748:12;:10;:12::i;:::-;50762:15;;;;;;;;;;;50779;50738:9;:57::i;:::-;50680:115;50833:1;50814:16;:20;:54;;;;;50866:1;50838:30;;:16;;;;;;;;;;;:30;;;;50814:54;50810:119;;;50870:59;50880:12;:10;:12::i;:::-;50894:16;;;;;;;;;;;50912;50870:9;:59::i;:::-;50810:119;50960:1;50948:9;:13;50944:64;;;50963:45;50973:12;:10;:12::i;:::-;50987:9;50998;50963;:45::i;:::-;50944:64;51039:4;51032:11;;;;;;;49940:1111;;;;:::o;48902:31::-;;;;;;;;;;;;;:::o;48313:50::-;48348:15;48313:50;:::o;48865:30::-;;;;;;;;;;;;;:::o;45053:149::-;45137:18;45150:4;45137:12;:18::i;:::-;42241:16;42252:4;42241:10;:16::i;:::-;45168:26:::1;45180:4;45186:7;45168:11;:26::i;:::-;45053:149:::0;;;:::o;8743:151::-;8832:7;8859:11;:18;8871:5;8859:18;;;;;;;;;;;;;;;:27;8878:7;8859:27;;;;;;;;;;;;;;;;8852:34;;8743:151;;;;:::o;49640:254::-;48266:23;42241:16;42252:4;42241:10;:16::i;:::-;49754:1:::1;49734:22;;:8;:22;;::::0;49726:71:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49808:32;48266:23;49831:8;49808:10;:32::i;:::-;49851:35;48266:23;49875:10;49851:11;:35::i;:::-;49640:254:::0;;:::o;39555:157::-;39640:4;39679:25;39664:40;;;:11;:40;;;;39657:47;;39555:157;;;:::o;4452:98::-;4505:7;4532:10;4525:17;;4452:98;:::o;15467:380::-;15620:1;15603:19;;:5;:19;;;15595:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15701:1;15682:21;;:7;:21;;;15674:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15785:6;15755:11;:18;15767:5;15755:18;;;;;;;;;;;;;;;:27;15774:7;15755:27;;;;;;;;;;;;;;;:36;;;;15823:7;15807:32;;15816:5;15807:32;;;15832:6;15807:32;;;;;;:::i;:::-;;;;;;;;15467:380;;;:::o;16138:453::-;16273:24;16300:25;16310:5;16317:7;16300:9;:25::i;:::-;16273:52;;16360:17;16340:16;:37;16336:248;;16422:6;16402:16;:26;;16394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16506:51;16515:5;16522:7;16550:6;16531:16;:25;16506:8;:51::i;:::-;16336:248;16262:329;16138:453;;;:::o;12346:840::-;12493:1;12477:18;;:4;:18;;;12469:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12570:1;12556:16;;:2;:16;;;12548:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12625:38;12646:4;12652:2;12656:6;12625:20;:38::i;:::-;12676:19;12698:9;:15;12708:4;12698:15;;;;;;;;;;;;;;;;12676:37;;12747:6;12732:11;:21;;12724:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12864:6;12850:11;:20;12832:9;:15;12842:4;12832:15;;;;;;;;;;;;;;;:38;;;;13067:6;13050:9;:13;13060:2;13050:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;13117:2;13102:26;;13111:4;13102:26;;;13121:6;13102:26;;;;;;:::i;:::-;;;;;;;;13141:37;13161:4;13167:2;13171:6;13141:19;:37::i;:::-;12458:728;12346:840;;;:::o;43096:105::-;43163:30;43174:4;43180:12;:10;:12::i;:::-;43163:10;:30::i;:::-;43096:105;:::o;47354:238::-;47438:22;47446:4;47452:7;47438;:22::i;:::-;47433:152;;47509:4;47477:6;:12;47484:4;47477:12;;;;;;;;;;;:20;;:29;47498:7;47477:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;47560:12;:10;:12::i;:::-;47533:40;;47551:7;47533:40;;47545:4;47533:40;;;;;;;;;;47433:152;47354:238;;:::o;47772:239::-;47856:22;47864:4;47870:7;47856;:22::i;:::-;47852:152;;;47927:5;47895:6;:12;47902:4;47895:12;;;;;;;;;;;:20;;:29;47916:7;47895:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;47979:12;:10;:12::i;:::-;47952:40;;47970:7;47952:40;;47964:4;47952:40;;;;;;;;;;47852:152;47772:239;;:::o;14354:675::-;14457:1;14438:21;;:7;:21;;;14430:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14510:49;14531:7;14548:1;14552:6;14510:20;:49::i;:::-;14572:22;14597:9;:18;14607:7;14597:18;;;;;;;;;;;;;;;;14572:43;;14652:6;14634:14;:24;;14626:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14771:6;14754:14;:23;14733:9;:18;14743:7;14733:18;;;;;;;;;;;;;;;:44;;;;14888:6;14872:12;;:22;;;;;;;;;;;14949:1;14923:37;;14932:7;14923:37;;;14953:6;14923:37;;;;;;:::i;:::-;;;;;;;;14973:48;14993:7;15010:1;15014:6;14973:19;:48::i;:::-;14419:610;14354:675;;:::o;17191:125::-;;;;:::o;17920:124::-;;;;:::o;43491:492::-;43580:22;43588:4;43594:7;43580;:22::i;:::-;43575:401;;43768:28;43788:7;43768:19;:28::i;:::-;43869:38;43897:4;43889:13;;43904:2;43869:19;:38::i;:::-;43673:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43619:345;;;;;;;;;;;:::i;:::-;;;;;;;;43575:401;43491:492;;:::o;37509:151::-;37567:13;37600:52;37628:4;37612:22;;35664:2;37600:52;;:11;:52::i;:::-;37593:59;;37509:151;;;:::o;36905:447::-;36980:13;37006:19;37051:1;37042:6;37038:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;37028:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37006:47;;37064:15;:6;37071:1;37064:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;37090;:6;37097:1;37090:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;37121:9;37146:1;37137:6;37133:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;37121:26;;37116:131;37153:1;37149;:5;37116:131;;;37188:8;37205:3;37197:5;:11;37188:21;;;;;;;:::i;:::-;;;;;37176:6;37183:1;37176:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;37234:1;37224:11;;;;;37156:3;;;;:::i;:::-;;;37116:131;;;;37274:1;37265:5;:10;37257:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37337:6;37323:21;;;36905:447;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:118::-;4290:24;4308:5;4290:24;:::i;:::-;4285:3;4278:37;4203:118;;:::o;4327:222::-;4420:4;4458:2;4447:9;4443:18;4435:26;;4471:71;4539:1;4528:9;4524:17;4515:6;4471:71;:::i;:::-;4327:222;;;;:::o;4555:619::-;4632:6;4640;4648;4697:2;4685:9;4676:7;4672:23;4668:32;4665:119;;;4703:79;;:::i;:::-;4665:119;4823:1;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4794:117;4950:2;4976:53;5021:7;5012:6;5001:9;4997:22;4976:53;:::i;:::-;4966:63;;4921:118;5078:2;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;:::i;:::-;5094:63;;5049:118;4555:619;;;;;:::o;5180:77::-;5217:7;5246:5;5235:16;;5180:77;;;:::o;5263:122::-;5336:24;5354:5;5336:24;:::i;:::-;5329:5;5326:35;5316:63;;5375:1;5372;5365:12;5316:63;5263:122;:::o;5391:139::-;5437:5;5475:6;5462:20;5453:29;;5491:33;5518:5;5491:33;:::i;:::-;5391:139;;;;:::o;5536:329::-;5595:6;5644:2;5632:9;5623:7;5619:23;5615:32;5612:119;;;5650:79;;:::i;:::-;5612:119;5770:1;5795:53;5840:7;5831:6;5820:9;5816:22;5795:53;:::i;:::-;5785:63;;5741:117;5536:329;;;;:::o;5871:118::-;5958:24;5976:5;5958:24;:::i;:::-;5953:3;5946:37;5871:118;;:::o;5995:222::-;6088:4;6126:2;6115:9;6111:18;6103:26;;6139:71;6207:1;6196:9;6192:17;6183:6;6139:71;:::i;:::-;5995:222;;;;:::o;6223:474::-;6291:6;6299;6348:2;6336:9;6327:7;6323:23;6319:32;6316:119;;;6354:79;;:::i;:::-;6316:119;6474:1;6499:53;6544:7;6535:6;6524:9;6520:22;6499:53;:::i;:::-;6489:63;;6445:117;6601:2;6627:53;6672:7;6663:6;6652:9;6648:22;6627:53;:::i;:::-;6617:63;;6572:118;6223:474;;;;;:::o;6703:86::-;6738:7;6778:4;6771:5;6767:16;6756:27;;6703:86;;;:::o;6795:112::-;6878:22;6894:5;6878:22;:::i;:::-;6873:3;6866:35;6795:112;;:::o;6913:214::-;7002:4;7040:2;7029:9;7025:18;7017:26;;7053:67;7117:1;7106:9;7102:17;7093:6;7053:67;:::i;:::-;6913:214;;;;:::o;7133:329::-;7192:6;7241:2;7229:9;7220:7;7216:23;7212:32;7209:119;;;7247:79;;:::i;:::-;7209:119;7367:1;7392:53;7437:7;7428:6;7417:9;7413:22;7392:53;:::i;:::-;7382:63;;7338:117;7133:329;;;;:::o;7468:::-;7527:6;7576:2;7564:9;7555:7;7551:23;7547:32;7544:119;;;7582:79;;:::i;:::-;7544:119;7702:1;7727:53;7772:7;7763:6;7752:9;7748:22;7727:53;:::i;:::-;7717:63;;7673:117;7468:329;;;;:::o;7803:474::-;7871:6;7879;7928:2;7916:9;7907:7;7903:23;7899:32;7896:119;;;7934:79;;:::i;:::-;7896:119;8054:1;8079:53;8124:7;8115:6;8104:9;8100:22;8079:53;:::i;:::-;8069:63;;8025:117;8181:2;8207:53;8252:7;8243:6;8232:9;8228:22;8207:53;:::i;:::-;8197:63;;8152:118;7803:474;;;;;:::o;8283:118::-;8370:24;8388:5;8370:24;:::i;:::-;8365:3;8358:37;8283:118;;:::o;8407:222::-;8500:4;8538:2;8527:9;8523:18;8515:26;;8551:71;8619:1;8608:9;8604:17;8595:6;8551:71;:::i;:::-;8407:222;;;;:::o;8635:180::-;8683:77;8680:1;8673:88;8780:4;8777:1;8770:15;8804:4;8801:1;8794:15;8821:320;8865:6;8902:1;8896:4;8892:12;8882:22;;8949:1;8943:4;8939:12;8970:18;8960:81;;9026:4;9018:6;9014:17;9004:27;;8960:81;9088:2;9080:6;9077:14;9057:18;9054:38;9051:84;;9107:18;;:::i;:::-;9051:84;8872:269;8821:320;;;:::o;9147:234::-;9287:34;9283:1;9275:6;9271:14;9264:58;9356:17;9351:2;9343:6;9339:15;9332:42;9147:234;:::o;9387:366::-;9529:3;9550:67;9614:2;9609:3;9550:67;:::i;:::-;9543:74;;9626:93;9715:3;9626:93;:::i;:::-;9744:2;9739:3;9735:12;9728:19;;9387:366;;;:::o;9759:419::-;9925:4;9963:2;9952:9;9948:18;9940:26;;10012:9;10006:4;10002:20;9998:1;9987:9;9983:17;9976:47;10040:131;10166:4;10040:131;:::i;:::-;10032:139;;9759:419;;;:::o;10184:180::-;10232:77;10229:1;10222:88;10329:4;10326:1;10319:15;10353:4;10350:1;10343:15;10370:191;10410:3;10429:20;10447:1;10429:20;:::i;:::-;10424:25;;10463:20;10481:1;10463:20;:::i;:::-;10458:25;;10506:1;10503;10499:9;10492:16;;10527:3;10524:1;10521:10;10518:36;;;10534:18;;:::i;:::-;10518:36;10370:191;;;;:::o;10567:224::-;10707:34;10703:1;10695:6;10691:14;10684:58;10776:7;10771:2;10763:6;10759:15;10752:32;10567:224;:::o;10797:366::-;10939:3;10960:67;11024:2;11019:3;10960:67;:::i;:::-;10953:74;;11036:93;11125:3;11036:93;:::i;:::-;11154:2;11149:3;11145:12;11138:19;;10797:366;;;:::o;11169:419::-;11335:4;11373:2;11362:9;11358:18;11350:26;;11422:9;11416:4;11412:20;11408:1;11397:9;11393:17;11386:47;11450:131;11576:4;11450:131;:::i;:::-;11442:139;;11169:419;;;:::o;11594:170::-;11734:22;11730:1;11722:6;11718:14;11711:46;11594:170;:::o;11770:366::-;11912:3;11933:67;11997:2;11992:3;11933:67;:::i;:::-;11926:74;;12009:93;12098:3;12009:93;:::i;:::-;12127:2;12122:3;12118:12;12111:19;;11770:366;;;:::o;12142:419::-;12308:4;12346:2;12335:9;12331:18;12323:26;;12395:9;12389:4;12385:20;12381:1;12370:9;12366:17;12359:47;12423:131;12549:4;12423:131;:::i;:::-;12415:139;;12142:419;;;:::o;12567:176::-;12707:28;12703:1;12695:6;12691:14;12684:52;12567:176;:::o;12749:366::-;12891:3;12912:67;12976:2;12971:3;12912:67;:::i;:::-;12905:74;;12988:93;13077:3;12988:93;:::i;:::-;13106:2;13101:3;13097:12;13090:19;;12749:366;;;:::o;13121:419::-;13287:4;13325:2;13314:9;13310:18;13302:26;;13374:9;13368:4;13364:20;13360:1;13349:9;13345:17;13338:47;13402:131;13528:4;13402:131;:::i;:::-;13394:139;;13121:419;;;:::o;13546:410::-;13586:7;13609:20;13627:1;13609:20;:::i;:::-;13604:25;;13643:20;13661:1;13643:20;:::i;:::-;13638:25;;13698:1;13695;13691:9;13720:30;13738:11;13720:30;:::i;:::-;13709:41;;13899:1;13890:7;13886:15;13883:1;13880:22;13860:1;13853:9;13833:83;13810:139;;13929:18;;:::i;:::-;13810:139;13594:362;13546:410;;;;:::o;13962:180::-;14010:77;14007:1;14000:88;14107:4;14104:1;14097:15;14131:4;14128:1;14121:15;14148:185;14188:1;14205:20;14223:1;14205:20;:::i;:::-;14200:25;;14239:20;14257:1;14239:20;:::i;:::-;14234:25;;14278:1;14268:35;;14283:18;;:::i;:::-;14268:35;14325:1;14322;14318:9;14313:14;;14148:185;;;;:::o;14339:194::-;14379:4;14399:20;14417:1;14399:20;:::i;:::-;14394:25;;14433:20;14451:1;14433:20;:::i;:::-;14428:25;;14477:1;14474;14470:9;14462:17;;14501:1;14495:4;14492:11;14489:37;;;14506:18;;:::i;:::-;14489:37;14339:194;;;;:::o;14539:223::-;14679:34;14675:1;14667:6;14663:14;14656:58;14748:6;14743:2;14735:6;14731:15;14724:31;14539:223;:::o;14768:366::-;14910:3;14931:67;14995:2;14990:3;14931:67;:::i;:::-;14924:74;;15007:93;15096:3;15007:93;:::i;:::-;15125:2;15120:3;15116:12;15109:19;;14768:366;;;:::o;15140:419::-;15306:4;15344:2;15333:9;15329:18;15321:26;;15393:9;15387:4;15383:20;15379:1;15368:9;15364:17;15357:47;15421:131;15547:4;15421:131;:::i;:::-;15413:139;;15140:419;;;:::o;15565:223::-;15705:34;15701:1;15693:6;15689:14;15682:58;15774:6;15769:2;15761:6;15757:15;15750:31;15565:223;:::o;15794:366::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15794:366;;;:::o;16166:419::-;16332:4;16370:2;16359:9;16355:18;16347:26;;16419:9;16413:4;16409:20;16405:1;16394:9;16390:17;16383:47;16447:131;16573:4;16447:131;:::i;:::-;16439:139;;16166:419;;;:::o;16591:221::-;16731:34;16727:1;16719:6;16715:14;16708:58;16800:4;16795:2;16787:6;16783:15;16776:29;16591:221;:::o;16818:366::-;16960:3;16981:67;17045:2;17040:3;16981:67;:::i;:::-;16974:74;;17057:93;17146:3;17057:93;:::i;:::-;17175:2;17170:3;17166:12;17159:19;;16818:366;;;:::o;17190:419::-;17356:4;17394:2;17383:9;17379:18;17371:26;;17443:9;17437:4;17433:20;17429:1;17418:9;17414:17;17407:47;17471:131;17597:4;17471:131;:::i;:::-;17463:139;;17190:419;;;:::o;17615:179::-;17755:31;17751:1;17743:6;17739:14;17732:55;17615:179;:::o;17800:366::-;17942:3;17963:67;18027:2;18022:3;17963:67;:::i;:::-;17956:74;;18039:93;18128:3;18039:93;:::i;:::-;18157:2;18152:3;18148:12;18141:19;;17800:366;;;:::o;18172:419::-;18338:4;18376:2;18365:9;18361:18;18353:26;;18425:9;18419:4;18415:20;18411:1;18400:9;18396:17;18389:47;18453:131;18579:4;18453:131;:::i;:::-;18445:139;;18172:419;;;:::o;18597:224::-;18737:34;18733:1;18725:6;18721:14;18714:58;18806:7;18801:2;18793:6;18789:15;18782:32;18597:224;:::o;18827:366::-;18969:3;18990:67;19054:2;19049:3;18990:67;:::i;:::-;18983:74;;19066:93;19155:3;19066:93;:::i;:::-;19184:2;19179:3;19175:12;19168:19;;18827:366;;;:::o;19199:419::-;19365:4;19403:2;19392:9;19388:18;19380:26;;19452:9;19446:4;19442:20;19438:1;19427:9;19423:17;19416:47;19480:131;19606:4;19480:131;:::i;:::-;19472:139;;19199:419;;;:::o;19624:222::-;19764:34;19760:1;19752:6;19748:14;19741:58;19833:5;19828:2;19820:6;19816:15;19809:30;19624:222;:::o;19852:366::-;19994:3;20015:67;20079:2;20074:3;20015:67;:::i;:::-;20008:74;;20091:93;20180:3;20091:93;:::i;:::-;20209:2;20204:3;20200:12;20193:19;;19852:366;;;:::o;20224:419::-;20390:4;20428:2;20417:9;20413:18;20405:26;;20477:9;20471:4;20467:20;20463:1;20452:9;20448:17;20441:47;20505:131;20631:4;20505:131;:::i;:::-;20497:139;;20224:419;;;:::o;20649:225::-;20789:34;20785:1;20777:6;20773:14;20766:58;20858:8;20853:2;20845:6;20841:15;20834:33;20649:225;:::o;20880:366::-;21022:3;21043:67;21107:2;21102:3;21043:67;:::i;:::-;21036:74;;21119:93;21208:3;21119:93;:::i;:::-;21237:2;21232:3;21228:12;21221:19;;20880:366;;;:::o;21252:419::-;21418:4;21456:2;21445:9;21441:18;21433:26;;21505:9;21499:4;21495:20;21491:1;21480:9;21476:17;21469:47;21533:131;21659:4;21533:131;:::i;:::-;21525:139;;21252:419;;;:::o;21677:220::-;21817:34;21813:1;21805:6;21801:14;21794:58;21886:3;21881:2;21873:6;21869:15;21862:28;21677:220;:::o;21903:366::-;22045:3;22066:67;22130:2;22125:3;22066:67;:::i;:::-;22059:74;;22142:93;22231:3;22142:93;:::i;:::-;22260:2;22255:3;22251:12;22244:19;;21903:366;;;:::o;22275:419::-;22441:4;22479:2;22468:9;22464:18;22456:26;;22528:9;22522:4;22518:20;22514:1;22503:9;22499:17;22492:47;22556:131;22682:4;22556:131;:::i;:::-;22548:139;;22275:419;;;:::o;22700:221::-;22840:34;22836:1;22828:6;22824:14;22817:58;22909:4;22904:2;22896:6;22892:15;22885:29;22700:221;:::o;22927:366::-;23069:3;23090:67;23154:2;23149:3;23090:67;:::i;:::-;23083:74;;23166:93;23255:3;23166:93;:::i;:::-;23284:2;23279:3;23275:12;23268:19;;22927:366;;;:::o;23299:419::-;23465:4;23503:2;23492:9;23488:18;23480:26;;23552:9;23546:4;23542:20;23538:1;23527:9;23523:17;23516:47;23580:131;23706:4;23580:131;:::i;:::-;23572:139;;23299:419;;;:::o;23724:148::-;23826:11;23863:3;23848:18;;23724:148;;;;:::o;23878:173::-;24018:25;24014:1;24006:6;24002:14;23995:49;23878:173;:::o;24057:402::-;24217:3;24238:85;24320:2;24315:3;24238:85;:::i;:::-;24231:92;;24332:93;24421:3;24332:93;:::i;:::-;24450:2;24445:3;24441:12;24434:19;;24057:402;;;:::o;24465:390::-;24571:3;24599:39;24632:5;24599:39;:::i;:::-;24654:89;24736:6;24731:3;24654:89;:::i;:::-;24647:96;;24752:65;24810:6;24805:3;24798:4;24791:5;24787:16;24752:65;:::i;:::-;24842:6;24837:3;24833:16;24826:23;;24575:280;24465:390;;;;:::o;24861:167::-;25001:19;24997:1;24989:6;24985:14;24978:43;24861:167;:::o;25034:402::-;25194:3;25215:85;25297:2;25292:3;25215:85;:::i;:::-;25208:92;;25309:93;25398:3;25309:93;:::i;:::-;25427:2;25422:3;25418:12;25411:19;;25034:402;;;:::o;25442:967::-;25824:3;25846:148;25990:3;25846:148;:::i;:::-;25839:155;;26011:95;26102:3;26093:6;26011:95;:::i;:::-;26004:102;;26123:148;26267:3;26123:148;:::i;:::-;26116:155;;26288:95;26379:3;26370:6;26288:95;:::i;:::-;26281:102;;26400:3;26393:10;;25442:967;;;;;:::o;26415:180::-;26463:77;26460:1;26453:88;26560:4;26557:1;26550:15;26584:4;26581:1;26574:15;26601:180;26649:77;26646:1;26639:88;26746:4;26743:1;26736:15;26770:4;26767:1;26760:15;26787:171;26826:3;26849:24;26867:5;26849:24;:::i;:::-;26840:33;;26895:4;26888:5;26885:15;26882:41;;26903:18;;:::i;:::-;26882:41;26950:1;26943:5;26939:13;26932:20;;26787:171;;;:::o;26964:182::-;27104:34;27100:1;27092:6;27088:14;27081:58;26964:182;:::o;27152:366::-;27294:3;27315:67;27379:2;27374:3;27315:67;:::i;:::-;27308:74;;27391:93;27480:3;27391:93;:::i;:::-;27509:2;27504:3;27500:12;27493:19;;27152:366;;;:::o;27524:419::-;27690:4;27728:2;27717:9;27713:18;27705:26;;27777:9;27771:4;27767:20;27763:1;27752:9;27748:17;27741:47;27805:131;27931:4;27805:131;:::i;:::-;27797:139;;27524:419;;;:::o
Swarm Source
ipfs://6b09b7f1f262f523ce51c93353c138016904d054853fcad37c6070fbf4577924
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.