Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
OMIToken
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-09-19
*/
// File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol
// SPDX-License-Identifier: UNLICENSED AND MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount)
external
returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender)
external
view
returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
pragma solidity ^0.8.0;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(
_initializing || !_initialized,
"Initializable: contract is already initialized"
);
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20Upgradeable is
Initializable,
ContextUpgradeable,
IERC20Upgradeable,
IERC20MetadataUpgradeable
{
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.
*/
function __ERC20_init(string memory name_, string memory symbol_)
internal
initializer
{
__Context_init_unchained();
__ERC20_init_unchained(name_, symbol_);
}
function __ERC20_init_unchained(string memory name_, string memory symbol_)
internal
initializer
{
_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 {}
uint256[45] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20BurnableUpgradeable is
Initializable,
ContextUpgradeable,
ERC20Upgradeable
{
function __ERC20Burnable_init() internal initializer {
__Context_init_unchained();
__ERC20Burnable_init_unchained();
}
function __ERC20Burnable_init_unchained() internal initializer {}
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(
currentAllowance >= amount,
"ERC20: burn amount exceeds allowance"
);
unchecked {
_approve(account, _msgSender(), currentAllowance - amount);
}
_burn(account, amount);
}
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal initializer {
__Context_init_unchained();
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal initializer {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
uint256[49] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControlUpgradeable {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(
bytes32 indexed role,
bytes32 indexed previousAdminRole,
bytes32 indexed newAdminRole
);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(
bytes32 indexed role,
address indexed account,
address indexed sender
);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(
bytes32 indexed role,
address indexed account,
address indexed sender
);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account)
external
view
returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library StringsUpgradeable {
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);
}
}
// File: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal initializer {
__ERC165_init_unchained();
}
function __ERC165_init_unchained() internal initializer {}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override
returns (bool)
{
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControlUpgradeable is
Initializable,
ContextUpgradeable,
IAccessControlUpgradeable,
ERC165Upgradeable
{
function __AccessControl_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
}
function __AccessControl_init_unchained() internal initializer {}
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(IAccessControlUpgradeable).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 ",
StringsUpgradeable.toHexString(uint160(account), 20),
" is missing role ",
StringsUpgradeable.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());
}
}
uint256[49] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20CappedUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Extension of {ERC20} that adds a cap to the supply of tokens.
*/
abstract contract ERC20CappedUpgradeable is Initializable, ERC20Upgradeable {
uint256 private _cap;
/**
* @dev Sets the value of the `cap`. This value is immutable, it can only be
* set once during construction.
*/
function __ERC20Capped_init(uint256 cap_) internal initializer {
__Context_init_unchained();
__ERC20Capped_init_unchained(cap_);
}
function __ERC20Capped_init_unchained(uint256 cap_) internal initializer {
require(cap_ > 0, "ERC20Capped: cap is 0");
_cap = cap_;
}
/**
* @dev Returns the cap on the token's total supply.
*/
function cap() public view virtual returns (uint256) {
return _cap;
}
/**
* @dev See {ERC20-_mint}.
*/
function _mint(address account, uint256 amount) internal virtual override {
require(
ERC20Upgradeable.totalSupply() + amount <= cap(),
"ERC20Capped: cap exceeded"
);
super._mint(account, amount);
}
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeaconUpgradeable {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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 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);
}
}
}
}
// File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
*/
library StorageSlotUpgradeable {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot)
internal
pure
returns (AddressSlot storage r)
{
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot)
internal
pure
returns (BooleanSlot storage r)
{
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot)
internal
pure
returns (Bytes32Slot storage r)
{
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot)
internal
pure
returns (Uint256Slot storage r)
{
assembly {
r.slot := slot
}
}
}
// File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol
pragma solidity ^0.8.2;
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*
* @custom:oz-upgrades-unsafe-allow delegatecall
*/
abstract contract ERC1967UpgradeUpgradeable is Initializable {
function __ERC1967Upgrade_init() internal initializer {
__ERC1967Upgrade_init_unchained();
}
function __ERC1967Upgrade_init_unchained() internal initializer {}
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
bytes32 private constant _ROLLBACK_SLOT =
0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Returns the current implementation address.
*/
function _getImplementation() internal view returns (address) {
return
StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
require(
AddressUpgradeable.isContract(newImplementation),
"ERC1967: new implementation is not a contract"
);
StorageSlotUpgradeable
.getAddressSlot(_IMPLEMENTATION_SLOT)
.value = newImplementation;
}
/**
* @dev Perform implementation upgrade
*
* Emits an {Upgraded} event.
*/
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Perform implementation upgrade with additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCall(
address newImplementation,
bytes memory data,
bool forceCall
) internal {
_upgradeTo(newImplementation);
if (data.length > 0 || forceCall) {
_functionDelegateCall(newImplementation, data);
}
}
/**
* @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCallSecure(
address newImplementation,
bytes memory data,
bool forceCall
) internal {
address oldImplementation = _getImplementation();
// Initial upgrade and setup call
_setImplementation(newImplementation);
if (data.length > 0 || forceCall) {
_functionDelegateCall(newImplementation, data);
}
// Perform rollback test if not already in progress
StorageSlotUpgradeable.BooleanSlot
storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(
_ROLLBACK_SLOT
);
if (!rollbackTesting.value) {
// Trigger rollback using upgradeTo from the new implementation
rollbackTesting.value = true;
_functionDelegateCall(
newImplementation,
abi.encodeWithSignature("upgradeTo(address)", oldImplementation)
);
rollbackTesting.value = false;
// Check rollback was effective
require(
oldImplementation == _getImplementation(),
"ERC1967Upgrade: upgrade breaks further upgrades"
);
// Finally reset to the new implementation and log the upgrade
_upgradeTo(newImplementation);
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _ADMIN_SLOT =
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Returns the current admin.
*/
function _getAdmin() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
require(
newAdmin != address(0),
"ERC1967: new admin is the zero address"
);
StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {AdminChanged} event.
*/
function _changeAdmin(address newAdmin) internal {
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
*/
bytes32 internal constant _BEACON_SLOT =
0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Emitted when the beacon is upgraded.
*/
event BeaconUpgraded(address indexed beacon);
/**
* @dev Returns the current beacon.
*/
function _getBeacon() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
require(
AddressUpgradeable.isContract(newBeacon),
"ERC1967: new beacon is not a contract"
);
require(
AddressUpgradeable.isContract(
IBeaconUpgradeable(newBeacon).implementation()
),
"ERC1967: beacon implementation is not a contract"
);
StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
}
/**
* @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
* not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
*
* Emits a {BeaconUpgraded} event.
*/
function _upgradeBeaconToAndCall(
address newBeacon,
bytes memory data,
bool forceCall
) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0 || forceCall) {
_functionDelegateCall(
IBeaconUpgradeable(newBeacon).implementation(),
data
);
}
}
/**
* @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)
private
returns (bytes memory)
{
require(
AddressUpgradeable.isContract(target),
"Address: delegate call to non-contract"
);
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return
AddressUpgradeable.verifyCallResult(
success,
returndata,
"Address: low-level delegate call failed"
);
}
uint256[50] private __gap;
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
*
* A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
* `UUPSUpgradeable` with a custom implementation of upgrades.
*
* The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
*
* _Available since v4.1._
*/
abstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable {
function __UUPSUpgradeable_init() internal initializer {
__ERC1967Upgrade_init_unchained();
__UUPSUpgradeable_init_unchained();
}
function __UUPSUpgradeable_init_unchained() internal initializer {}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*/
function upgradeTo(address newImplementation) external virtual {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallSecure(newImplementation, bytes(""), false);
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
* encoded in `data`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*/
function upgradeToAndCall(address newImplementation, bytes memory data)
external
payable
virtual
{
_authorizeUpgrade(newImplementation);
_upgradeToAndCallSecure(newImplementation, data, true);
}
/**
* @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
* {upgradeTo} and {upgradeToAndCall}.
*
* Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
*
* ```solidity
* function _authorizeUpgrade(address) internal override onlyOwner {}
* ```
*/
function _authorizeUpgrade(address newImplementation) internal virtual;
uint256[50] private __gap;
}
// File: contracts/OmiToken.sol
pragma solidity ^0.8.6;
contract OMIToken is
Initializable,
ERC20Upgradeable,
ERC20BurnableUpgradeable,
ERC20CappedUpgradeable,
PausableUpgradeable,
AccessControlUpgradeable,
UUPSUpgradeable
{
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE");
function initialize() public initializer {
__ERC20_init("OMI Token", "OMI");
__ERC20Burnable_init();
__ERC20Capped_init(750000000000 * 1e18);
__Pausable_init();
__AccessControl_init();
__UUPSUpgradeable_init();
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_setupRole(PAUSER_ROLE, msg.sender);
_setupRole(MINTER_ROLE, msg.sender);
_setupRole(UPGRADER_ROLE, msg.sender);
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {
_mint(to, amount);
}
function _mint(address to, uint256 amount)
internal
virtual
override(ERC20Upgradeable, ERC20CappedUpgradeable)
{
super._mint(to, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal override whenNotPaused {
super._beforeTokenTransfer(from, to, amount);
}
function _authorizeUpgrade(address newImplementation)
internal
override
onlyRole(UPGRADER_ROLE)
{}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50612355806100206000396000f3fe6080604052600436106101d85760003560e01c80634f1ef28611610102578063a217fddf11610095578063d547741f11610064578063d547741f14610535578063dd62ed3e14610555578063e63ab1e91461059b578063f72c0d8b146105bd57600080fd5b8063a217fddf146104ac578063a457c2d7146104c1578063a9059cbb146104e1578063d53913931461050157600080fd5b80638129fc1c116100d15780638129fc1c1461044d5780638456cb591461046257806391d148541461047757806395d89b411461049757600080fd5b80634f1ef286146103cc5780635c975abb146103df57806370a08231146103f757806379cc67901461042d57600080fd5b8063313ce5671161017a578063395093511161014957806339509351146103575780633f4ba83a1461037757806340c10f191461038c57806342966c68146103ac57600080fd5b8063313ce567146102e6578063355274ea1461030257806336568abe146103175780633659cfe61461033757600080fd5b806318160ddd116101b657806318160ddd1461025457806323b872dd14610273578063248a9ca3146102935780632f2ff15d146102c457600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063095ea7b314610234575b600080fd5b3480156101e957600080fd5b506101fd6101f836600461208e565b6105f1565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610628565b6040516102099190612149565b34801561024057600080fd5b506101fd61024f366004612028565b6106ba565b34801561026057600080fd5b506035545b604051908152602001610209565b34801561027f57600080fd5b506101fd61028e366004611f2a565b6106d0565b34801561029f57600080fd5b506102656102ae366004612052565b600090815261012e602052604090206001015490565b3480156102d057600080fd5b506102e46102df36600461206b565b610781565b005b3480156102f257600080fd5b5060405160128152602001610209565b34801561030e57600080fd5b50609754610265565b34801561032357600080fd5b506102e461033236600461206b565b6107ad565b34801561034357600080fd5b506102e4610352366004611edc565b61082b565b34801561036357600080fd5b506101fd610372366004612028565b610852565b34801561038357600080fd5b506102e461088e565b34801561039857600080fd5b506102e46103a7366004612028565b6108af565b3480156103b857600080fd5b506102e46103c7366004612052565b6108e4565b6102e46103da366004611f66565b6108ee565b3480156103eb57600080fd5b5060ca5460ff166101fd565b34801561040357600080fd5b50610265610412366004611edc565b6001600160a01b031660009081526033602052604090205490565b34801561043957600080fd5b506102e4610448366004612028565b610903565b34801561045957600080fd5b506102e4610984565b34801561046e57600080fd5b506102e4610ae2565b34801561048357600080fd5b506101fd61049236600461206b565b610b03565b3480156104a357600080fd5b50610227610b2f565b3480156104b857600080fd5b50610265600081565b3480156104cd57600080fd5b506101fd6104dc366004612028565b610b3e565b3480156104ed57600080fd5b506101fd6104fc366004612028565b610bd7565b34801561050d57600080fd5b506102657f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561054157600080fd5b506102e461055036600461206b565b610be4565b34801561056157600080fd5b50610265610570366004611ef7565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3480156105a757600080fd5b506102656000805160206122d983398151915281565b3480156105c957600080fd5b506102657f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b03198216637965db0b60e01b148061062257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060603680546106379061225b565b80601f01602080910402602001604051908101604052809291908181526020018280546106639061225b565b80156106b05780601f10610685576101008083540402835291602001916106b0565b820191906000526020600020905b81548152906001019060200180831161069357829003601f168201915b5050505050905090565b60006106c7338484610c0b565b50600192915050565b60006106dd848484610d2f565b6001600160a01b0384166000908152603460209081526040808320338452909152902054828110156107675760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107748533858403610c0b565b60019150505b9392505050565b600082815261012e602052604090206001015461079e8133610f0a565b6107a88383610f6e565b505050565b6001600160a01b038116331461081d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161075e565b6108278282610ff5565b5050565b6108348161105d565b61084f81604051806020016040528060008152506000611088565b50565b3360008181526034602090815260408083206001600160a01b038716845290915281205490916106c79185906108899086906121ca565b610c0b565b6000805160206122d98339815191526108a78133610f0a565b61084f611210565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108da8133610f0a565b6107a883836112a3565b61084f33826112ad565b6108f78261105d565b61082782826001611088565b600061090f8333610570565b90508181101561096d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161075e565b61097a8333848403610c0b565b6107a883836112ad565b600054610100900460ff168061099d575060005460ff16155b6109b95760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff161580156109db576000805461ffff19166101011790555b610a216040518060400160405280600981526020016827a6a4902a37b5b2b760b91b815250604051806040016040528060038152602001624f4d4960e81b815250611407565b610a29611486565b610a3f6c097761759c34d7b26fb00000006114ed565b610a4761156a565b610a4f6115d1565b610a57611486565b610a62600033611630565b610a7a6000805160206122d983398151915233611630565b610aa47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611630565b610ace7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333611630565b801561084f576000805461ff001916905550565b6000805160206122d9833981519152610afb8133610f0a565b61084f61163a565b600091825261012e602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060603780546106379061225b565b3360009081526034602090815260408083206001600160a01b038616845290915281205482811015610bc05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161075e565b610bcd3385858403610c0b565b5060019392505050565b60006106c7338484610d2f565b600082815261012e6020526040902060010154610c018133610f0a565b6107a88383610ff5565b6001600160a01b038316610c6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161075e565b6001600160a01b038216610cce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161075e565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610d935760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161075e565b6001600160a01b038216610df55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161075e565b610e008383836116b5565b6001600160a01b03831660009081526033602052604090205481811015610e785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161075e565b6001600160a01b03808516600090815260336020526040808220858503905591851681529081208054849290610eaf9084906121ca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610efb91815260200190565b60405180910390a35b50505050565b610f148282610b03565b61082757610f2c816001600160a01b031660146116fb565b610f378360206116fb565b604051602001610f489291906120d4565b60408051601f198184030181529082905262461bcd60e51b825261075e91600401612149565b610f788282610b03565b61082757600082815261012e602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610fb13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610fff8282610b03565b1561082757600082815261012e602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e36108278133610f0a565b60006110bb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506110c684611897565b6000835111806110d35750815b156110e4576110e2848461193c565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff1661120957805460ff191660011781556040516001600160a01b038316602482015261116390869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b17905261193c565b50805460ff191681557f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b038381169116146112005760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b606482015260840161075e565b61120985611a27565b5050505050565b60ca5460ff166112595760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161075e565b60ca805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108278282611a67565b6001600160a01b03821661130d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161075e565b611319826000836116b5565b6001600160a01b0382166000908152603360205260409020548181101561138d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161075e565b6001600160a01b03831660009081526033602052604081208383039055603580548492906113bc908490612201565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600054610100900460ff1680611420575060005460ff16155b61143c5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff1615801561145e576000805461ffff19166101011790555b611466611ad6565b6114708383611b40565b80156107a8576000805461ff0019169055505050565b600054610100900460ff168061149f575060005460ff16155b6114bb5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff161580156114dd576000805461ffff19166101011790555b6114e5611ad6565b610ace611ad6565b600054610100900460ff1680611506575060005460ff16155b6115225760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611544576000805461ffff19166101011790555b61154c611ad6565b61155582611bd5565b8015610827576000805461ff00191690555050565b600054610100900460ff1680611583575060005460ff16155b61159f5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff161580156115c1576000805461ffff19166101011790555b6115c9611ad6565b610ace611c8e565b600054610100900460ff16806115ea575060005460ff16155b6116065760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611628576000805461ffff19166101011790555b6114dd611ad6565b6108278282610f6e565b60ca5460ff16156116805760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161075e565b60ca805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112863390565b60ca5460ff16156107a85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161075e565b6060600061170a8360026121e2565b6117159060026121ca565b67ffffffffffffffff81111561172d5761172d6122c2565b6040519080825280601f01601f191660200182016040528015611757576020820181803683370190505b509050600360fc1b81600081518110611772576117726122ac565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117a1576117a16122ac565b60200101906001600160f81b031916908160001a90535060006117c58460026121e2565b6117d09060016121ca565b90505b6001811115611848576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611804576118046122ac565b1a60f81b82828151811061181a5761181a6122ac565b60200101906001600160f81b031916908160001a90535060049490941c9361184181612244565b90506117d3565b50831561077a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161075e565b803b6118fb5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161075e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b61199b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161075e565b600080846001600160a01b0316846040516119b691906120b8565b600060405180830381855af49150503d80600081146119f1576040519150601f19603f3d011682016040523d82523d6000602084013e6119f6565b606091505b5091509150611a1e82826040518060600160405280602781526020016122f960279139611d03565b95945050505050565b611a3081611897565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60975481611a7460355490565b611a7e91906121ca565b1115611acc5760405162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015260640161075e565b6108278282611d3c565b600054610100900460ff1680611aef575060005460ff16155b611b0b5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015610ace576000805461ffff1916610101179055801561084f576000805461ff001916905550565b600054610100900460ff1680611b59575060005460ff16155b611b755760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611b97576000805461ffff19166101011790555b8251611baa906036906020860190611e27565b508151611bbe906037906020850190611e27565b5080156107a8576000805461ff0019169055505050565b600054610100900460ff1680611bee575060005460ff16155b611c0a5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611c2c576000805461ffff19166101011790555b60008211611c745760405162461bcd60e51b8152602060048201526015602482015274045524332304361707065643a20636170206973203605c1b604482015260640161075e565b60978290558015610827576000805461ff00191690555050565b600054610100900460ff1680611ca7575060005460ff16155b611cc35760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611ce5576000805461ffff19166101011790555b60ca805460ff19169055801561084f576000805461ff001916905550565b60608315611d1257508161077a565b825115611d225782518084602001fd5b8160405162461bcd60e51b815260040161075e9190612149565b6001600160a01b038216611d925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161075e565b611d9e600083836116b5565b8060356000828254611db091906121ca565b90915550506001600160a01b03821660009081526033602052604081208054839290611ddd9084906121ca565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054611e339061225b565b90600052602060002090601f016020900481019282611e555760008555611e9b565b82601f10611e6e57805160ff1916838001178555611e9b565b82800160010185558215611e9b579182015b82811115611e9b578251825591602001919060010190611e80565b50611ea7929150611eab565b5090565b5b80821115611ea75760008155600101611eac565b80356001600160a01b0381168114611ed757600080fd5b919050565b600060208284031215611eee57600080fd5b61077a82611ec0565b60008060408385031215611f0a57600080fd5b611f1383611ec0565b9150611f2160208401611ec0565b90509250929050565b600080600060608486031215611f3f57600080fd5b611f4884611ec0565b9250611f5660208501611ec0565b9150604084013590509250925092565b60008060408385031215611f7957600080fd5b611f8283611ec0565b9150602083013567ffffffffffffffff80821115611f9f57600080fd5b818501915085601f830112611fb357600080fd5b813581811115611fc557611fc56122c2565b604051601f8201601f19908116603f01168101908382118183101715611fed57611fed6122c2565b8160405282815288602084870101111561200657600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806040838503121561203b57600080fd5b61204483611ec0565b946020939093013593505050565b60006020828403121561206457600080fd5b5035919050565b6000806040838503121561207e57600080fd5b82359150611f2160208401611ec0565b6000602082840312156120a057600080fd5b81356001600160e01b03198116811461077a57600080fd5b600082516120ca818460208701612218565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161210c816017850160208801612218565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161213d816028840160208801612218565b01602801949350505050565b6020815260008251806020840152612168816040850160208701612218565b601f01601f19169190910160400192915050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600082198211156121dd576121dd612296565b500190565b60008160001904831182151516156121fc576121fc612296565b500290565b60008282101561221357612213612296565b500390565b60005b8381101561223357818101518382015260200161221b565b83811115610f045750506000910152565b60008161225357612253612296565b506000190190565b600181811c9082168061226f57607f821691505b6020821081141561229057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220079d91a21ff243dd5838e1a50822b8a050a3d6f87ad11433c62361fd25a911bd64736f6c63430008060033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80634f1ef28611610102578063a217fddf11610095578063d547741f11610064578063d547741f14610535578063dd62ed3e14610555578063e63ab1e91461059b578063f72c0d8b146105bd57600080fd5b8063a217fddf146104ac578063a457c2d7146104c1578063a9059cbb146104e1578063d53913931461050157600080fd5b80638129fc1c116100d15780638129fc1c1461044d5780638456cb591461046257806391d148541461047757806395d89b411461049757600080fd5b80634f1ef286146103cc5780635c975abb146103df57806370a08231146103f757806379cc67901461042d57600080fd5b8063313ce5671161017a578063395093511161014957806339509351146103575780633f4ba83a1461037757806340c10f191461038c57806342966c68146103ac57600080fd5b8063313ce567146102e6578063355274ea1461030257806336568abe146103175780633659cfe61461033757600080fd5b806318160ddd116101b657806318160ddd1461025457806323b872dd14610273578063248a9ca3146102935780632f2ff15d146102c457600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063095ea7b314610234575b600080fd5b3480156101e957600080fd5b506101fd6101f836600461208e565b6105f1565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610628565b6040516102099190612149565b34801561024057600080fd5b506101fd61024f366004612028565b6106ba565b34801561026057600080fd5b506035545b604051908152602001610209565b34801561027f57600080fd5b506101fd61028e366004611f2a565b6106d0565b34801561029f57600080fd5b506102656102ae366004612052565b600090815261012e602052604090206001015490565b3480156102d057600080fd5b506102e46102df36600461206b565b610781565b005b3480156102f257600080fd5b5060405160128152602001610209565b34801561030e57600080fd5b50609754610265565b34801561032357600080fd5b506102e461033236600461206b565b6107ad565b34801561034357600080fd5b506102e4610352366004611edc565b61082b565b34801561036357600080fd5b506101fd610372366004612028565b610852565b34801561038357600080fd5b506102e461088e565b34801561039857600080fd5b506102e46103a7366004612028565b6108af565b3480156103b857600080fd5b506102e46103c7366004612052565b6108e4565b6102e46103da366004611f66565b6108ee565b3480156103eb57600080fd5b5060ca5460ff166101fd565b34801561040357600080fd5b50610265610412366004611edc565b6001600160a01b031660009081526033602052604090205490565b34801561043957600080fd5b506102e4610448366004612028565b610903565b34801561045957600080fd5b506102e4610984565b34801561046e57600080fd5b506102e4610ae2565b34801561048357600080fd5b506101fd61049236600461206b565b610b03565b3480156104a357600080fd5b50610227610b2f565b3480156104b857600080fd5b50610265600081565b3480156104cd57600080fd5b506101fd6104dc366004612028565b610b3e565b3480156104ed57600080fd5b506101fd6104fc366004612028565b610bd7565b34801561050d57600080fd5b506102657f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b34801561054157600080fd5b506102e461055036600461206b565b610be4565b34801561056157600080fd5b50610265610570366004611ef7565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3480156105a757600080fd5b506102656000805160206122d983398151915281565b3480156105c957600080fd5b506102657f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b03198216637965db0b60e01b148061062257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060603680546106379061225b565b80601f01602080910402602001604051908101604052809291908181526020018280546106639061225b565b80156106b05780601f10610685576101008083540402835291602001916106b0565b820191906000526020600020905b81548152906001019060200180831161069357829003601f168201915b5050505050905090565b60006106c7338484610c0b565b50600192915050565b60006106dd848484610d2f565b6001600160a01b0384166000908152603460209081526040808320338452909152902054828110156107675760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107748533858403610c0b565b60019150505b9392505050565b600082815261012e602052604090206001015461079e8133610f0a565b6107a88383610f6e565b505050565b6001600160a01b038116331461081d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161075e565b6108278282610ff5565b5050565b6108348161105d565b61084f81604051806020016040528060008152506000611088565b50565b3360008181526034602090815260408083206001600160a01b038716845290915281205490916106c79185906108899086906121ca565b610c0b565b6000805160206122d98339815191526108a78133610f0a565b61084f611210565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108da8133610f0a565b6107a883836112a3565b61084f33826112ad565b6108f78261105d565b61082782826001611088565b600061090f8333610570565b90508181101561096d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161075e565b61097a8333848403610c0b565b6107a883836112ad565b600054610100900460ff168061099d575060005460ff16155b6109b95760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff161580156109db576000805461ffff19166101011790555b610a216040518060400160405280600981526020016827a6a4902a37b5b2b760b91b815250604051806040016040528060038152602001624f4d4960e81b815250611407565b610a29611486565b610a3f6c097761759c34d7b26fb00000006114ed565b610a4761156a565b610a4f6115d1565b610a57611486565b610a62600033611630565b610a7a6000805160206122d983398151915233611630565b610aa47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633611630565b610ace7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e333611630565b801561084f576000805461ff001916905550565b6000805160206122d9833981519152610afb8133610f0a565b61084f61163a565b600091825261012e602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060603780546106379061225b565b3360009081526034602090815260408083206001600160a01b038616845290915281205482811015610bc05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161075e565b610bcd3385858403610c0b565b5060019392505050565b60006106c7338484610d2f565b600082815261012e6020526040902060010154610c018133610f0a565b6107a88383610ff5565b6001600160a01b038316610c6d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161075e565b6001600160a01b038216610cce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161075e565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610d935760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161075e565b6001600160a01b038216610df55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161075e565b610e008383836116b5565b6001600160a01b03831660009081526033602052604090205481811015610e785760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161075e565b6001600160a01b03808516600090815260336020526040808220858503905591851681529081208054849290610eaf9084906121ca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610efb91815260200190565b60405180910390a35b50505050565b610f148282610b03565b61082757610f2c816001600160a01b031660146116fb565b610f378360206116fb565b604051602001610f489291906120d4565b60408051601f198184030181529082905262461bcd60e51b825261075e91600401612149565b610f788282610b03565b61082757600082815261012e602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610fb13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610fff8282610b03565b1561082757600082815261012e602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e36108278133610f0a565b60006110bb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506110c684611897565b6000835111806110d35750815b156110e4576110e2848461193c565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff1661120957805460ff191660011781556040516001600160a01b038316602482015261116390869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b17905261193c565b50805460ff191681557f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b038381169116146112005760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b606482015260840161075e565b61120985611a27565b5050505050565b60ca5460ff166112595760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161075e565b60ca805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6108278282611a67565b6001600160a01b03821661130d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161075e565b611319826000836116b5565b6001600160a01b0382166000908152603360205260409020548181101561138d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161075e565b6001600160a01b03831660009081526033602052604081208383039055603580548492906113bc908490612201565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600054610100900460ff1680611420575060005460ff16155b61143c5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff1615801561145e576000805461ffff19166101011790555b611466611ad6565b6114708383611b40565b80156107a8576000805461ff0019169055505050565b600054610100900460ff168061149f575060005460ff16155b6114bb5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff161580156114dd576000805461ffff19166101011790555b6114e5611ad6565b610ace611ad6565b600054610100900460ff1680611506575060005460ff16155b6115225760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611544576000805461ffff19166101011790555b61154c611ad6565b61155582611bd5565b8015610827576000805461ff00191690555050565b600054610100900460ff1680611583575060005460ff16155b61159f5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff161580156115c1576000805461ffff19166101011790555b6115c9611ad6565b610ace611c8e565b600054610100900460ff16806115ea575060005460ff16155b6116065760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611628576000805461ffff19166101011790555b6114dd611ad6565b6108278282610f6e565b60ca5460ff16156116805760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161075e565b60ca805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112863390565b60ca5460ff16156107a85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161075e565b6060600061170a8360026121e2565b6117159060026121ca565b67ffffffffffffffff81111561172d5761172d6122c2565b6040519080825280601f01601f191660200182016040528015611757576020820181803683370190505b509050600360fc1b81600081518110611772576117726122ac565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106117a1576117a16122ac565b60200101906001600160f81b031916908160001a90535060006117c58460026121e2565b6117d09060016121ca565b90505b6001811115611848576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611804576118046122ac565b1a60f81b82828151811061181a5761181a6122ac565b60200101906001600160f81b031916908160001a90535060049490941c9361184181612244565b90506117d3565b50831561077a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161075e565b803b6118fb5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161075e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b61199b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161075e565b600080846001600160a01b0316846040516119b691906120b8565b600060405180830381855af49150503d80600081146119f1576040519150601f19603f3d011682016040523d82523d6000602084013e6119f6565b606091505b5091509150611a1e82826040518060600160405280602781526020016122f960279139611d03565b95945050505050565b611a3081611897565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60975481611a7460355490565b611a7e91906121ca565b1115611acc5760405162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015260640161075e565b6108278282611d3c565b600054610100900460ff1680611aef575060005460ff16155b611b0b5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015610ace576000805461ffff1916610101179055801561084f576000805461ff001916905550565b600054610100900460ff1680611b59575060005460ff16155b611b755760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611b97576000805461ffff19166101011790555b8251611baa906036906020860190611e27565b508151611bbe906037906020850190611e27565b5080156107a8576000805461ff0019169055505050565b600054610100900460ff1680611bee575060005460ff16155b611c0a5760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611c2c576000805461ffff19166101011790555b60008211611c745760405162461bcd60e51b8152602060048201526015602482015274045524332304361707065643a20636170206973203605c1b604482015260640161075e565b60978290558015610827576000805461ff00191690555050565b600054610100900460ff1680611ca7575060005460ff16155b611cc35760405162461bcd60e51b815260040161075e9061217c565b600054610100900460ff16158015611ce5576000805461ffff19166101011790555b60ca805460ff19169055801561084f576000805461ff001916905550565b60608315611d1257508161077a565b825115611d225782518084602001fd5b8160405162461bcd60e51b815260040161075e9190612149565b6001600160a01b038216611d925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161075e565b611d9e600083836116b5565b8060356000828254611db091906121ca565b90915550506001600160a01b03821660009081526033602052604081208054839290611ddd9084906121ca565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054611e339061225b565b90600052602060002090601f016020900481019282611e555760008555611e9b565b82601f10611e6e57805160ff1916838001178555611e9b565b82800160010185558215611e9b579182015b82811115611e9b578251825591602001919060010190611e80565b50611ea7929150611eab565b5090565b5b80821115611ea75760008155600101611eac565b80356001600160a01b0381168114611ed757600080fd5b919050565b600060208284031215611eee57600080fd5b61077a82611ec0565b60008060408385031215611f0a57600080fd5b611f1383611ec0565b9150611f2160208401611ec0565b90509250929050565b600080600060608486031215611f3f57600080fd5b611f4884611ec0565b9250611f5660208501611ec0565b9150604084013590509250925092565b60008060408385031215611f7957600080fd5b611f8283611ec0565b9150602083013567ffffffffffffffff80821115611f9f57600080fd5b818501915085601f830112611fb357600080fd5b813581811115611fc557611fc56122c2565b604051601f8201601f19908116603f01168101908382118183101715611fed57611fed6122c2565b8160405282815288602084870101111561200657600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b6000806040838503121561203b57600080fd5b61204483611ec0565b946020939093013593505050565b60006020828403121561206457600080fd5b5035919050565b6000806040838503121561207e57600080fd5b82359150611f2160208401611ec0565b6000602082840312156120a057600080fd5b81356001600160e01b03198116811461077a57600080fd5b600082516120ca818460208701612218565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161210c816017850160208801612218565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161213d816028840160208801612218565b01602801949350505050565b6020815260008251806020840152612168816040850160208701612218565b601f01601f19169190910160400192915050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600082198211156121dd576121dd612296565b500190565b60008160001904831182151516156121fc576121fc612296565b500290565b60008282101561221357612213612296565b500390565b60005b8381101561223357818101518382015260200161221b565b83811115610f045750506000910152565b60008161225357612253612296565b506000190190565b600181811c9082168061226f57607f821691505b6020821081141561229057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220079d91a21ff243dd5838e1a50822b8a050a3d6f87ad11433c62361fd25a911bd64736f6c63430008060033
Deployed Bytecode Sourcemap
61780:1713:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33960:291;;;;;;;;;;-1:-1:-1;33960:291:0;;;;;:::i;:::-;;:::i;:::-;;;4603:14:1;;4596:22;4578:41;;4566:2;4551:18;33960:291:0;;;;;;;;9091:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11399:210::-;;;;;;;;;;-1:-1:-1;11399:210:0;;;;;:::i;:::-;;:::i;10211:108::-;;;;;;;;;;-1:-1:-1;10299:12:0;;10211:108;;;4776:25:1;;;4764:2;4749:18;10211:108:0;4731:76:1;12091:529:0;;;;;;;;;;-1:-1:-1;12091:529:0;;;;;:::i;:::-;;:::i;35521:123::-;;;;;;;;;;-1:-1:-1;35521:123:0;;;;;:::i;:::-;35587:7;35614:12;;;:6;:12;;;;;:22;;;;35521:123;35906:188;;;;;;;;;;-1:-1:-1;35906:188:0;;;;;:::i;:::-;;:::i;:::-;;10053:93;;;;;;;;;;-1:-1:-1;10053:93:0;;10136:2;13761:36:1;;13749:2;13734:18;10053:93:0;13716:87:1;39774:83:0;;;;;;;;;;-1:-1:-1;39845:4:0;;39774:83;;37036:287;;;;;;;;;;-1:-1:-1;37036:287:0;;;;;:::i;:::-;;:::i;60489:189::-;;;;;;;;;;-1:-1:-1;60489:189:0;;;;;:::i;:::-;;:::i;13029:297::-;;;;;;;;;;-1:-1:-1;13029:297:0;;;;;:::i;:::-;;:::i;62758:77::-;;;;;;;;;;;;;:::i;62843:107::-;;;;;;;;;;-1:-1:-1;62843:107:0;;;;;:::i;:::-;;:::i;20285:91::-;;;;;;;;;;-1:-1:-1;20285:91:0;;;;;:::i;:::-;;:::i;60937:249::-;;;;;;:::i;:::-;;:::i;22452:86::-;;;;;;;;;;-1:-1:-1;22523:7:0;;;;22452:86;;10382:177;;;;;;;;;;-1:-1:-1;10382:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;10533:18:0;10501:7;10533:18;;;:9;:18;;;;;;;10382:177;20695:405;;;;;;;;;;-1:-1:-1;20695:405:0;;;;;:::i;:::-;;:::i;62203:466::-;;;;;;;;;;;;;:::i;62677:73::-;;;;;;;;;;;;;:::i;34343:180::-;;;;;;;;;;-1:-1:-1;34343:180:0;;;;;:::i;:::-;;:::i;9310:104::-;;;;;;;;;;;;;:::i;33347:49::-;;;;;;;;;;-1:-1:-1;33347:49:0;33392:4;33347:49;;13829:482;;;;;;;;;;-1:-1:-1;13829:482:0;;;;;:::i;:::-;;:::i;10772:216::-;;;;;;;;;;-1:-1:-1;10772:216:0;;;;;:::i;:::-;;:::i;62059:62::-;;;;;;;;;;;;62097:24;62059:62;;36339:190;;;;;;;;;;-1:-1:-1;36339:190:0;;;;;:::i;:::-;;:::i;11051:201::-;;;;;;;;;;-1:-1:-1;11051:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;11217:18:0;;;11185:7;11217:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11051:201;61990:62;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;61990:62:0;;62128:66;;;;;;;;;;;;62168:26;62128:66;;33960:291;34090:4;-1:-1:-1;;;;;;34132:58:0;;-1:-1:-1;;;34132:58:0;;:111;;-1:-1:-1;;;;;;;;;;30996:51:0;;;34207:36;34112:131;33960:291;-1:-1:-1;;33960:291:0:o;9091:100::-;9145:13;9178:5;9171:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9091:100;:::o;11399:210::-;11518:4;11540:39;6481:10;11563:7;11572:6;11540:8;:39::i;:::-;-1:-1:-1;11597:4:0;11399:210;;;;:::o;12091:529::-;12231:4;12248:36;12258:6;12266:9;12277:6;12248:9;:36::i;:::-;-1:-1:-1;;;;;12324:19:0;;12297:24;12324:19;;;:11;:19;;;;;;;;6481:10;12324:33;;;;;;;;12390:26;;;;12368:116;;;;-1:-1:-1;;;12368:116:0;;9669:2:1;12368:116:0;;;9651:21:1;9708:2;9688:18;;;9681:30;9747:34;9727:18;;;9720:62;-1:-1:-1;;;9798:18:1;;;9791:38;9846:19;;12368:116:0;;;;;;;;;12520:57;12529:6;6481:10;12570:6;12551:16;:25;12520:8;:57::i;:::-;12608:4;12601:11;;;12091:529;;;;;;:::o;35906:188::-;35587:7;35614:12;;;:6;:12;;;;;:22;;;33838:30;33849:4;6481:10;33838;:30::i;:::-;36061:25:::1;36072:4;36078:7;36061:10;:25::i;:::-;35906:188:::0;;;:::o;37036:287::-;-1:-1:-1;;;;;37178:23:0;;6481:10;37178:23;37156:120;;;;-1:-1:-1;;;37156:120:0;;12863:2:1;37156:120:0;;;12845:21:1;12902:2;12882:18;;;12875:30;12941:34;12921:18;;;12914:62;-1:-1:-1;;;12992:18:1;;;12985:45;13047:19;;37156:120:0;12835:237:1;37156:120:0;37289:26;37301:4;37307:7;37289:11;:26::i;:::-;37036:287;;:::o;60489:189::-;60563:36;60581:17;60563;:36::i;:::-;60610:60;60634:17;60653:9;;;;;;;;;;;;60664:5;60610:23;:60::i;:::-;60489:189;:::o;13029:297::-;6481:10;13144:4;13238:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13238:34:0;;;;;;;;;;13144:4;;13166:130;;13216:7;;13238:47;;13275:10;;13238:47;:::i;:::-;13166:8;:130::i;62758:77::-;-1:-1:-1;;;;;;;;;;;33838:30:0;62028:24;6481:10;33838;:30::i;:::-;62817:10:::1;:8;:10::i;62843:107::-:0;62097:24;33838:30;62097:24;6481:10;33838;:30::i;:::-;62925:17:::1;62931:2;62935:6;62925:5;:17::i;20285:91::-:0;20341:27;6481:10;20361:6;20341:5;:27::i;60937:249::-;61077:36;61095:17;61077;:36::i;:::-;61124:54;61148:17;61167:4;61173;61124:23;:54::i;20695:405::-;20772:24;20799:32;20809:7;6481:10;11051:201;:::i;20799:32::-;20772:59;;20884:6;20864:16;:26;;20842:112;;;;-1:-1:-1;;;20842:112:0;;10078:2:1;20842:112:0;;;10060:21:1;10117:2;10097:18;;;10090:30;10156:34;10136:18;;;10129:62;-1:-1:-1;;;10207:18:1;;;10200:34;10251:19;;20842:112:0;10050:226:1;20842:112:0;20990:58;20999:7;6481:10;21041:6;21022:16;:25;20990:8;:58::i;:::-;21070:22;21076:7;21085:6;21070:5;:22::i;62203:466::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;62255:32:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;62255:32:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;62255:32:0::1;;::::0;:12:::1;:32::i;:::-;62298:22;:20;:22::i;:::-;62331:39;62350:19;62331:18;:39::i;:::-;62381:17;:15;:17::i;:::-;62409:22;:20;:22::i;:::-;62442:24;:22;:24::i;:::-;62479:42;33392:4;62510:10;62479;:42::i;:::-;62532:35;-1:-1:-1::0;;;;;;;;;;;62556:10:0::1;62532;:35::i;:::-;62578;62097:24;62602:10;62578;:35::i;:::-;62624:37;62168:26;62650:10;62624;:37::i;:::-;5484:14:::0;5480:68;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;62203:466::o;62677:73::-;-1:-1:-1;;;;;;;;;;;33838:30:0;62028:24;6481:10;33838;:30::i;:::-;62734:8:::1;:6;:8::i;34343:180::-:0;34457:4;34486:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;34486:29:0;;;;;;;;;;;;;;;34343:180::o;9310:104::-;9366:13;9399:7;9392:14;;;;;:::i;13829:482::-;6481:10;13949:4;13998:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13998:34:0;;;;;;;;;;14065:35;;;;14043:122;;;;-1:-1:-1;;;14043:122:0;;12457:2:1;14043:122:0;;;12439:21:1;12496:2;12476:18;;;12469:30;12535:34;12515:18;;;12508:62;-1:-1:-1;;;12586:18:1;;;12579:35;12631:19;;14043:122:0;12429:227:1;14043:122:0;14201:67;6481:10;14224:7;14252:15;14233:16;:34;14201:8;:67::i;:::-;-1:-1:-1;14299:4:0;;13829:482;-1:-1:-1;;;13829:482:0:o;10772:216::-;10894:4;10916:42;6481:10;10940:9;10951:6;10916:9;:42::i;36339:190::-;35587:7;35614:12;;;:6;:12;;;;;:22;;;33838:30;33849:4;6481:10;33838;:30::i;:::-;36495:26:::1;36507:4;36513:7;36495:11;:26::i;17619:380::-:0;-1:-1:-1;;;;;17755:19:0;;17747:68;;;;-1:-1:-1;;;17747:68:0;;12052:2:1;17747:68:0;;;12034:21:1;12091:2;12071:18;;;12064:30;12130:34;12110:18;;;12103:62;-1:-1:-1;;;12181:18:1;;;12174:34;12225:19;;17747:68:0;12024:226:1;17747:68:0;-1:-1:-1;;;;;17834:21:0;;17826:68;;;;-1:-1:-1;;;17826:68:0;;7685:2:1;17826:68:0;;;7667:21:1;7724:2;7704:18;;;7697:30;7763:34;7743:18;;;7736:62;-1:-1:-1;;;7814:18:1;;;7807:32;7856:19;;17826:68:0;7657:224:1;17826:68:0;-1:-1:-1;;;;;17907:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17959:32;;4776:25:1;;;17959:32:0;;4749:18:1;17959:32:0;;;;;;;17619:380;;;:::o;14801:770::-;-1:-1:-1;;;;;14941:20:0;;14933:70;;;;-1:-1:-1;;;14933:70:0;;11292:2:1;14933:70:0;;;11274:21:1;11331:2;11311:18;;;11304:30;11370:34;11350:18;;;11343:62;-1:-1:-1;;;11421:18:1;;;11414:35;11466:19;;14933:70:0;11264:227:1;14933:70:0;-1:-1:-1;;;;;15022:23:0;;15014:71;;;;-1:-1:-1;;;15014:71:0;;5763:2:1;15014:71:0;;;5745:21:1;5802:2;5782:18;;;5775:30;5841:34;5821:18;;;5814:62;-1:-1:-1;;;5892:18:1;;;5885:33;5935:19;;15014:71:0;5735:225:1;15014:71:0;15098:47;15119:6;15127:9;15138:6;15098:20;:47::i;:::-;-1:-1:-1;;;;;15182:17:0;;15158:21;15182:17;;;:9;:17;;;;;;15232:23;;;;15210:111;;;;-1:-1:-1;;;15210:111:0;;8088:2:1;15210:111:0;;;8070:21:1;8127:2;8107:18;;;8100:30;8166:34;8146:18;;;8139:62;-1:-1:-1;;;8217:18:1;;;8210:36;8263:19;;15210:111:0;8060:228:1;15210:111:0;-1:-1:-1;;;;;15357:17:0;;;;;;;:9;:17;;;;;;15377:22;;;15357:42;;15421:20;;;;;;;;:30;;15393:6;;15357:17;15421:30;;15393:6;;15421:30;:::i;:::-;;;;;;;;15486:9;-1:-1:-1;;;;;15469:35:0;15478:6;-1:-1:-1;;;;;15469:35:0;;15497:6;15469:35;;;;4776:25:1;;4764:2;4749:18;;4731:76;15469:35:0;;;;;;;;15517:46;14922:649;14801:770;;;:::o;34813:519::-;34894:22;34902:4;34908:7;34894;:22::i;:::-;34889:436;;35082:52;35121:7;-1:-1:-1;;;;;35082:52:0;35131:2;35082:30;:52::i;:::-;35207:49;35246:4;35253:2;35207:30;:49::i;:::-;34987:292;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;34987:292:0;;;;;;;;;;-1:-1:-1;;;34933:380:0;;;;;;;:::i;38409:229::-;38484:22;38492:4;38498:7;38484;:22::i;:::-;38479:152;;38523:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;38523:29:0;;;;;;;;;:36;;-1:-1:-1;;38523:36:0;38555:4;38523:36;;;38606:12;6481:10;;6401:98;38606:12;-1:-1:-1;;;;;38579:40:0;38597:7;-1:-1:-1;;;;;38579:40:0;38591:4;38579:40;;;;;;;;;;38409:229;;:::o;38646:230::-;38721:22;38729:4;38735:7;38721;:22::i;:::-;38717:152;;;38792:5;38760:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;38760:29:0;;;;;;;;;;:37;;-1:-1:-1;;38760:37:0;;;38817:40;6481:10;;38760:12;;38817:40;;38792:5;38817:40;38646:230;;:::o;63360:130::-;62168:26;33838:30;62168:26;6481:10;33838;:30::i;53775:1362::-;53924:25;53952:20;51998:66;52372:65;-1:-1:-1;;;;;52372:65:0;;52279:166;53952:20;53924:48;;54028:37;54047:17;54028:18;:37::i;:::-;54094:1;54080:4;:11;:15;:28;;;;54099:9;54080:28;54076:107;;;54125:46;54147:17;54166:4;54125:21;:46::i;:::-;;54076:107;51641:66;54431:21;;;;54426:704;;54546:28;;-1:-1:-1;;54546:28:0;54570:4;54546:28;;;54665:64;;-1:-1:-1;;;;;4394:32:1;;54665:64:0;;;4376:51:1;54589:155:0;;54629:17;;4349:18:1;;54665:64:0;;;-1:-1:-1;;54665:64:0;;;;;;;;;;;;;;-1:-1:-1;;;;;54665:64:0;-1:-1:-1;;;54665:64:0;;;54589:21;:155::i;:::-;-1:-1:-1;54759:29:0;;-1:-1:-1;;54759:29:0;;;51998:66;52372:65;-1:-1:-1;;;;;54874:41:0;;;52372:65;;54874:41;54848:150;;;;-1:-1:-1;;;54848:150:0;;7269:2:1;54848:150:0;;;7251:21:1;7308:2;7288:18;;;7281:30;7347:34;7327:18;;;7320:62;-1:-1:-1;;;7398:18:1;;;7391:45;7453:19;;54848:150:0;7241:237:1;54848:150:0;55089:29;55100:17;55089:10;:29::i;:::-;53913:1224;;53775:1362;;;:::o;23511:120::-;22523:7;;;;23047:41;;;;-1:-1:-1;;;23047:41:0;;6517:2:1;23047:41:0;;;6499:21:1;6556:2;6536:18;;;6529:30;-1:-1:-1;;;6575:18:1;;;6568:50;6635:18;;23047:41:0;6489:170:1;23047:41:0;23570:7:::1;:15:::0;;-1:-1:-1;;23570:15:0::1;::::0;;23601:22:::1;6481:10:::0;23610:12:::1;23601:22;::::0;-1:-1:-1;;;;;4394:32:1;;;4376:51;;4364:2;4349:18;23601:22:0::1;;;;;;;23511:120::o:0;62958:185::-;63112:23;63124:2;63128:6;63112:11;:23::i;16590:591::-;-1:-1:-1;;;;;16674:21:0;;16666:67;;;;-1:-1:-1;;;16666:67:0;;10483:2:1;16666:67:0;;;10465:21:1;10522:2;10502:18;;;10495:30;10561:34;10541:18;;;10534:62;-1:-1:-1;;;10612:18:1;;;10605:31;10653:19;;16666:67:0;10455:223:1;16666:67:0;16746:49;16767:7;16784:1;16788:6;16746:20;:49::i;:::-;-1:-1:-1;;;;;16833:18:0;;16808:22;16833:18;;;:9;:18;;;;;;16870:24;;;;16862:71;;;;-1:-1:-1;;;16862:71:0;;6866:2:1;16862:71:0;;;6848:21:1;6905:2;6885:18;;;6878:30;6944:34;6924:18;;;6917:62;-1:-1:-1;;;6995:18:1;;;6988:32;7037:19;;16862:71:0;6838:224:1;16862:71:0;-1:-1:-1;;;;;16969:18:0;;;;;;:9;:18;;;;;16990:23;;;16969:44;;17035:12;:22;;17007:6;;16969:18;17035:22;;17007:6;;17035:22;:::i;:::-;;;;-1:-1:-1;;17075:37:0;;4776:25:1;;;17101:1:0;;-1:-1:-1;;;;;17075:37:0;;;;;4764:2:1;4749:18;17075:37:0;;;;;;;35906:188;;;:::o;8629:204::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;8750:26:::1;:24;:26::i;:::-;8787:38;8810:5;8817:7;8787:22;:38::i;:::-;5484:14:::0;5480:68;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;8629:204;;:::o;19955:141::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;20019:26:::1;:24;:26::i;:::-;20056:32;:30;:32::i;39373:153::-:0;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;39447:26:::1;:24;:26::i;:::-;39484:34;39513:4;39484:28;:34::i;:::-;5484:14:::0;5480:68;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;39373:153;:::o;22121:131::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;22180:26:::1;:24;:26::i;:::-;22217:27;:25;:27::i;32934:177::-:0;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;32998:26:::1;:24;:26::i;37906:112::-:0;37985:25;37996:4;38002:7;37985:10;:25::i;23252:118::-;22523:7;;;;22777:9;22769:38;;;;-1:-1:-1;;;22769:38:0;;8495:2:1;22769:38:0;;;8477:21:1;8534:2;8514:18;;;8507:30;-1:-1:-1;;;8553:18:1;;;8546:46;8609:18;;22769:38:0;8467:166:1;22769:38:0;23312:7:::1;:14:::0;;-1:-1:-1;;23312:14:0::1;23322:4;23312:14;::::0;;23342:20:::1;23349:12;6481:10:::0;;6401:98;63151:201;22523:7;;;;22777:9;22769:38;;;;-1:-1:-1;;;22769:38:0;;8495:2:1;22769:38:0;;;8477:21:1;8534:2;8514:18;;;8507:30;-1:-1:-1;;;8553:18:1;;;8546:46;8609:18;;22769:38:0;8467:166:1;28452:483:0;28554:13;28585:19;28617:10;28621:6;28617:1;:10;:::i;:::-;:14;;28630:1;28617:14;:::i;:::-;28607:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28607:25:0;;28585:47;;-1:-1:-1;;;28643:6:0;28650:1;28643:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;28643:15:0;;;;;;;;;-1:-1:-1;;;28669:6:0;28676:1;28669:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;28669:15:0;;;;;;;;-1:-1:-1;28700:9:0;28712:10;28716:6;28712:1;:10;:::i;:::-;:14;;28725:1;28712:14;:::i;:::-;28700:26;;28695:135;28732:1;28728;:5;28695:135;;;-1:-1:-1;;;28780:5:0;28788:3;28780:11;28767:25;;;;;;;:::i;:::-;;;;28755:6;28762:1;28755:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;28755:37:0;;;;;;;;-1:-1:-1;28817:1:0;28807:11;;;;;28735:3;;;:::i;:::-;;;28695:135;;;-1:-1:-1;28848:10:0;;28840:55;;;;-1:-1:-1;;;28840:55:0;;5402:2:1;28840:55:0;;;5384:21:1;;;5421:18;;;5414:30;5480:34;5460:18;;;5453:62;5532:18;;28840:55:0;5374:182:1;52541:349:0;41797:20;;52615:143;;;;-1:-1:-1;;;52615:143:0;;9255:2:1;52615:143:0;;;9237:21:1;9294:2;9274:18;;;9267:30;9333:34;9313:18;;;9306:62;-1:-1:-1;;;9384:18:1;;;9377:43;9437:19;;52615:143:0;9227:235:1;52615:143:0;51998:66;52769:113;;-1:-1:-1;;;;;;52769:113:0;-1:-1:-1;;;;;52769:113:0;;;;;;;;;;52541:349::o;58579:600::-;58680:12;41797:20;;58710:125;;;;-1:-1:-1;;;58710:125:0;;10885:2:1;58710:125:0;;;10867:21:1;10924:2;10904:18;;;10897:30;10963:34;10943:18;;;10936:62;-1:-1:-1;;;11014:18:1;;;11007:36;11060:19;;58710:125:0;10857:228:1;58710:125:0;58909:12;58923:23;58950:6;-1:-1:-1;;;;;58950:19:0;58970:4;58950:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58908:67;;;;59006:165;59060:7;59086:10;59006:165;;;;;;;;;;;;;;;;;:35;:165::i;:::-;58986:185;58579:600;-1:-1:-1;;;;;58579:600:0:o;53003:155::-;53070:37;53089:17;53070:18;:37::i;:::-;53123:27;;-1:-1:-1;;;;;53123:27:0;;;;;;;;53003:155;:::o;39915:255::-;39845:4;;40055:6;40022:30;10299:12;;;10211:108;40022:30;:39;;;;:::i;:::-;:48;;40000:123;;;;-1:-1:-1;;;40000:123:0;;11698:2:1;40000:123:0;;;11680:21:1;11737:2;11717:18;;;11710:30;11776:27;11756:18;;;11749:55;11821:18;;40000:123:0;11670:175:1;40000:123:0;40134:28;40146:7;40155:6;40134:11;:28::i;6334:59::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5480:68;;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;6334:59::o;8841:180::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;8972:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;8996:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;5484:14:::0;5480:68;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;8841:180;;:::o;39534:156::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;39633:1:::1;39626:4;:8;39618:42;;;::::0;-1:-1:-1;;;39618:42:0;;6167:2:1;39618:42:0::1;::::0;::::1;6149:21:1::0;6206:2;6186:18;;;6179:30;-1:-1:-1;;;6225:18:1;;;6218:51;6286:18;;39618:42:0::1;6139:171:1::0;39618:42:0::1;39671:4;:11:::0;;;5480:68;;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;39534:156;:::o;22260:92::-;5189:13;;;;;;;;:30;;-1:-1:-1;5207:12:0;;;;5206:13;5189:30;5167:126;;;;-1:-1:-1;;;5167:126:0;;;;;;;:::i;:::-;5306:19;5329:13;;;;;;5328:14;5353:101;;;;5388:13;:20;;-1:-1:-1;;5423:19:0;;;;;5353:101;22329:7:::1;:15:::0;;-1:-1:-1;;22329:15:0::1;::::0;;5480:68;;;;5531:5;5515:21;;-1:-1:-1;;5515:21:0;;;5156:399;22260:92::o;47474:712::-;47624:12;47653:7;47649:530;;;-1:-1:-1;47684:10:0;47677:17;;47649:530;47798:17;;:21;47794:374;;47996:10;47990:17;48057:15;48044:10;48040:2;48036:19;48029:44;47794:374;48139:12;48132:20;;-1:-1:-1;;;48132:20:0;;;;;;;;:::i;15858:399::-;-1:-1:-1;;;;;15942:21:0;;15934:65;;;;-1:-1:-1;;;15934:65:0;;13279:2:1;15934:65:0;;;13261:21:1;13318:2;13298:18;;;13291:30;13357:33;13337:18;;;13330:61;13408:18;;15934:65:0;13251:181:1;15934:65:0;16012:49;16041:1;16045:7;16054:6;16012:20;:49::i;:::-;16090:6;16074:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;16107:18:0;;;;;;:9;:18;;;;;:28;;16129:6;;16107:18;:28;;16129:6;;16107:28;:::i;:::-;;;;-1:-1:-1;;16151:37:0;;4776:25:1;;;-1:-1:-1;;;;;16151:37:0;;;16168:1;;16151:37;;4764:2:1;4749:18;16151:37:0;;;;;;;37036:287;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:995::-;1058:6;1066;1119:2;1107:9;1098:7;1094:23;1090:32;1087:2;;;1135:1;1132;1125:12;1087:2;1158:29;1177:9;1158:29;:::i;:::-;1148:39;;1238:2;1227:9;1223:18;1210:32;1261:18;1302:2;1294:6;1291:14;1288:2;;;1318:1;1315;1308:12;1288:2;1356:6;1345:9;1341:22;1331:32;;1401:7;1394:4;1390:2;1386:13;1382:27;1372:2;;1423:1;1420;1413:12;1372:2;1459;1446:16;1481:2;1477;1474:10;1471:2;;;1487:18;;:::i;:::-;1562:2;1556:9;1530:2;1616:13;;-1:-1:-1;;1612:22:1;;;1636:2;1608:31;1604:40;1592:53;;;1660:18;;;1680:22;;;1657:46;1654:2;;;1706:18;;:::i;:::-;1746:10;1742:2;1735:22;1781:2;1773:6;1766:18;1821:7;1816:2;1811;1807;1803:11;1799:20;1796:33;1793:2;;;1842:1;1839;1832:12;1793:2;1898;1893;1889;1885:11;1880:2;1872:6;1868:15;1855:46;1943:1;1938:2;1933;1925:6;1921:15;1917:24;1910:35;1964:6;1954:16;;;;;;;1077:899;;;;;:::o;1981:254::-;2049:6;2057;2110:2;2098:9;2089:7;2085:23;2081:32;2078:2;;;2126:1;2123;2116:12;2078:2;2149:29;2168:9;2149:29;:::i;:::-;2139:39;2225:2;2210:18;;;;2197:32;;-1:-1:-1;;;2068:167:1:o;2240:180::-;2299:6;2352:2;2340:9;2331:7;2327:23;2323:32;2320:2;;;2368:1;2365;2358:12;2320:2;-1:-1:-1;2391:23:1;;2310:110;-1:-1:-1;2310:110:1:o;2425:254::-;2493:6;2501;2554:2;2542:9;2533:7;2529:23;2525:32;2522:2;;;2570:1;2567;2560:12;2522:2;2606:9;2593:23;2583:33;;2635:38;2669:2;2658:9;2654:18;2635:38;:::i;2684:286::-;2742:6;2795:2;2783:9;2774:7;2770:23;2766:32;2763:2;;;2811:1;2808;2801:12;2763:2;2837:23;;-1:-1:-1;;;;;;2889:32:1;;2879:43;;2869:2;;2936:1;2933;2926:12;3160:274;3289:3;3327:6;3321:13;3343:53;3389:6;3384:3;3377:4;3369:6;3365:17;3343:53;:::i;:::-;3412:16;;;;;3297:137;-1:-1:-1;;3297:137:1:o;3439:786::-;3850:25;3845:3;3838:38;3820:3;3905:6;3899:13;3921:62;3976:6;3971:2;3966:3;3962:12;3955:4;3947:6;3943:17;3921:62;:::i;:::-;-1:-1:-1;;;4042:2:1;4002:16;;;4034:11;;;4027:40;4092:13;;4114:63;4092:13;4163:2;4155:11;;4148:4;4136:17;;4114:63;:::i;:::-;4197:17;4216:2;4193:26;;3828:397;-1:-1:-1;;;;3828:397:1:o;4812:383::-;4961:2;4950:9;4943:21;4924:4;4993:6;4987:13;5036:6;5031:2;5020:9;5016:18;5009:34;5052:66;5111:6;5106:2;5095:9;5091:18;5086:2;5078:6;5074:15;5052:66;:::i;:::-;5179:2;5158:15;-1:-1:-1;;5154:29:1;5139:45;;;;5186:2;5135:54;;4933:262;-1:-1:-1;;4933:262:1:o;8638:410::-;8840:2;8822:21;;;8879:2;8859:18;;;8852:30;8918:34;8913:2;8898:18;;8891:62;-1:-1:-1;;;8984:2:1;8969:18;;8962:44;9038:3;9023:19;;8812:236::o;13808:128::-;13848:3;13879:1;13875:6;13872:1;13869:13;13866:2;;;13885:18;;:::i;:::-;-1:-1:-1;13921:9:1;;13856:80::o;13941:168::-;13981:7;14047:1;14043;14039:6;14035:14;14032:1;14029:21;14024:1;14017:9;14010:17;14006:45;14003:2;;;14054:18;;:::i;:::-;-1:-1:-1;14094:9:1;;13993:116::o;14114:125::-;14154:4;14182:1;14179;14176:8;14173:2;;;14187:18;;:::i;:::-;-1:-1:-1;14224:9:1;;14163:76::o;14244:258::-;14316:1;14326:113;14340:6;14337:1;14334:13;14326:113;;;14416:11;;;14410:18;14397:11;;;14390:39;14362:2;14355:10;14326:113;;;14457:6;14454:1;14451:13;14448:2;;;-1:-1:-1;;14492:1:1;14474:16;;14467:27;14297:205::o;14507:136::-;14546:3;14574:5;14564:2;;14583:18;;:::i;:::-;-1:-1:-1;;;14619:18:1;;14554:89::o;14648:380::-;14727:1;14723:12;;;;14770;;;14791:2;;14845:4;14837:6;14833:17;14823:27;;14791:2;14898;14890:6;14887:14;14867:18;14864:38;14861:2;;;14944:10;14939:3;14935:20;14932:1;14925:31;14979:4;14976:1;14969:15;15007:4;15004:1;14997:15;14861:2;;14703:325;;;:::o;15033:127::-;15094:10;15089:3;15085:20;15082:1;15075:31;15125:4;15122:1;15115:15;15149:4;15146:1;15139:15;15165:127;15226:10;15221:3;15217:20;15214:1;15207:31;15257:4;15254:1;15247:15;15281:4;15278:1;15271:15;15297:127;15358:10;15353:3;15349:20;15346:1;15339:31;15389:4;15386:1;15379:15;15413:4;15410:1;15403:15
Swarm Source
ipfs://079d91a21ff243dd5838e1a50822b8a050a3d6f87ad11433c62361fd25a911bd
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.