ERC-20
Gaming
Overview
Max Total Supply
250,000,000 MAVIA
Holders
36,007 ( 0.042%)
Market
Price
$2.13 @ 0.000589 ETH (+6.26%)
Onchain Market Cap
$532,500,000.00
Circulating Supply Market Cap
$67,209,645.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MaviaToken
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)Audit Report
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; contract MaviaToken is ERC20, AccessControl { using SafeERC20 for IERC20; uint256 private constant _MAX_UINT = type(uint256).max; bytes32 private constant _EDITOR_ROLE = keccak256("_EDITOR_ROLE"); bytes32 private constant _EMERGENCY_ROLE = keccak256("_EMERGENCY_ROLE"); bytes32 private _DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 private constant _PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; mapping(address => bool) public blacklist; mapping(address => bool) public whitelist; uint256 public tfStartTime; uint256 public tfMaxAmount; event ESetBlacklist(address indexed _pAddr, bool _pIsBlacklist); event ESetWhitelist(address indexed _pAddr, bool _pIsWhitelist); event ESetGateway(address indexed _pAddr, bool _pIsGateway); event ESetTradeTime(uint256 _pStartTime, uint256 _pMaxAmount); event EEmerERC20Tokens(IERC20 indexed _pToken, address _pTo); constructor() ERC20("Heroes of Mavia", "MAVIA") { _DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes("TokenPermit")), keccak256(bytes("1")), block.chainid, address(this) ) ); address sender_ = _msgSender(); _setupRole(DEFAULT_ADMIN_ROLE, sender_); _setupRole(_EDITOR_ROLE, sender_); tfMaxAmount = _MAX_UINT; _mint(sender_, 250_000_000 * 1e18); } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, "Sig: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", _DOMAIN_SEPARATOR, keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Sig: INVALID_SIGNATURE"); _approve(owner, spender, value); } /** * @dev Allow burn */ function fBurn(uint256 _pAmount) external { _burn(_msgSender(), _pAmount); } function fSetBlacklist(address _pAddr, bool _pIsBlacklist) external onlyRole(_EDITOR_ROLE) { require(_pAddr != address(0), "Invalid address"); blacklist[_pAddr] = _pIsBlacklist; emit ESetBlacklist(_pAddr, _pIsBlacklist); } function fSetWhitelist(address _pAddr, bool _pIsWhitelist) external onlyRole(_EDITOR_ROLE) { require(_pAddr != address(0), "Invalid address"); whitelist[_pAddr] = _pIsWhitelist; emit ESetWhitelist(_pAddr, _pIsWhitelist); } function fSetTradeTime(uint256 _pStartTime, uint256 _pMaxAmount) external onlyRole(_EDITOR_ROLE) { tfStartTime = _pStartTime; tfMaxAmount = _pMaxAmount; emit ESetTradeTime(_pStartTime, _pMaxAmount); } function fEmerERC20Tokens(IERC20 _pToken, address _pTo) external onlyRole(_EMERGENCY_ROLE) { require(_pTo != address(0), "Invalid address"); uint256 bal_ = _pToken.balanceOf(address(this)); _pToken.safeTransfer(_pTo, bal_); emit EEmerERC20Tokens(_pToken, _pTo); } /** * @dev Override ERC20 transfer the tokens */ function _transfer(address _pSender, address _pRecipient, uint256 _pAmount) internal override { require(!blacklist[_pSender] && !blacklist[_pRecipient], "Blacklist"); if (!whitelist[_pSender] && !whitelist[_pRecipient]) { require(block.timestamp >= tfStartTime, "Invalid time"); require(_pAmount <= tfMaxAmount, "Invalid amount"); } super._transfer(_pSender, _pRecipient, _pAmount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @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, _msgSender()); _; } /** * @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 override returns (bool) { return _roles[role].members[account]; } /** * @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 { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " 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 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. */ 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. */ 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 granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ 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. * * [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}. * ==== */ 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); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT 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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT 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); }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- QuantStamp- Nov 2nd, 2023 - Security Audit Report
[{"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":"contract IERC20","name":"_pToken","type":"address"},{"indexed":false,"internalType":"address","name":"_pTo","type":"address"}],"name":"EEmerERC20Tokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pAddr","type":"address"},{"indexed":false,"internalType":"bool","name":"_pIsBlacklist","type":"bool"}],"name":"ESetBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pAddr","type":"address"},{"indexed":false,"internalType":"bool","name":"_pIsGateway","type":"bool"}],"name":"ESetGateway","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pMaxAmount","type":"uint256"}],"name":"ESetTradeTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pAddr","type":"address"},{"indexed":false,"internalType":"bool","name":"_pIsWhitelist","type":"bool"}],"name":"ESetWhitelist","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pAmount","type":"uint256"}],"name":"fBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_pToken","type":"address"},{"internalType":"address","name":"_pTo","type":"address"}],"name":"fEmerERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pAddr","type":"address"},{"internalType":"bool","name":"_pIsBlacklist","type":"bool"}],"name":"fSetBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pStartTime","type":"uint256"},{"internalType":"uint256","name":"_pMaxAmount","type":"uint256"}],"name":"fSetTradeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pAddr","type":"address"},{"internalType":"bool","name":"_pIsWhitelist","type":"bool"}],"name":"fSetWhitelist","outputs":[],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"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":"tfMaxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tfStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600f81526e4865726f6573206f66204d6176696160881b6020808301918252835180850190945260058452644d4156494160d81b90840152815191929162000066916003916200034b565b5080516200007c9060049060208401906200034b565b5050604080518082018252600b81526a151bdad95b94195c9b5a5d60aa1b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f4abde5b2ea785d81ec79c6d8b564409eb909a97831394064a50249bce2cb7779818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012060065550336200015f600082620001af565b6200018b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a82620001af565b600019600b55620001a8816acecb8f27f4200f3a000000620001bf565b5062000453565b620001bb8282620002a7565b5050565b6001600160a01b0382166200021a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200022e9190620003f1565b90915550506001600160a01b038216600090815260208190526040812080548392906200025d908490620003f1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff16620001bb5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003073390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620003599062000416565b90600052602060002090601f0160209004810192826200037d5760008555620003c8565b82601f106200039857805160ff1916838001178555620003c8565b82800160010185558215620003c8579182015b82811115620003c8578251825591602001919060010190620003ab565b50620003d6929150620003da565b5090565b5b80821115620003d65760008155600101620003db565b600082198211156200041157634e487b7160e01b81526011600452602481fd5b500190565b600181811c908216806200042b57607f821691505b602082108114156200044d57634e487b7160e01b600052602260045260246000fd5b50919050565b611cb680620004636000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a457c2d7116100a2578063d547741f11610071578063d547741f146103e0578063dd62ed3e146103f3578063e60f986a1461042c578063f9f92be41461043f57600080fd5b8063a457c2d714610394578063a9059cbb146103a7578063add0ca68146103ba578063d505accf146103cd57600080fd5b80639304afa2116100de5780639304afa21461034e57806395d89b41146103615780639b19251a14610369578063a217fddf1461038c57600080fd5b806370a08231146102f25780637ecebe001461031b57806391d148541461033b57600080fd5b8063248a9ca311610171578063313ce5671161014b578063313ce567146102b457806336568abe146102c357806339509351146102d657806339c49021146102e957600080fd5b8063248a9ca31461026b5780632ba78b3d1461028e5780632f2ff15d146102a157600080fd5b8063095ea7b3116101ad578063095ea7b31461022857806318160ddd1461023b57806323b872dd14610243578063241de63d1461025657600080fd5b806301ffc9a7146101d457806306fdde03146101fc57806307f1775414610211575b600080fd5b6101e76101e2366004611a00565b610462565b60405190151581526020015b60405180910390f35b610204610499565b6040516101f39190611b04565b61021a600a5481565b6040519081526020016101f3565b6101e761023636600461197d565b61052b565b60025461021a565b6101e761025136600461189b565b610541565b610269610264366004611950565b6105f2565b005b61021a6102793660046119c4565b60009081526005602052604090206001015490565b61026961029c3660046119c4565b6106a4565b6102696102af3660046119dc565b6106b1565b604051601281526020016101f3565b6102696102d13660046119dc565b6106dc565b6101e76102e436600461197d565b61075a565b61021a600b5481565b61021a610300366004611847565b6001600160a01b031660009081526020819052604090205490565b61021a610329366004611847565b60076020526000908152604090205481565b6101e76103493660046119dc565b610796565b61026961035c366004611a28565b6107c1565b6102046108e8565b6101e7610377366004611847565b60096020526000908152604090205460ff1681565b61021a600081565b6101e76103a236600461197d565b6108f7565b6101e76103b536600461197d565b610990565b6102696103c8366004611950565b61099d565b6102696103db3660046118db565b610a46565b6102696103ee3660046119dc565b610c4d565b61021a610401366004611863565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61026961043a366004611a52565b610c73565b6101e761044d366004611847565b60086020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b148061049357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546104a890611bf1565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611bf1565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000610538338484610ce6565b50600192915050565b600061054e848484610e0a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105e58533858403610ce6565b60019150505b9392505050565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a61061d8133610f5a565b6001600160a01b0383166106435760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260096020908152604091829020805460ff191686151590811790915591519182527f0f035a7b5cd3a16de7240c055ea99af74f036ef6d31b11ea37b09ecf3e774c4691015b60405180910390a2505050565b6106ae3382610fbe565b50565b6000828152600560205260409020600101546106cd8133610f5a565b6106d7838361110c565b505050565b6001600160a01b038116331461074c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105cf565b6107568282611192565b5050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610538918590610791908690611b60565b610ce6565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7fb5a0ffc9809f97c825e7243be790ff035be8fe1a72461bc6e6ee1ca67a1f0c5a6107ec8133610f5a565b6001600160a01b0382166108125760405162461bcd60e51b81526004016105cf90611b37565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561085457600080fd5b505afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611a3a565b90506108a26001600160a01b03851684836111f9565b6040516001600160a01b0384811682528516907f54d6637aad2d8e0df02e1bb1766a3f825001fd55a99aa3931af98976b17a50559060200160405180910390a250505050565b6060600480546104a890611bf1565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156109795760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105cf565b6109863385858403610ce6565b5060019392505050565b6000610538338484610e0a565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a6109c88133610f5a565b6001600160a01b0383166109ee5760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260086020908152604091829020805460ff191686151590811790915591519182527f8e76ce3f1e0d4c9bc4c14b49a3a5d306b7a43a638508252f978f2b3df239e6e89101610697565b42841015610a855760405162461bcd60e51b815260206004820152600c60248201526b14da59ce881156141254915160a21b60448201526064016105cf565b6006546001600160a01b038816600090815260076020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610ad883611c2c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610b5192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610bbc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610bf25750886001600160a01b0316816001600160a01b0316145b610c375760405162461bcd60e51b81526020600482015260166024820152755369673a20494e56414c49445f5349474e415455524560501b60448201526064016105cf565b610c42898989610ce6565b505050505050505050565b600082815260056020526040902060010154610c698133610f5a565b6106d78383611192565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a610c9e8133610f5a565b600a839055600b82905560408051848152602081018490527f98ff187f6974d16460c5c90348f25bc6fa0b91e3d21a0b5ec4562c50d1eb9ec1910160405180910390a1505050565b6001600160a01b038316610d485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105cf565b6001600160a01b038216610da95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105cf565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604090205460ff16158015610e4c57506001600160a01b03821660009081526008602052604090205460ff16155b610e845760405162461bcd60e51b8152602060048201526009602482015268109b1858dadb1a5cdd60ba1b60448201526064016105cf565b6001600160a01b03831660009081526009602052604090205460ff16158015610ec657506001600160a01b03821660009081526009602052604090205460ff16155b15610f4f57600a54421015610f0c5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b60448201526064016105cf565b600b54811115610f4f5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016105cf565b6106d783838361124b565b610f648282610796565b61075657610f7c816001600160a01b0316601461141b565b610f8783602061141b565b604051602001610f98929190611a8f565b60408051601f198184030181529082905262461bcd60e51b82526105cf91600401611b04565b6001600160a01b03821661101e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105cf565b6001600160a01b038216600090815260208190526040902054818110156110925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105cf565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110c1908490611b97565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6111168282610796565b6107565760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561114e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61119c8282610796565b156107565760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526106d79084906115fd565b6001600160a01b0383166112af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105cf565b6001600160a01b0382166113115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105cf565b6001600160a01b038316600090815260208190526040902054818110156113895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105cf565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113c0908490611b60565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140c91815260200190565b60405180910390a35b50505050565b6060600061142a836002611b78565b611435906002611b60565b67ffffffffffffffff81111561145b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611485576020820181803683370190505b509050600360fc1b816000815181106114ae57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106114eb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061150f846002611b78565b61151a906001611b60565b90505b60018111156115ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061155c57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061158057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936115a781611bda565b905061151d565b5083156105eb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105cf565b6000611652826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116cf9092919063ffffffff16565b8051909150156106d7578080602001905181019061167091906119a8565b6106d75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105cf565b60606116de84846000856116e6565b949350505050565b6060824710156117475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105cf565b843b6117955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105cf565b600080866001600160a01b031685876040516117b19190611a73565b60006040518083038185875af1925050503d80600081146117ee576040519150601f19603f3d011682016040523d82523d6000602084013e6117f3565b606091505b509150915061180382828661180e565b979650505050505050565b6060831561181d5750816105eb565b82511561182d5782518084602001fd5b8160405162461bcd60e51b81526004016105cf9190611b04565b600060208284031215611858578081fd5b81356105eb81611c5d565b60008060408385031215611875578081fd5b823561188081611c5d565b9150602083013561189081611c5d565b809150509250929050565b6000806000606084860312156118af578081fd5b83356118ba81611c5d565b925060208401356118ca81611c5d565b929592945050506040919091013590565b600080600080600080600060e0888a0312156118f5578283fd5b873561190081611c5d565b9650602088013561191081611c5d565b95506040880135945060608801359350608088013560ff81168114611933578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611962578182fd5b823561196d81611c5d565b9150602083013561189081611c72565b6000806040838503121561198f578182fd5b823561199a81611c5d565b946020939093013593505050565b6000602082840312156119b9578081fd5b81516105eb81611c72565b6000602082840312156119d5578081fd5b5035919050565b600080604083850312156119ee578182fd5b82359150602083013561189081611c5d565b600060208284031215611a11578081fd5b81356001600160e01b0319811681146105eb578182fd5b60008060408385031215611875578182fd5b600060208284031215611a4b578081fd5b5051919050565b60008060408385031215611a64578182fd5b50508035926020909101359150565b60008251611a85818460208701611bae565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611ac7816017850160208801611bae565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611af8816028840160208801611bae565b01602801949350505050565b6020815260008251806020840152611b23816040850160208701611bae565b601f01601f19169190910160400192915050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60008219821115611b7357611b73611c47565b500190565b6000816000190483118215151615611b9257611b92611c47565b500290565b600082821015611ba957611ba9611c47565b500390565b60005b83811015611bc9578181015183820152602001611bb1565b838111156114155750506000910152565b600081611be957611be9611c47565b506000190190565b600181811c90821680611c0557607f821691505b60208210811415611c2657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611c4057611c40611c47565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146106ae57600080fd5b80151581146106ae57600080fdfea2646970667358221220b81f5f66199a978a5263cd544185a0eded3d13477bbec614d8ac3c047ca0bb0664736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a457c2d7116100a2578063d547741f11610071578063d547741f146103e0578063dd62ed3e146103f3578063e60f986a1461042c578063f9f92be41461043f57600080fd5b8063a457c2d714610394578063a9059cbb146103a7578063add0ca68146103ba578063d505accf146103cd57600080fd5b80639304afa2116100de5780639304afa21461034e57806395d89b41146103615780639b19251a14610369578063a217fddf1461038c57600080fd5b806370a08231146102f25780637ecebe001461031b57806391d148541461033b57600080fd5b8063248a9ca311610171578063313ce5671161014b578063313ce567146102b457806336568abe146102c357806339509351146102d657806339c49021146102e957600080fd5b8063248a9ca31461026b5780632ba78b3d1461028e5780632f2ff15d146102a157600080fd5b8063095ea7b3116101ad578063095ea7b31461022857806318160ddd1461023b57806323b872dd14610243578063241de63d1461025657600080fd5b806301ffc9a7146101d457806306fdde03146101fc57806307f1775414610211575b600080fd5b6101e76101e2366004611a00565b610462565b60405190151581526020015b60405180910390f35b610204610499565b6040516101f39190611b04565b61021a600a5481565b6040519081526020016101f3565b6101e761023636600461197d565b61052b565b60025461021a565b6101e761025136600461189b565b610541565b610269610264366004611950565b6105f2565b005b61021a6102793660046119c4565b60009081526005602052604090206001015490565b61026961029c3660046119c4565b6106a4565b6102696102af3660046119dc565b6106b1565b604051601281526020016101f3565b6102696102d13660046119dc565b6106dc565b6101e76102e436600461197d565b61075a565b61021a600b5481565b61021a610300366004611847565b6001600160a01b031660009081526020819052604090205490565b61021a610329366004611847565b60076020526000908152604090205481565b6101e76103493660046119dc565b610796565b61026961035c366004611a28565b6107c1565b6102046108e8565b6101e7610377366004611847565b60096020526000908152604090205460ff1681565b61021a600081565b6101e76103a236600461197d565b6108f7565b6101e76103b536600461197d565b610990565b6102696103c8366004611950565b61099d565b6102696103db3660046118db565b610a46565b6102696103ee3660046119dc565b610c4d565b61021a610401366004611863565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61026961043a366004611a52565b610c73565b6101e761044d366004611847565b60086020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b148061049357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546104a890611bf1565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611bf1565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000610538338484610ce6565b50600192915050565b600061054e848484610e0a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105e58533858403610ce6565b60019150505b9392505050565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a61061d8133610f5a565b6001600160a01b0383166106435760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260096020908152604091829020805460ff191686151590811790915591519182527f0f035a7b5cd3a16de7240c055ea99af74f036ef6d31b11ea37b09ecf3e774c4691015b60405180910390a2505050565b6106ae3382610fbe565b50565b6000828152600560205260409020600101546106cd8133610f5a565b6106d7838361110c565b505050565b6001600160a01b038116331461074c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105cf565b6107568282611192565b5050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610538918590610791908690611b60565b610ce6565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7fb5a0ffc9809f97c825e7243be790ff035be8fe1a72461bc6e6ee1ca67a1f0c5a6107ec8133610f5a565b6001600160a01b0382166108125760405162461bcd60e51b81526004016105cf90611b37565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561085457600080fd5b505afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611a3a565b90506108a26001600160a01b03851684836111f9565b6040516001600160a01b0384811682528516907f54d6637aad2d8e0df02e1bb1766a3f825001fd55a99aa3931af98976b17a50559060200160405180910390a250505050565b6060600480546104a890611bf1565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156109795760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105cf565b6109863385858403610ce6565b5060019392505050565b6000610538338484610e0a565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a6109c88133610f5a565b6001600160a01b0383166109ee5760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260086020908152604091829020805460ff191686151590811790915591519182527f8e76ce3f1e0d4c9bc4c14b49a3a5d306b7a43a638508252f978f2b3df239e6e89101610697565b42841015610a855760405162461bcd60e51b815260206004820152600c60248201526b14da59ce881156141254915160a21b60448201526064016105cf565b6006546001600160a01b038816600090815260076020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610ad883611c2c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610b5192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610bbc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610bf25750886001600160a01b0316816001600160a01b0316145b610c375760405162461bcd60e51b81526020600482015260166024820152755369673a20494e56414c49445f5349474e415455524560501b60448201526064016105cf565b610c42898989610ce6565b505050505050505050565b600082815260056020526040902060010154610c698133610f5a565b6106d78383611192565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a610c9e8133610f5a565b600a839055600b82905560408051848152602081018490527f98ff187f6974d16460c5c90348f25bc6fa0b91e3d21a0b5ec4562c50d1eb9ec1910160405180910390a1505050565b6001600160a01b038316610d485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105cf565b6001600160a01b038216610da95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105cf565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604090205460ff16158015610e4c57506001600160a01b03821660009081526008602052604090205460ff16155b610e845760405162461bcd60e51b8152602060048201526009602482015268109b1858dadb1a5cdd60ba1b60448201526064016105cf565b6001600160a01b03831660009081526009602052604090205460ff16158015610ec657506001600160a01b03821660009081526009602052604090205460ff16155b15610f4f57600a54421015610f0c5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b60448201526064016105cf565b600b54811115610f4f5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016105cf565b6106d783838361124b565b610f648282610796565b61075657610f7c816001600160a01b0316601461141b565b610f8783602061141b565b604051602001610f98929190611a8f565b60408051601f198184030181529082905262461bcd60e51b82526105cf91600401611b04565b6001600160a01b03821661101e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105cf565b6001600160a01b038216600090815260208190526040902054818110156110925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105cf565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110c1908490611b97565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6111168282610796565b6107565760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561114e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61119c8282610796565b156107565760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526106d79084906115fd565b6001600160a01b0383166112af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105cf565b6001600160a01b0382166113115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105cf565b6001600160a01b038316600090815260208190526040902054818110156113895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105cf565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113c0908490611b60565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140c91815260200190565b60405180910390a35b50505050565b6060600061142a836002611b78565b611435906002611b60565b67ffffffffffffffff81111561145b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611485576020820181803683370190505b509050600360fc1b816000815181106114ae57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106114eb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061150f846002611b78565b61151a906001611b60565b90505b60018111156115ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061155c57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061158057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936115a781611bda565b905061151d565b5083156105eb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105cf565b6000611652826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116cf9092919063ffffffff16565b8051909150156106d7578080602001905181019061167091906119a8565b6106d75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105cf565b60606116de84846000856116e6565b949350505050565b6060824710156117475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105cf565b843b6117955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105cf565b600080866001600160a01b031685876040516117b19190611a73565b60006040518083038185875af1925050503d80600081146117ee576040519150601f19603f3d011682016040523d82523d6000602084013e6117f3565b606091505b509150915061180382828661180e565b979650505050505050565b6060831561181d5750816105eb565b82511561182d5782518084602001fd5b8160405162461bcd60e51b81526004016105cf9190611b04565b600060208284031215611858578081fd5b81356105eb81611c5d565b60008060408385031215611875578081fd5b823561188081611c5d565b9150602083013561189081611c5d565b809150509250929050565b6000806000606084860312156118af578081fd5b83356118ba81611c5d565b925060208401356118ca81611c5d565b929592945050506040919091013590565b600080600080600080600060e0888a0312156118f5578283fd5b873561190081611c5d565b9650602088013561191081611c5d565b95506040880135945060608801359350608088013560ff81168114611933578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611962578182fd5b823561196d81611c5d565b9150602083013561189081611c72565b6000806040838503121561198f578182fd5b823561199a81611c5d565b946020939093013593505050565b6000602082840312156119b9578081fd5b81516105eb81611c72565b6000602082840312156119d5578081fd5b5035919050565b600080604083850312156119ee578182fd5b82359150602083013561189081611c5d565b600060208284031215611a11578081fd5b81356001600160e01b0319811681146105eb578182fd5b60008060408385031215611875578182fd5b600060208284031215611a4b578081fd5b5051919050565b60008060408385031215611a64578182fd5b50508035926020909101359150565b60008251611a85818460208701611bae565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611ac7816017850160208801611bae565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611af8816028840160208801611bae565b01602801949350505050565b6020815260008251806020840152611b23816040850160208701611bae565b601f01601f19169190910160400192915050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60008219821115611b7357611b73611c47565b500190565b6000816000190483118215151615611b9257611b92611c47565b500290565b600082821015611ba957611ba9611c47565b500390565b60005b83811015611bc9578181015183820152602001611bb1565b838111156114155750506000910152565b600081611be957611be9611c47565b506000190190565b600181811c90821680611c0557607f821691505b60208210811415611c2657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611c4057611c40611c47565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146106ae57600080fd5b80151581146106ae57600080fdfea2646970667358221220b81f5f66199a978a5263cd544185a0eded3d13477bbec614d8ac3c047ca0bb0664736f6c63430008040033
Deployed Bytecode Sourcemap
238:3762:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2545:202:0;;;;;;:::i;:::-;;:::i;:::-;;;7021:14:12;;7014:22;6996:41;;6984:2;6969:18;2545:202:0;;;;;;;;2084:98:2;;;:::i;:::-;;;;;;;:::i;905:26:11:-;;;;;;;;;7194:25:12;;;7182:2;7167:18;905:26:11;7149:76:12;4181:166:2;;;;;;:::i;:::-;;:::i;3172:106::-;3259:12;;3172:106;;4814:478;;;;;;:::i;:::-;;:::i;2784:236:11:-;;;;;;:::i;:::-;;:::i;:::-;;3917:121:0;;;;;;:::i;:::-;3983:7;4009:12;;;:6;:12;;;;;:22;;;;3917:121;2458:82:11;;;;;;:::i;:::-;;:::i;4288:145:0:-;;;;;;:::i;:::-;;:::i;3021:91:2:-;;;3103:2;16849:36:12;;16837:2;16822:18;3021:91:2;16804:87:12;5305:214:0;;;;;;:::i;:::-;;:::i;5687:212:2:-;;;;;;:::i;:::-;;:::i;935:26:11:-;;;;;;3336:125:2;;;;;;:::i;:::-;-1:-1:-1;;;;;3436:18:2;3410:7;3436:18;;;;;;;;;;;;3336:125;772:38:11;;;;;;:::i;:::-;;;;;;;;;;;;;;2834:137:0;;;;;;:::i;:::-;;:::i;3242:281:11:-;;;;;;:::i;:::-;;:::i;2295:102:2:-;;;:::i;860:41:11:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1952:49:0;;1997:4;1952:49;;6386:405:2;;;;;;:::i;:::-;;:::i;3664:172::-;;;;;;:::i;:::-;;:::i;2544:236:11:-;;;;;;:::i;:::-;;:::i;1831:590::-;;;;;;:::i;:::-;;:::i;4667:147:0:-;;;;;;:::i;:::-;;:::i;3894:149:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4009:18:2;;;3983:7;4009:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3894:149;3024:214:11;;;;;;:::i;:::-;;:::i;815:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2545:202:0;2630:4;-1:-1:-1;;;;;;2653:47:0;;-1:-1:-1;;;2653:47:0;;:87;;-1:-1:-1;;;;;;;;;;871:40:9;;;2704:36:0;2646:94;2545:202;-1:-1:-1;;2545:202:0:o;2084:98:2:-;2138:13;2170:5;2163:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2084:98;:::o;4181:166::-;4264:4;4280:39;666:10:7;4303:7:2;4312:6;4280:8;:39::i;:::-;-1:-1:-1;4336:4:2;4181:166;;;;:::o;4814:478::-;4950:4;4966:36;4976:6;4984:9;4995:6;4966:9;:36::i;:::-;-1:-1:-1;;;;;5040:19:2;;5013:24;5040:19;;;:11;:19;;;;;;;;666:10:7;5040:33:2;;;;;;;;5091:26;;;;5083:79;;;;-1:-1:-1;;;5083:79:2;;12910:2:12;5083:79:2;;;12892:21:12;12949:2;12929:18;;;12922:30;12988:34;12968:18;;;12961:62;-1:-1:-1;;;13039:18:12;;;13032:38;13087:19;;5083:79:2;;;;;;;;;5196:57;5205:6;666:10:7;5246:6:2;5227:16;:25;5196:8;:57::i;:::-;5281:4;5274:11;;;4814:478;;;;;;:::o;2784:236:11:-;414:25;2430:30:0;414:25:11;666:10:7;2430::0;:30::i;:::-;-1:-1:-1;;;;;2889:20:11;::::1;2881:48;;;;-1:-1:-1::0;;;2881:48:11::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2935:17:11;::::1;;::::0;;;:9:::1;:17;::::0;;;;;;;;:33;;-1:-1:-1;;2935:33:11::1;::::0;::::1;;::::0;;::::1;::::0;;;2979:36;;6996:41:12;;;2979:36:11::1;::::0;6969:18:12;2979:36:11::1;;;;;;;;2784:236:::0;;;:::o;2458:82::-;2506:29;666:10:7;2526:8:11;2506:5;:29::i;:::-;2458:82;:::o;4288:145:0:-;3983:7;4009:12;;;:6;:12;;;;;:22;;;2430:30;2441:4;666:10:7;2430::0;:30::i;:::-;4401:25:::1;4412:4;4418:7;4401:10;:25::i;:::-;4288:145:::0;;;:::o;5305:214::-;-1:-1:-1;;;;;5400:23:0;;666:10:7;5400:23:0;5392:83;;;;-1:-1:-1;;;5392:83:0;;16058:2:12;5392:83:0;;;16040:21:12;16097:2;16077:18;;;16070:30;16136:34;16116:18;;;16109:62;-1:-1:-1;;;16187:18:12;;;16180:45;16242:19;;5392:83:0;16030:237:12;5392:83:0;5486:26;5498:4;5504:7;5486:11;:26::i;:::-;5305:214;;:::o;5687:212:2:-;666:10:7;5775:4:2;5823:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5823:34:2;;;;;;;;;;5775:4;;5791:80;;5814:7;;5823:47;;5860:10;;5823:47;:::i;:::-;5791:8;:80::i;2834:137:0:-;2912:4;2935:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;2935:29:0;;;;;;;;;;;;;;;2834:137::o;3242:281:11:-;486:28;2430:30:0;486:28:11;666:10:7;2430::0;:30::i;:::-;-1:-1:-1;;;;;3347:18:11;::::1;3339:46;;;;-1:-1:-1::0;;;3339:46:11::1;;;;;;;:::i;:::-;3406:32;::::0;-1:-1:-1;;;3406:32:11;;3432:4:::1;3406:32;::::0;::::1;6515:51:12::0;3391:12:11::1;::::0;-1:-1:-1;;;;;3406:17:11;::::1;::::0;::::1;::::0;6488:18:12;;3406:32:11::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3391:47:::0;-1:-1:-1;3444:32:11::1;-1:-1:-1::0;;;;;3444:20:11;::::1;3465:4:::0;3391:47;3444:20:::1;:32::i;:::-;3487:31;::::0;-1:-1:-1;;;;;6533:32:12;;;6515:51;;3487:31:11;::::1;::::0;::::1;::::0;6503:2:12;6488:18;3487:31:11::1;;;;;;;2470:1:0;3242:281:11::0;;;:::o;2295:102:2:-;2351:13;2383:7;2376:14;;;;;:::i;6386:405::-;666:10:7;6479:4:2;6522:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6522:34:2;;;;;;;;;;6574:35;;;;6566:85;;;;-1:-1:-1;;;6566:85:2;;15652:2:12;6566:85:2;;;15634:21:12;15691:2;15671:18;;;15664:30;15730:34;15710:18;;;15703:62;-1:-1:-1;;;15781:18:12;;;15774:35;15826:19;;6566:85:2;15624:227:12;6566:85:2;6685:67;666:10:7;6708:7:2;6736:15;6717:16;:34;6685:8;:67::i;:::-;-1:-1:-1;6780:4:2;;6386:405;-1:-1:-1;;;6386:405:2:o;3664:172::-;3750:4;3766:42;666:10:7;3790:9:2;3801:6;3766:9;:42::i;2544:236:11:-;414:25;2430:30:0;414:25:11;666:10:7;2430::0;:30::i;:::-;-1:-1:-1;;;;;2649:20:11;::::1;2641:48;;;;-1:-1:-1::0;;;2641:48:11::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2695:17:11;::::1;;::::0;;;:9:::1;:17;::::0;;;;;;;;:33;;-1:-1:-1;;2695:33:11::1;::::0;::::1;;::::0;;::::1;::::0;;;2739:36;;6996:41:12;;;2739:36:11::1;::::0;6969:18:12;2739:36:11::1;6951:92:12::0;1831:590:11;1972:15;1960:8;:27;;1952:52;;;;-1:-1:-1;;;1952:52:11;;12569:2:12;1952:52:11;;;12551:21:12;12608:2;12588:18;;;12581:30;-1:-1:-1;;;12627:18:12;;;12620:42;12679:18;;1952:52:11;12541:162:12;1952:52:11;2090:17;;-1:-1:-1;;;;;2179:13:11;;2010:14;2179:13;;;:6;:13;;;;;:15;;2010:14;;2090:17;702:66;;2156:5;;2163:7;;2172:5;;2179:15;2010:14;2179:15;;;:::i;:::-;;;;-1:-1:-1;2127:78:11;;;;;;7517:25:12;;;;-1:-1:-1;;;;;7616:15:12;;;7596:18;;;7589:43;7668:15;;;;7648:18;;;7641:43;7700:18;;;7693:34;7743:19;;;7736:35;7787:19;;;7780:35;;;7489:19;;2127:78:11;;;;;;;;;;;;2117:89;;;;;;2044:170;;;;;;;;-1:-1:-1;;;5439:27:12;;5491:1;5482:11;;5475:27;;;;5527:2;5518:12;;5511:28;5564:2;5555:12;;5429:144;2044:170:11;;;;-1:-1:-1;;2044:170:11;;;;;;;;;2027:193;;2044:170;2027:193;;;;2226:24;2253:26;;;;;;;;;8053:25:12;;;8126:4;8114:17;;8094:18;;;8087:45;;;;8148:18;;;8141:34;;;8191:18;;;8184:34;;;2027:193:11;;-1:-1:-1;2226:24:11;2253:26;;8025:19:12;;2253:26:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2253:26:11;;-1:-1:-1;;2253:26:11;;;-1:-1:-1;;;;;;;2293:30:11;;;;;;:59;;;2347:5;-1:-1:-1;;;;;2327:25:11;:16;-1:-1:-1;;;;;2327:25:11;;2293:59;2285:94;;;;-1:-1:-1;;;2285:94:11;;13319:2:12;2285:94:11;;;13301:21:12;13358:2;13338:18;;;13331:30;-1:-1:-1;;;13377:18:12;;;13370:52;13439:18;;2285:94:11;13291:172:12;2285:94:11;2385:31;2394:5;2401:7;2410:5;2385:8;:31::i;:::-;1831:590;;;;;;;;;:::o;4667:147:0:-;3983:7;4009:12;;;:6;:12;;;;;:22;;;2430:30;2441:4;666:10:7;2430::0;:30::i;:::-;4781:26:::1;4793:4;4799:7;4781:11;:26::i;3024:214:11:-:0;414:25;2430:30:0;414:25:11;666:10:7;2430::0;:30::i;:::-;3127:11:11::1;:25:::0;;;3158:11:::1;:25:::0;;;3194:39:::1;::::0;;16628:25:12;;;16684:2;16669:18;;16662:34;;;3194:39:11::1;::::0;16601:18:12;3194:39:11::1;;;;;;;3024:214:::0;;;:::o;9962:370:2:-;-1:-1:-1;;;;;10093:19:2;;10085:68;;;;-1:-1:-1;;;10085:68:2;;14478:2:12;10085:68:2;;;14460:21:12;14517:2;14497:18;;;14490:30;14556:34;14536:18;;;14529:62;-1:-1:-1;;;14607:18:12;;;14600:34;14651:19;;10085:68:2;14450:226:12;10085:68:2;-1:-1:-1;;;;;10171:21:2;;10163:68;;;;-1:-1:-1;;;10163:68:2;;10331:2:12;10163:68:2;;;10313:21:12;10370:2;10350:18;;;10343:30;10409:34;10389:18;;;10382:62;-1:-1:-1;;;10460:18:12;;;10453:32;10502:19;;10163:68:2;10303:224:12;10163:68:2;-1:-1:-1;;;;;10242:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10293:32;;7194:25:12;;;10293:32:2;;7167:18:12;10293:32:2;;;;;;;9962:370;;;:::o;3584:414:11:-;-1:-1:-1;;;;;3693:19:11;;;;;;:9;:19;;;;;;;;3692:20;:47;;;;-1:-1:-1;;;;;;3717:22:11;;;;;;:9;:22;;;;;;;;3716:23;3692:47;3684:69;;;;-1:-1:-1;;;3684:69:11;;11418:2:12;3684:69:11;;;11400:21:12;11457:1;11437:18;;;11430:29;-1:-1:-1;;;11475:18:12;;;11468:39;11524:18;;3684:69:11;11390:158:12;3684:69:11;-1:-1:-1;;;;;3764:19:11;;;;;;:9;:19;;;;;;;;3763:20;:47;;;;-1:-1:-1;;;;;;3788:22:11;;;;;;:9;:22;;;;;;;;3787:23;3763:47;3759:181;;;3847:11;;3828:15;:30;;3820:55;;;;-1:-1:-1;;;3820:55:11;;11077:2:12;3820:55:11;;;11059:21:12;11116:2;11096:18;;;11089:30;-1:-1:-1;;;11135:18:12;;;11128:42;11187:18;;3820:55:11;11049:162:12;3820:55:11;3903:11;;3891:8;:23;;3883:50;;;;-1:-1:-1;;;3883:50:11;;10734:2:12;3883:50:11;;;10716:21:12;10773:2;10753:18;;;10746:30;-1:-1:-1;;;10792:18:12;;;10785:44;10846:18;;3883:50:11;10706:164:12;3883:50:11;3945:48;3961:8;3971:11;3984:8;3945:15;:48::i;3252:484:0:-;3332:22;3340:4;3346:7;3332;:22::i;:::-;3327:403;;3515:41;3543:7;-1:-1:-1;;;;;3515:41:0;3553:2;3515:19;:41::i;:::-;3627:38;3655:4;3662:2;3627:19;:38::i;:::-;3422:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3422:265:0;;;;;;;;;;-1:-1:-1;;;3370:349:0;;;;;;;:::i;8963:576:2:-;-1:-1:-1;;;;;9046:21:2;;9038:67;;;;-1:-1:-1;;;9038:67:2;;13670:2:12;9038:67:2;;;13652:21:12;13709:2;13689:18;;;13682:30;13748:34;13728:18;;;13721:62;-1:-1:-1;;;13799:18:12;;;13792:31;13840:19;;9038:67:2;13642:223:12;9038:67:2;-1:-1:-1;;;;;9201:18:2;;9176:22;9201:18;;;;;;;;;;;9237:24;;;;9229:71;;;;-1:-1:-1;;;9229:71:2;;9928:2:12;9229:71:2;;;9910:21:12;9967:2;9947:18;;;9940:30;10006:34;9986:18;;;9979:62;-1:-1:-1;;;10057:18:12;;;10050:32;10099:19;;9229:71:2;9900:224:12;9229:71:2;-1:-1:-1;;;;;9334:18:2;;:9;:18;;;;;;;;;;9355:23;;;9334:44;;9398:12;:22;;9372:6;;9334:9;9398:22;;9372:6;;9398:22;:::i;:::-;;;;-1:-1:-1;;9436:37:2;;7194:25:12;;;9462:1:2;;-1:-1:-1;;;;;9436:37:2;;;;;7182:2:12;7167:18;9436:37:2;;;;;;;4288:145:0;;;:::o;6572:224::-;6646:22;6654:4;6660:7;6646;:22::i;:::-;6641:149;;6684:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6684:29:0;;;;;;;;;:36;;-1:-1:-1;;6684:36:0;6716:4;6684:36;;;6766:12;666:10:7;;587:96;6766:12:0;-1:-1:-1;;;;;6739:40:0;6757:7;-1:-1:-1;;;;;6739:40:0;6751:4;6739:40;;;;;;;;;;6572:224;;:::o;6802:225::-;6876:22;6884:4;6890:7;6876;:22::i;:::-;6872:149;;;6946:5;6914:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6914:29:0;;;;;;;;;;:37;;-1:-1:-1;;6914:37:0;;;6970:40;666:10:7;;6914:12:0;;6970:40;;6946:5;6970:40;6802:225;;:::o;634:205:5:-;773:58;;;-1:-1:-1;;;;;6769:32:12;;773:58:5;;;6751:51:12;6818:18;;;;6811:34;;;773:58:5;;;;;;;;;;6724:18:12;;;;773:58:5;;;;;;;;-1:-1:-1;;;;;773:58:5;-1:-1:-1;;;773:58:5;;;746:86;;766:5;;746:19;:86::i;7265:713:2:-;-1:-1:-1;;;;;7400:20:2;;7392:70;;;;-1:-1:-1;;;7392:70:2;;14072:2:12;7392:70:2;;;14054:21:12;14111:2;14091:18;;;14084:30;14150:34;14130:18;;;14123:62;-1:-1:-1;;;14201:18:12;;;14194:35;14246:19;;7392:70:2;14044:227:12;7392:70:2;-1:-1:-1;;;;;7480:23:2;;7472:71;;;;-1:-1:-1;;;7472:71:2;;9180:2:12;7472:71:2;;;9162:21:12;9219:2;9199:18;;;9192:30;9258:34;9238:18;;;9231:62;-1:-1:-1;;;9309:18:12;;;9302:33;9352:19;;7472:71:2;9152:225:12;7472:71:2;-1:-1:-1;;;;;7636:17:2;;7612:21;7636:17;;;;;;;;;;;7671:23;;;;7663:74;;;;-1:-1:-1;;;7663:74:2;;11755:2:12;7663:74:2;;;11737:21:12;11794:2;11774:18;;;11767:30;11833:34;11813:18;;;11806:62;-1:-1:-1;;;11884:18:12;;;11877:36;11930:19;;7663:74:2;11727:228:12;7663:74:2;-1:-1:-1;;;;;7771:17:2;;;:9;:17;;;;;;;;;;;7791:22;;;7771:42;;7833:20;;;;;;;;:30;;7807:6;;7771:9;7833:30;;7807:6;;7833:30;:::i;:::-;;;;;;;;7896:9;-1:-1:-1;;;;;7879:35:2;7888:6;-1:-1:-1;;;;;7879:35:2;;7907:6;7879:35;;;;7194:25:12;;7182:2;7167:18;;7149:76;7879:35:2;;;;;;;;7925:46;7265:713;;;;:::o;1535:441:8:-;1610:13;1635:19;1667:10;1671:6;1667:1;:10;:::i;:::-;:14;;1680:1;1667:14;:::i;:::-;1657:25;;;;;;-1:-1:-1;;;1657:25:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1657:25:8;;1635:47;;-1:-1:-1;;;1692:6:8;1699:1;1692:9;;;;;;-1:-1:-1;;;1692:9:8;;;;;;;;;;;;:15;-1:-1:-1;;;;;1692:15:8;;;;;;;;;-1:-1:-1;;;1717:6:8;1724:1;1717:9;;;;;;-1:-1:-1;;;1717:9:8;;;;;;;;;;;;:15;-1:-1:-1;;;;;1717:15:8;;;;;;;;-1:-1:-1;1747:9:8;1759:10;1763:6;1759:1;:10;:::i;:::-;:14;;1772:1;1759:14;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;-1:-1:-1;;;1826:5:8;1834:3;1826:11;1813:25;;;;;-1:-1:-1;;;1813:25:8;;;;;;;;;;;;1801:6;1808:1;1801:9;;;;;;-1:-1:-1;;;1801:9:8;;;;;;;;;;;;:37;-1:-1:-1;;;;;1801:37:8;;;;;;;;-1:-1:-1;1862:1:8;1852:11;;;;;1782:3;;;:::i;:::-;;;1742:132;;;-1:-1:-1;1891:10:8;;1883:55;;;;-1:-1:-1;;;1883:55:8;;8819:2:12;1883:55:8;;;8801:21:12;;;8838:18;;;8831:30;8897:34;8877:18;;;8870:62;8949:18;;1883:55:8;8791:182:12;3140:706:5;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:5;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:5;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:5;;15241:2:12;3744:85:5;;;15223:21:12;15280:2;15260:18;;;15253:30;15319:34;15299:18;;;15292:62;-1:-1:-1;;;15370:18:12;;;15363:40;15420:19;;3744:85:5;15213:232:12;3461:223:6;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;3461:223;-1:-1:-1;;;;3461:223:6:o;4548:499::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:6;;12162:2:12;4737:81:6;;;12144:21:12;12201:2;12181:18;;;12174:30;12240:34;12220:18;;;12213:62;-1:-1:-1;;;12291:18:12;;;12284:36;12337:19;;4737:81:6;12134:228:12;4737:81:6;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:6;;14883:2:12;4828:60:6;;;14865:21:12;14922:2;14902:18;;;14895:30;14961:31;14941:18;;;14934:59;15010:18;;4828:60:6;14855:179:12;4828:60:6;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:6;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:51;5006:7;5015:10;5027:12;4989:16;:51::i;:::-;4982:58;4548:499;-1:-1:-1;;;;;;;4548:499:6:o;7161:692::-;7307:12;7335:7;7331:516;;;-1:-1:-1;7365:10:6;7358:17;;7331:516;7476:17;;:21;7472:365;;7670:10;7664:17;7730:15;7717:10;7713:2;7709:19;7702:44;7619:145;7809:12;7802:20;;-1:-1:-1;;;7802:20:6;;;;;;;;:::i;14:257:12:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:398::-;344:6;352;405:2;393:9;384:7;380:23;376:32;373:2;;;426:6;418;411:22;373:2;470:9;457:23;489:31;514:5;489:31;:::i;:::-;539:5;-1:-1:-1;596:2:12;581:18;;568:32;609:33;568:32;609:33;:::i;:::-;661:7;651:17;;;363:311;;;;;:::o;679:466::-;756:6;764;772;825:2;813:9;804:7;800:23;796:32;793:2;;;846:6;838;831:22;793:2;890:9;877:23;909:31;934:5;909:31;:::i;:::-;959:5;-1:-1:-1;1016:2:12;1001:18;;988:32;1029:33;988:32;1029:33;:::i;:::-;783:362;;1081:7;;-1:-1:-1;;;1135:2:12;1120:18;;;;1107:32;;783:362::o;1150:849::-;1261:6;1269;1277;1285;1293;1301;1309;1362:3;1350:9;1341:7;1337:23;1333:33;1330:2;;;1384:6;1376;1369:22;1330:2;1428:9;1415:23;1447:31;1472:5;1447:31;:::i;:::-;1497:5;-1:-1:-1;1554:2:12;1539:18;;1526:32;1567:33;1526:32;1567:33;:::i;:::-;1619:7;-1:-1:-1;1673:2:12;1658:18;;1645:32;;-1:-1:-1;1724:2:12;1709:18;;1696:32;;-1:-1:-1;1780:3:12;1765:19;;1752:33;1829:4;1816:18;;1804:31;;1794:2;;1854:6;1846;1839:22;1794:2;1320:679;;;;-1:-1:-1;1320:679:12;;;;1882:7;1936:3;1921:19;;1908:33;;-1:-1:-1;1988:3:12;1973:19;;;1960:33;;1320:679;-1:-1:-1;;1320:679:12:o;2004:392::-;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2151:6;2143;2136:22;2098:2;2195:9;2182:23;2214:31;2239:5;2214:31;:::i;:::-;2264:5;-1:-1:-1;2321:2:12;2306:18;;2293:32;2334:30;2293:32;2334:30;:::i;2401:325::-;2469:6;2477;2530:2;2518:9;2509:7;2505:23;2501:32;2498:2;;;2551:6;2543;2536:22;2498:2;2595:9;2582:23;2614:31;2639:5;2614:31;:::i;:::-;2664:5;2716:2;2701:18;;;;2688:32;;-1:-1:-1;;;2488:238:12:o;2731:255::-;2798:6;2851:2;2839:9;2830:7;2826:23;2822:32;2819:2;;;2872:6;2864;2857:22;2819:2;2909:9;2903:16;2928:28;2950:5;2928:28;:::i;2991:190::-;3050:6;3103:2;3091:9;3082:7;3078:23;3074:32;3071:2;;;3124:6;3116;3109:22;3071:2;-1:-1:-1;3152:23:12;;3061:120;-1:-1:-1;3061:120:12:o;3186:325::-;3254:6;3262;3315:2;3303:9;3294:7;3290:23;3286:32;3283:2;;;3336:6;3328;3321:22;3283:2;3377:9;3364:23;3354:33;;3437:2;3426:9;3422:18;3409:32;3450:31;3475:5;3450:31;:::i;3516:306::-;3574:6;3627:2;3615:9;3606:7;3602:23;3598:32;3595:2;;;3648:6;3640;3633:22;3595:2;3679:23;;-1:-1:-1;;;;;;3731:32:12;;3721:43;;3711:2;;3783:6;3775;3768:22;3827:413;3910:6;3918;3971:2;3959:9;3950:7;3946:23;3942:32;3939:2;;;3992:6;3984;3977:22;4440:194;4510:6;4563:2;4551:9;4542:7;4538:23;4534:32;4531:2;;;4584:6;4576;4569:22;4531:2;-1:-1:-1;4612:16:12;;4521:113;-1:-1:-1;4521:113:12:o;4639:258::-;4707:6;4715;4768:2;4756:9;4747:7;4743:23;4739:32;4736:2;;;4789:6;4781;4774:22;4736:2;-1:-1:-1;;4817:23:12;;;4887:2;4872:18;;;4859:32;;-1:-1:-1;4726:171:12:o;4902:274::-;5031:3;5069:6;5063:13;5085:53;5131:6;5126:3;5119:4;5111:6;5107:17;5085:53;:::i;:::-;5154:16;;;;;5039:137;-1:-1:-1;;5039:137:12:o;5578:786::-;5989:25;5984:3;5977:38;5959:3;6044:6;6038:13;6060:62;6115:6;6110:2;6105:3;6101:12;6094:4;6086:6;6082:17;6060:62;:::i;:::-;-1:-1:-1;;;6181:2:12;6141:16;;;6173:11;;;6166:40;6231:13;;6253:63;6231:13;6302:2;6294:11;;6287:4;6275:17;;6253:63;:::i;:::-;6336:17;6355:2;6332:26;;5967:397;-1:-1:-1;;;;5967:397:12:o;8229:383::-;8378:2;8367:9;8360:21;8341:4;8410:6;8404:13;8453:6;8448:2;8437:9;8433:18;8426:34;8469:66;8528:6;8523:2;8512:9;8508:18;8503:2;8495:6;8491:15;8469:66;:::i;:::-;8596:2;8575:15;-1:-1:-1;;8571:29:12;8556:45;;;;8603:2;8552:54;;8350:262;-1:-1:-1;;8350:262:12:o;9382:339::-;9584:2;9566:21;;;9623:2;9603:18;;;9596:30;-1:-1:-1;;;9657:2:12;9642:18;;9635:45;9712:2;9697:18;;9556:165::o;16896:128::-;16936:3;16967:1;16963:6;16960:1;16957:13;16954:2;;;16973:18;;:::i;:::-;-1:-1:-1;17009:9:12;;16944:80::o;17029:168::-;17069:7;17135:1;17131;17127:6;17123:14;17120:1;17117:21;17112:1;17105:9;17098:17;17094:45;17091:2;;;17142:18;;:::i;:::-;-1:-1:-1;17182:9:12;;17081:116::o;17202:125::-;17242:4;17270:1;17267;17264:8;17261:2;;;17275:18;;:::i;:::-;-1:-1:-1;17312:9:12;;17251:76::o;17332:258::-;17404:1;17414:113;17428:6;17425:1;17422:13;17414:113;;;17504:11;;;17498:18;17485:11;;;17478:39;17450:2;17443:10;17414:113;;;17545:6;17542:1;17539:13;17536:2;;;-1:-1:-1;;17580:1:12;17562:16;;17555:27;17385:205::o;17595:136::-;17634:3;17662:5;17652:2;;17671:18;;:::i;:::-;-1:-1:-1;;;17707:18:12;;17642:89::o;17736:380::-;17815:1;17811:12;;;;17858;;;17879:2;;17933:4;17925:6;17921:17;17911:27;;17879:2;17986;17978:6;17975:14;17955:18;17952:38;17949:2;;;18032:10;18027:3;18023:20;18020:1;18013:31;18067:4;18064:1;18057:15;18095:4;18092:1;18085:15;17949:2;;17791:325;;;:::o;18121:135::-;18160:3;-1:-1:-1;;18181:17:12;;18178:2;;;18201:18;;:::i;:::-;-1:-1:-1;18248:1:12;18237:13;;18168:88::o;18261:127::-;18322:10;18317:3;18313:20;18310:1;18303:31;18353:4;18350:1;18343:15;18377:4;18374:1;18367:15;18393:131;-1:-1:-1;;;;;18468:31:12;;18458:42;;18448:2;;18514:1;18511;18504:12;18529:118;18615:5;18608:13;18601:21;18594:5;18591:32;18581:2;;18637:1;18634;18627:12
Swarm Source
ipfs://b81f5f66199a978a5263cd544185a0eded3d13477bbec614d8ac3c047ca0bb06
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.