Contract Address Details

0xAfB95CC0BD320648B3E8Df6223d9CDD05EbeDC64

Token
Mira Token (MIRA)
Creator
0xe01c8d–e085f7 at 0x4175e8–76dbb2
Balance
0 CSB
Tokens
Fetching tokens...
Transactions
2,330 Transactions
Transfers
0 Transfers
Gas Used
207,449,813
Last Balance Update
91846404
Contract name:
MiraToken




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
200
Verified at
2023-02-08T03:56:15.149125Z

Constructor Arguments

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f90af4546e8c831a3b91200e6d41d70684b525f2000000000000000000000000000000000000000000000000000000000000000a4d69726120546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49524100000000000000000000000000000000000000000000000000000000

Arg [0] (string) : Mira Token
Arg [1] (string) : MIRA
Arg [2] (address) : 0xf90af4546e8c831a3b91200e6d41d70684b525f2

              

contracts/token/MiraToken.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import "../interfaces/IERC20Mintable.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
import "@openzeppelin/contracts/token/ERC777/ERC777.sol";
contract MiraToken is Context, AccessControlEnumerable, IERC20Mintable, ERC777 {
bytes32 public constant BLOCK_ROLE = keccak256("BLOCK_ROLE");
constructor(
string memory name_,
string memory symbol_,
address admin
) ERC777(name_, symbol_, new address[](0)) {
// Grants `DEFAULT_ADMIN_ROLE` to the account that deploys the contract
_setupRole(DEFAULT_ADMIN_ROLE, admin);
}
/**
* @dev Creates `amount` new tokens for `to`.
* Requirements:
* - the caller must have the `DEFAULT_ADMIN_ROLE`.
*/
function mint(address to, uint256 amount) external override onlyRole(DEFAULT_ADMIN_ROLE) {
_mint(to, amount, "", "");
}
/**
* @dev Revokes `role` from the calling account.
* Requirements:
* - the caller must have the `DEFAULT_ADMIN_ROLE`.
*/
function renounceRole(
bytes32 role,
address account
) public override(AccessControl, IAccessControl) onlyRole(DEFAULT_ADMIN_ROLE) {
super.renounceRole(role, account);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC777/ERC777.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC777/ERC777.sol)
pragma solidity ^0.8.0;
import "./IERC777.sol";
import "./IERC777Recipient.sol";
import "./IERC777Sender.sol";
import "../ERC20/IERC20.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/IERC1820Registry.sol";
/**
* @dev Implementation of the {IERC777} 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}.
*
* Support for ERC20 is included in this contract, as specified by the EIP: both
* the ERC777 and ERC20 interfaces can be safely used when interacting with it.
* Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
* movements.
*
* Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
* are no special restrictions in the amount of tokens that created, moved, or
* destroyed. This makes integration with ERC20 applications seamless.
*/
contract ERC777 is Context, IERC777, IERC20 {
using Address for address;
IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
mapping(address => uint256) private _balances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC777/IERC777.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC777/IERC777.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC777Token standard as defined in the EIP.
*
* This contract uses the
* https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
* token holders and recipients react to token movements by using setting implementers
* for the associated interfaces in said registry. See {IERC1820Registry} and
* {ERC1820Implementer}.
*/
interface IERC777 {
/**
* @dev Emitted when `amount` tokens are created by `operator` and assigned to `to`.
*
* Note that some additional user `data` and `operatorData` can be logged in the event.
*/
event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);
/**
* @dev Emitted when `operator` destroys `amount` tokens from `account`.
*
* Note that some additional user `data` and `operatorData` can be logged in the event.
*/
event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);
/**
* @dev Emitted when `operator` is made operator for `tokenHolder`.
*/
event AuthorizedOperator(address indexed operator, address indexed tokenHolder);
/**
* @dev Emitted when `operator` is revoked its operator status for `tokenHolder`.
*/
event RevokedOperator(address indexed operator, address indexed tokenHolder);
/**
* @dev Returns the name of the token.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
*
* Accounts can be notified of {IERC777} tokens being sent to them by having a
* contract implement this interface (contract holders can be their own
* implementer) and registering it on the
* https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
*
* See {IERC1820Registry} and {ERC1820Implementer}.
*/
interface IERC777Recipient {
/**
* @dev Called by an {IERC777} token contract whenever tokens are being
* moved or created into a registered account (`to`). The type of operation
* is conveyed by `from` being the zero address or not.
*
* This call occurs _after_ the token contract's state is updated, so
* {IERC777-balanceOf}, etc., can be used to query the post-operation state.
*
* This function may revert to prevent the operation from being executed.
*/
function tokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC777/IERC777Sender.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Sender.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC777TokensSender standard as defined in the EIP.
*
* {IERC777} Token holders can be notified of operations performed on their
* tokens by having a contract implement this interface (contract holders can be
* their own implementer) and registering it on the
* https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
*
* See {IERC1820Registry} and {ERC1820Implementer}.
*/
interface IERC777Sender {
/**
* @dev Called by an {IERC777} token contract whenever a registered holder's
* (`from`) tokens are about to be moved or destroyed. The type of operation
* is conveyed by `to` being the zero address or not.
*
* This call occurs _before_ the token contract's state is updated, so
* {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
*
* This function may revert to prevent the operation from being executed.
*/
function tokensToSend(
address operator,
address from,
address to,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC1820Registry.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/introspection/IERC1820Registry.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the global ERC1820 Registry, as defined in the
* https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
* implementers for interfaces in this registry, as well as query support.
*
* Implementers may be shared by multiple accounts, and can also implement more
* than a single interface for each account. Contracts can implement interfaces
* for themselves, but externally-owned accounts (EOA) must delegate this to a
* contract.
*
* {IERC165} interfaces can also be queried via the registry.
*
* For an in-depth explanation and source code analysis, see the EIP text.
*/
interface IERC1820Registry {
event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);
event ManagerChanged(address indexed account, address indexed newManager);
/**
* @dev Sets `newManager` as the manager for `account`. A manager of an
* account is able to set interface implementers for it.
*
* By default, each account is its own manager. Passing a value of `0x0` in
* `newManager` will reset the manager to this initial state.
*
* Emits a {ManagerChanged} event.
*
* Requirements:
*
* - the caller must be the current manager for `account`.
*/
function setManager(address account, address newManager) external;
/**
* @dev Returns the manager for `account`.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/Math.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/EnumerableSet.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IERC20Mintable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
interface IERC20Mintable {
function mint(address to, uint256 amount) external;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/AccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/AccessControlEnumerable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)
pragma solidity ^0.8.0;
import "./IAccessControlEnumerable.sol";
import "./AccessControl.sol";
import "../utils/structs/EnumerableSet.sol";
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
using EnumerableSet for EnumerableSet.AddressSet;
mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {
return _roleMembers[role].at(index);
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/IAccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/IAccessControlEnumerable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"admin","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AuthorizedOperator","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"tokenHolder","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Burned","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"bytes","name":"operatorData","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"Minted","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"bytes","name":"operatorData","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"RevokedOperator","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"tokenHolder","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Sent","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"bytes","name":"operatorData","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BLOCK_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"authorizeOperator","inputs":[{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"tokenHolder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"defaultOperators","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getRoleMember","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRoleMemberCount","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"granularity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOperatorFor","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"address","name":"tokenHolder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"operatorBurn","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"bytes","name":"operatorData","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"operatorSend","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"bytes","name":"operatorData","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeOperator","inputs":[{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"send","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b5060405162002756380380620027568339810160408190526200003491620004dd565b604080516000815260208101909152839083906004620000558482620005f8565b506005620000648382620005f8565b5080516200007a90600690602084019062000397565b5060005b8151811015620000ea57600160076000848481518110620000a357620000a3620006c4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620000e181620006da565b9150506200007e565b506040516329965a1d60e01b815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce217705460248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90606401600060405180830381600087803b1580156200016557600080fd5b505af11580156200017a573d6000803e3d6000fd5b50506040516329965a1d60e01b815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a60248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d9150606401600060405180830381600087803b158015620001f857600080fd5b505af11580156200020d573d6000803e3d6000fd5b50505050505050620002296000801b826200023260201b60201c565b50505062000702565b6200023e828262000242565b5050565b6200025982826200028560201b62000aad1760201c565b60008281526001602090815260409091206200028091839062000b3162000325821b17901c565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200023e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e13390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200033c836001600160a01b03841662000345565b90505b92915050565b60008181526001830160205260408120546200038e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200033f565b5060006200033f565b828054828255906000526020600020908101928215620003ef579160200282015b82811115620003ef57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003b8565b50620003fd92915062000401565b5090565b5b80821115620003fd576000815560010162000402565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200044057600080fd5b81516001600160401b03808211156200045d576200045d62000418565b604051601f8301601f19908116603f0116810190828211818310171562000488576200048862000418565b81604052838152602092508683858801011115620004a557600080fd5b600091505b83821015620004c95785820183015181830184015290820190620004aa565b600093810190920192909252949350505050565b600080600060608486031215620004f357600080fd5b83516001600160401b03808211156200050b57600080fd5b62000519878388016200042e565b945060208601519150808211156200053057600080fd5b506200053f868287016200042e565b604086015190935090506001600160a01b03811681146200055f57600080fd5b809150509250925092565b600181811c908216806200057f57607f821691505b602082108103620005a057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028057600081815260208120601f850160051c81016020861015620005cf5750805b601f850160051c820191505b81811015620005f057828155600101620005db565b505050505050565b81516001600160401b0381111562000614576200061462000418565b6200062c816200062584546200056a565b84620005a6565b602080601f8311600181146200066457600084156200064b5750858301515b600019600386901b1c1916600185901b178555620005f0565b600085815260208120601f198616915b82811015620006955788860151825594840194600190910190840162000674565b5085821015620006b45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060018201620006fb57634e487b7160e01b600052601160045260246000fd5b5060010190565b61204480620007126000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80639010d07c11610104578063ca15c873116100a2578063fad8b32a11610071578063fad8b32a14610407578063fbb386e81461041a578063fc673c4f14610441578063fe9d93031461045457600080fd5b8063ca15c87314610395578063d547741f146103a8578063d95b6371146103bb578063dd62ed3e146103ce57600080fd5b806395d89b41116100de57806395d89b411461035f5780639bd9bbc614610367578063a217fddf1461037a578063a9059cbb1461038257600080fd5b80639010d07c1461030e57806391d1485414610339578063959b8c3f1461034c57600080fd5b80632f2ff15d1161017157806340c10f191161014b57806340c10f19146102b8578063556f0dc7146102cb57806362ad1b83146102d257806370a08231146102e557600080fd5b80632f2ff15d14610281578063313ce5671461029657806336568abe146102a557600080fd5b8063095ea7b3116101ad578063095ea7b31461022657806318160ddd1461023957806323b872dd1461024b578063248a9ca31461025e57600080fd5b806301ffc9a7146101d457806306e48538146101fc57806306fdde0314610211575b600080fd5b6101e76101e2366004611961565b610467565b60405190151581526020015b60405180910390f35b610204610492565b6040516101f3919061198b565b6102196104f4565b6040516101f39190611a28565b6101e7610234366004611a50565b61057d565b6003545b6040519081526020016101f3565b6101e7610259366004611a7c565b610595565b61023d61026c366004611abd565b60009081526020819052604090206001015490565b61029461028f366004611ad6565b6105db565b005b604051601281526020016101f3565b6102946102b3366004611ad6565b610605565b6102946102c6366004611a50565b61061a565b600161023d565b6102946102e0366004611ba9565b61064f565b61023d6102f3366004611c3c565b6001600160a01b031660009081526002602052604090205490565b61032161031c366004611c59565b610694565b6040516001600160a01b0390911681526020016101f3565b6101e7610347366004611ad6565b6106b3565b61029461035a366004611c3c565b6106dc565b6102196107f9565b610294610375366004611c7b565b610808565b61023d600081565b6101e7610390366004611a50565b610826565b61023d6103a3366004611abd565b61085e565b6102946103b6366004611ad6565b610875565b6101e76103c9366004611cd4565b61089a565b61023d6103dc366004611cd4565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b610294610415366004611c3c565b61093b565b61023d7fefe866497efea00aa7574b13e86f62ebb584dfdf8dd4654ccc38107eb91840b881565b61029461044f366004611d02565b610a56565b610294610462366004611d82565b610a8e565b60006001600160e01b03198216635a05180f60e01b148061048c575061048c82610b46565b92915050565b606060068054806020026020016040519081016040528092919081815260200182805480156104ea57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104cc575b5050505050905090565b60606004805461050390611dc9565b80601f016020809104026020016040519081016040528092919081815260200182805461052f90611dc9565b80156104ea5780601f10610551576101008083540402835291602001916104ea565b820191906000526020600020905b81548152906001019060200180831161055f57509395945050505050565b60003361058b818585610b7b565b5060019392505050565b6000336105a3858285610ca2565b6105d085858560405180602001604052806000815250604051806020016040528060008152506000610d2e565b506001949350505050565b6000828152602081905260409020600101546105f681610db1565b6106008383610dbe565b505050565b600061061081610db1565b6106008383610de0565b600061062581610db1565b61060083836040518060200160405280600081525060405180602001604052806000815250610e5a565b610659338661089a565b61067e5760405162461bcd60e51b815260040161067590611e03565b60405180910390fd5b61068d85858585856001610d2e565b5050505050565b60008281526001602052604081206106ac9083610e68565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b03811633036107405760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b6064820152608401610675565b6001600160a01b03811660009081526007602052604090205460ff1615610791573360009081526009602090815260408083206001600160a01b03851684529091529020805460ff191690556107c0565b3360009081526008602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606005805461050390611dc9565b61060033848484604051806020016040528060008152506001610d2e565b600061085533848460405180602001604052806000815250604051806020016040528060008152506000610d2e565b50600192915050565b600081815260016020526040812061048c90610e74565b60008281526020819052604090206001015461089081610db1565b6106008383610e7e565b6000816001600160a01b0316836001600160a01b0316148061090557506001600160a01b03831660009081526007602052604090205460ff16801561090557506001600160a01b0380831660009081526009602090815260408083209387168352929052205460ff16155b806106ac5750506001600160a01b0390811660009081526008602090815260408083209490931682529290925290205460ff1690565b336001600160a01b0382160361099d5760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b6064820152608401610675565b6001600160a01b03811660009081526007602052604090205460ff16156109f1573360009081526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a1d565b3360009081526008602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b610a60338561089a565b610a7c5760405162461bcd60e51b815260040161067590611e03565b610a8884848484610ea0565b50505050565b610aa933838360405180602001604052806000815250610ea0565b5050565b610ab782826106b3565b610aa9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610aed3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006106ac836001600160a01b038416610ede565b60006001600160e01b03198216637965db0b60e01b148061048c57506301ffc9a760e01b6001600160e01b031983161461048c565b6001600160a01b038316610bdf5760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610675565b6001600160a01b038216610c415760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610675565b6001600160a01b038381166000818152600a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600a60209081526040808320938616835292905220546000198114610a885781811015610d215760405162461bcd60e51b815260206004820152601e60248201527f4552433737373a20696e73756666696369656e7420616c6c6f77616e636500006044820152606401610675565b610a888484848403610b7b565b610d587fefe866497efea00aa7574b13e86f62ebb584dfdf8dd4654ccc38107eb91840b8876106b3565b15610d9b5760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c881a5cc8189b1bd8dad959606a1b6044820152606401610675565b610da9868686868686610f2d565b505050505050565b610dbb8133611029565b50565b610dc88282610aad565b60008281526001602052604090206106009082610b31565b6001600160a01b0381163314610e505760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610675565b610aa98282610e7e565b610a88848484846001611082565b60006106ac83836111ca565b600061048c825490565b610e8882826111f4565b60008281526001602052604090206106009082611259565b60405162461bcd60e51b8152602060048201526013602482015272189d5c9b881a5cc81b9bdd08185b1b1bddd959606a1b6044820152606401610675565b6000818152600183016020526040812054610f255750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561048c565b50600061048c565b6001600160a01b038616610f925760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610675565b6001600160a01b038516610ff45760405162461bcd60e51b8152602060048201526024808201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610675565b3361100381888888888861126e565b611011818888888888611395565b611020818888888888886114fb565b50505050505050565b61103382826106b3565b610aa957611040816116c0565b61104b8360206116d2565b60405160200161105c929190611e4f565b60408051601f198184030181529082905262461bcd60e51b825261067591600401611a28565b6001600160a01b0385166110d85760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f20616464726573736044820152606401610675565b600033905084600360008282546110ef9190611eda565b90915550506001600160a01b0386166000908152600260205260408120805487929061111c908490611eda565b90915550611132905081600088888888886114fb565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d87878760405161117993929190611eed565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050565b60008260000182815481106111e1576111e1611f22565b9060005260206000200154905092915050565b6111fe82826106b3565b15610aa9576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006106ac836001600160a01b03841661186e565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa1580156112ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113139190611f38565b90506001600160a01b0381161561102057604051633ad5cbc160e11b81526001600160a01b038216906375ab97829061135a908a908a908a908a908a908a90600401611f55565b600060405180830381600087803b15801561137457600080fd5b505af1158015611388573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b0385166000908152600260205260409020548381101561140e5760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610675565b6001600160a01b03808716600090815260026020526040808220878503905591871681529081208054869290611445908490611eda565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161149d93929190611eed565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516114ea91815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190611f38565b90506001600160a01b0381161561161c576040516223de2960e01b81526001600160a01b038216906223de29906115e5908b908b908b908b908b908b90600401611f55565b600060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b505050506116b6565b81156116b6576001600160a01b0386163b156116b65760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a401610675565b5050505050505050565b606061048c6001600160a01b03831660145b606060006116e1836002611faf565b6116ec906002611eda565b67ffffffffffffffff81111561170457611704611b06565b6040519080825280601f01601f19166020018201604052801561172e576020820181803683370190505b509050600360fc1b8160008151811061174957611749611f22565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061177857611778611f22565b60200101906001600160f81b031916908160001a905350600061179c846002611faf565b6117a7906001611eda565b90505b600181111561181f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106117db576117db611f22565b1a60f81b8282815181106117f1576117f1611f22565b60200101906001600160f81b031916908160001a90535060049490941c9361181881611fce565b90506117aa565b5083156106ac5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610675565b60008181526001830160205260408120548015611957576000611892600183611fe5565b85549091506000906118a690600190611fe5565b905081811461190b5760008660000182815481106118c6576118c6611f22565b90600052602060002001549050808760000184815481106118e9576118e9611f22565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061191c5761191c611ff8565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061048c565b600091505061048c565b60006020828403121561197357600080fd5b81356001600160e01b0319811681146106ac57600080fd5b6020808252825182820181905260009190848201906040850190845b818110156119cc5783516001600160a01b0316835292840192918401916001016119a7565b50909695505050505050565b60005b838110156119f35781810151838201526020016119db565b50506000910152565b60008151808452611a148160208601602086016119d8565b601f01601f19169290920160200192915050565b6020815260006106ac60208301846119fc565b6001600160a01b0381168114610dbb57600080fd5b60008060408385031215611a6357600080fd5b8235611a6e81611a3b565b946020939093013593505050565b600080600060608486031215611a9157600080fd5b8335611a9c81611a3b565b92506020840135611aac81611a3b565b929592945050506040919091013590565b600060208284031215611acf57600080fd5b5035919050565b60008060408385031215611ae957600080fd5b823591506020830135611afb81611a3b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611b2d57600080fd5b813567ffffffffffffffff80821115611b4857611b48611b06565b604051601f8301601f19908116603f01168101908282118183101715611b7057611b70611b06565b81604052838152866020858801011115611b8957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611bc157600080fd5b8535611bcc81611a3b565b94506020860135611bdc81611a3b565b935060408601359250606086013567ffffffffffffffff80821115611c0057600080fd5b611c0c89838a01611b1c565b93506080880135915080821115611c2257600080fd5b50611c2f88828901611b1c565b9150509295509295909350565b600060208284031215611c4e57600080fd5b81356106ac81611a3b565b60008060408385031215611c6c57600080fd5b50508035926020909101359150565b600080600060608486031215611c9057600080fd5b8335611c9b81611a3b565b925060208401359150604084013567ffffffffffffffff811115611cbe57600080fd5b611cca86828701611b1c565b9150509250925092565b60008060408385031215611ce757600080fd5b8235611cf281611a3b565b91506020830135611afb81611a3b565b60008060008060808587031215611d1857600080fd5b8435611d2381611a3b565b935060208501359250604085013567ffffffffffffffff80821115611d4757600080fd5b611d5388838901611b1c565b93506060870135915080821115611d6957600080fd5b50611d7687828801611b1c565b91505092959194509250565b60008060408385031215611d9557600080fd5b82359150602083013567ffffffffffffffff811115611db357600080fd5b611dbf85828601611b1c565b9150509250929050565b600181811c90821680611ddd57607f821691505b602082108103611dfd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611e878160178501602088016119d8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611eb88160288401602088016119d8565b01602801949350505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561048c5761048c611ec4565b838152606060208201526000611f0660608301856119fc565b8281036040840152611f1881856119fc565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611f4a57600080fd5b81516106ac81611a3b565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c060808201819052600090611f90908301856119fc565b82810360a0840152611fa281856119fc565b9998505050505050505050565b6000816000190483118215151615611fc957611fc9611ec4565b500290565b600081611fdd57611fdd611ec4565b506000190190565b8181038181111561048c5761048c611ec4565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206fefcd10e525b5d035207594de2fd63f09c2264edc8ea3fafe49d0eee968808264736f6c63430008100033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f90af4546e8c831a3b91200e6d41d70684b525f2000000000000000000000000000000000000000000000000000000000000000a4d69726120546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49524100000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80639010d07c11610104578063ca15c873116100a2578063fad8b32a11610071578063fad8b32a14610407578063fbb386e81461041a578063fc673c4f14610441578063fe9d93031461045457600080fd5b8063ca15c87314610395578063d547741f146103a8578063d95b6371146103bb578063dd62ed3e146103ce57600080fd5b806395d89b41116100de57806395d89b411461035f5780639bd9bbc614610367578063a217fddf1461037a578063a9059cbb1461038257600080fd5b80639010d07c1461030e57806391d1485414610339578063959b8c3f1461034c57600080fd5b80632f2ff15d1161017157806340c10f191161014b57806340c10f19146102b8578063556f0dc7146102cb57806362ad1b83146102d257806370a08231146102e557600080fd5b80632f2ff15d14610281578063313ce5671461029657806336568abe146102a557600080fd5b8063095ea7b3116101ad578063095ea7b31461022657806318160ddd1461023957806323b872dd1461024b578063248a9ca31461025e57600080fd5b806301ffc9a7146101d457806306e48538146101fc57806306fdde0314610211575b600080fd5b6101e76101e2366004611961565b610467565b60405190151581526020015b60405180910390f35b610204610492565b6040516101f3919061198b565b6102196104f4565b6040516101f39190611a28565b6101e7610234366004611a50565b61057d565b6003545b6040519081526020016101f3565b6101e7610259366004611a7c565b610595565b61023d61026c366004611abd565b60009081526020819052604090206001015490565b61029461028f366004611ad6565b6105db565b005b604051601281526020016101f3565b6102946102b3366004611ad6565b610605565b6102946102c6366004611a50565b61061a565b600161023d565b6102946102e0366004611ba9565b61064f565b61023d6102f3366004611c3c565b6001600160a01b031660009081526002602052604090205490565b61032161031c366004611c59565b610694565b6040516001600160a01b0390911681526020016101f3565b6101e7610347366004611ad6565b6106b3565b61029461035a366004611c3c565b6106dc565b6102196107f9565b610294610375366004611c7b565b610808565b61023d600081565b6101e7610390366004611a50565b610826565b61023d6103a3366004611abd565b61085e565b6102946103b6366004611ad6565b610875565b6101e76103c9366004611cd4565b61089a565b61023d6103dc366004611cd4565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b610294610415366004611c3c565b61093b565b61023d7fefe866497efea00aa7574b13e86f62ebb584dfdf8dd4654ccc38107eb91840b881565b61029461044f366004611d02565b610a56565b610294610462366004611d82565b610a8e565b60006001600160e01b03198216635a05180f60e01b148061048c575061048c82610b46565b92915050565b606060068054806020026020016040519081016040528092919081815260200182805480156104ea57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116104cc575b5050505050905090565b60606004805461050390611dc9565b80601f016020809104026020016040519081016040528092919081815260200182805461052f90611dc9565b80156104ea5780601f10610551576101008083540402835291602001916104ea565b820191906000526020600020905b81548152906001019060200180831161055f57509395945050505050565b60003361058b818585610b7b565b5060019392505050565b6000336105a3858285610ca2565b6105d085858560405180602001604052806000815250604051806020016040528060008152506000610d2e565b506001949350505050565b6000828152602081905260409020600101546105f681610db1565b6106008383610dbe565b505050565b600061061081610db1565b6106008383610de0565b600061062581610db1565b61060083836040518060200160405280600081525060405180602001604052806000815250610e5a565b610659338661089a565b61067e5760405162461bcd60e51b815260040161067590611e03565b60405180910390fd5b61068d85858585856001610d2e565b5050505050565b60008281526001602052604081206106ac9083610e68565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b03811633036107405760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b6064820152608401610675565b6001600160a01b03811660009081526007602052604090205460ff1615610791573360009081526009602090815260408083206001600160a01b03851684529091529020805460ff191690556107c0565b3360009081526008602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606005805461050390611dc9565b61060033848484604051806020016040528060008152506001610d2e565b600061085533848460405180602001604052806000815250604051806020016040528060008152506000610d2e565b50600192915050565b600081815260016020526040812061048c90610e74565b60008281526020819052604090206001015461089081610db1565b6106008383610e7e565b6000816001600160a01b0316836001600160a01b0316148061090557506001600160a01b03831660009081526007602052604090205460ff16801561090557506001600160a01b0380831660009081526009602090815260408083209387168352929052205460ff16155b806106ac5750506001600160a01b0390811660009081526008602090815260408083209490931682529290925290205460ff1690565b336001600160a01b0382160361099d5760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b6064820152608401610675565b6001600160a01b03811660009081526007602052604090205460ff16156109f1573360009081526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610a1d565b3360009081526008602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b610a60338561089a565b610a7c5760405162461bcd60e51b815260040161067590611e03565b610a8884848484610ea0565b50505050565b610aa933838360405180602001604052806000815250610ea0565b5050565b610ab782826106b3565b610aa9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610aed3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006106ac836001600160a01b038416610ede565b60006001600160e01b03198216637965db0b60e01b148061048c57506301ffc9a760e01b6001600160e01b031983161461048c565b6001600160a01b038316610bdf5760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610675565b6001600160a01b038216610c415760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610675565b6001600160a01b038381166000818152600a602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600a60209081526040808320938616835292905220546000198114610a885781811015610d215760405162461bcd60e51b815260206004820152601e60248201527f4552433737373a20696e73756666696369656e7420616c6c6f77616e636500006044820152606401610675565b610a888484848403610b7b565b610d587fefe866497efea00aa7574b13e86f62ebb584dfdf8dd4654ccc38107eb91840b8876106b3565b15610d9b5760405162461bcd60e51b81526020600482015260136024820152721d1c985b9cd9995c881a5cc8189b1bd8dad959606a1b6044820152606401610675565b610da9868686868686610f2d565b505050505050565b610dbb8133611029565b50565b610dc88282610aad565b60008281526001602052604090206106009082610b31565b6001600160a01b0381163314610e505760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610675565b610aa98282610e7e565b610a88848484846001611082565b60006106ac83836111ca565b600061048c825490565b610e8882826111f4565b60008281526001602052604090206106009082611259565b60405162461bcd60e51b8152602060048201526013602482015272189d5c9b881a5cc81b9bdd08185b1b1bddd959606a1b6044820152606401610675565b6000818152600183016020526040812054610f255750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561048c565b50600061048c565b6001600160a01b038616610f925760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610675565b6001600160a01b038516610ff45760405162461bcd60e51b8152602060048201526024808201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610675565b3361100381888888888861126e565b611011818888888888611395565b611020818888888888886114fb565b50505050505050565b61103382826106b3565b610aa957611040816116c0565b61104b8360206116d2565b60405160200161105c929190611e4f565b60408051601f198184030181529082905262461bcd60e51b825261067591600401611a28565b6001600160a01b0385166110d85760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f20616464726573736044820152606401610675565b600033905084600360008282546110ef9190611eda565b90915550506001600160a01b0386166000908152600260205260408120805487929061111c908490611eda565b90915550611132905081600088888888886114fb565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d87878760405161117993929190611eed565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050565b60008260000182815481106111e1576111e1611f22565b9060005260206000200154905092915050565b6111fe82826106b3565b15610aa9576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006106ac836001600160a01b03841661186e565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa1580156112ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113139190611f38565b90506001600160a01b0381161561102057604051633ad5cbc160e11b81526001600160a01b038216906375ab97829061135a908a908a908a908a908a908a90600401611f55565b600060405180830381600087803b15801561137457600080fd5b505af1158015611388573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b0385166000908152600260205260409020548381101561140e5760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610675565b6001600160a01b03808716600090815260026020526040808220878503905591871681529081208054869290611445908490611eda565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161149d93929190611eed565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516114ea91815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190611f38565b90506001600160a01b0381161561161c576040516223de2960e01b81526001600160a01b038216906223de29906115e5908b908b908b908b908b908b90600401611f55565b600060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b505050506116b6565b81156116b6576001600160a01b0386163b156116b65760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a401610675565b5050505050505050565b606061048c6001600160a01b03831660145b606060006116e1836002611faf565b6116ec906002611eda565b67ffffffffffffffff81111561170457611704611b06565b6040519080825280601f01601f19166020018201604052801561172e576020820181803683370190505b509050600360fc1b8160008151811061174957611749611f22565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061177857611778611f22565b60200101906001600160f81b031916908160001a905350600061179c846002611faf565b6117a7906001611eda565b90505b600181111561181f576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106117db576117db611f22565b1a60f81b8282815181106117f1576117f1611f22565b60200101906001600160f81b031916908160001a90535060049490941c9361181881611fce565b90506117aa565b5083156106ac5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610675565b60008181526001830160205260408120548015611957576000611892600183611fe5565b85549091506000906118a690600190611fe5565b905081811461190b5760008660000182815481106118c6576118c6611f22565b90600052602060002001549050808760000184815481106118e9576118e9611f22565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061191c5761191c611ff8565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061048c565b600091505061048c565b60006020828403121561197357600080fd5b81356001600160e01b0319811681146106ac57600080fd5b6020808252825182820181905260009190848201906040850190845b818110156119cc5783516001600160a01b0316835292840192918401916001016119a7565b50909695505050505050565b60005b838110156119f35781810151838201526020016119db565b50506000910152565b60008151808452611a148160208601602086016119d8565b601f01601f19169290920160200192915050565b6020815260006106ac60208301846119fc565b6001600160a01b0381168114610dbb57600080fd5b60008060408385031215611a6357600080fd5b8235611a6e81611a3b565b946020939093013593505050565b600080600060608486031215611a9157600080fd5b8335611a9c81611a3b565b92506020840135611aac81611a3b565b929592945050506040919091013590565b600060208284031215611acf57600080fd5b5035919050565b60008060408385031215611ae957600080fd5b823591506020830135611afb81611a3b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611b2d57600080fd5b813567ffffffffffffffff80821115611b4857611b48611b06565b604051601f8301601f19908116603f01168101908282118183101715611b7057611b70611b06565b81604052838152866020858801011115611b8957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215611bc157600080fd5b8535611bcc81611a3b565b94506020860135611bdc81611a3b565b935060408601359250606086013567ffffffffffffffff80821115611c0057600080fd5b611c0c89838a01611b1c565b93506080880135915080821115611c2257600080fd5b50611c2f88828901611b1c565b9150509295509295909350565b600060208284031215611c4e57600080fd5b81356106ac81611a3b565b60008060408385031215611c6c57600080fd5b50508035926020909101359150565b600080600060608486031215611c9057600080fd5b8335611c9b81611a3b565b925060208401359150604084013567ffffffffffffffff811115611cbe57600080fd5b611cca86828701611b1c565b9150509250925092565b60008060408385031215611ce757600080fd5b8235611cf281611a3b565b91506020830135611afb81611a3b565b60008060008060808587031215611d1857600080fd5b8435611d2381611a3b565b935060208501359250604085013567ffffffffffffffff80821115611d4757600080fd5b611d5388838901611b1c565b93506060870135915080821115611d6957600080fd5b50611d7687828801611b1c565b91505092959194509250565b60008060408385031215611d9557600080fd5b82359150602083013567ffffffffffffffff811115611db357600080fd5b611dbf85828601611b1c565b9150509250929050565b600181811c90821680611ddd57607f821691505b602082108103611dfd57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611e878160178501602088016119d8565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611eb88160288401602088016119d8565b01602801949350505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561048c5761048c611ec4565b838152606060208201526000611f0660608301856119fc565b8281036040840152611f1881856119fc565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611f4a57600080fd5b81516106ac81611a3b565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c060808201819052600090611f90908301856119fc565b82810360a0840152611fa281856119fc565b9998505050505050505050565b6000816000190483118215151615611fc957611fc9611ec4565b500290565b600081611fdd57611fdd611ec4565b506000190190565b8181038181111561048c5761048c611ec4565b634e487b7160e01b600052603160045260246000fdfea26469706673582212206fefcd10e525b5d035207594de2fd63f09c2264edc8ea3fafe49d0eee968808264736f6c63430008100033