ERC-1155
Source Code
Overview
Max Total Supply
0
Holders
1,427
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
BlightfellXP
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import "./Ownable.sol";
import "./ERC1155.sol";
contract BlightfellXP is ERC1155, Ownable {
string public XP_URI = "uri";
mapping(address => bool) public modifiers;
mapping(address => mapping(uint32 => bool)) public nonces;
bool public tradingEnabled = false;
modifier onlyModifiers {
require(modifiers[msg.sender], "Only modifier allowed");
_;
}
constructor() ERC1155("") {
modifiers[msg.sender] = true;
}
function rewardXP(address wallet, uint256 amount, uint32 nonce) onlyModifiers public {
require(!nonces[wallet][nonce], "XP already rewarded");
nonces[wallet][nonce] = true;
_mint(wallet, 1, amount, "");
}
function deductXP(address wallet, uint256 amount) onlyModifiers public {
_burn(wallet, 1, amount);
}
function addXp(address wallet, uint256 amount) onlyModifiers public {
_mint(wallet, 1, amount, "");
}
function setModifier(address mod, bool status) onlyOwner public {
modifiers[mod] = status;
}
function uri(uint256) public view override returns (string memory) {
return XP_URI;
}
function setURI(string memory newURI) onlyOwner public {
XP_URI = newURI;
}
function setTradingState(bool state) onlyOwner public {
tradingEnabled = state;
}
function _beforeTokenTransfer(
address operator,
address from,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) internal override {
if(modifiers[operator]) return;
if(from == address(0)) return;
require(tradingEnabled, "Trading not enabled");
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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;
}
/**
* @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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// 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;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol)
pragma solidity ^0.8.0;
import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";
/**
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*
* _Available since v3.1._
*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
// Mapping from account to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
/**
* @dev See {_setURI}.
*/
constructor(string memory uri_) {
_setURI(uri_);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC1155).interfaceId ||
interfaceId == type(IERC1155MetadataURI).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] memory accounts,
uint256[] memory ids
) public view virtual override returns (uint256[] memory) {
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_safeTransferFrom(from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public virtual override {
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not token owner or approved"
);
_safeBatchTransferFrom(from, to, ids, amounts, data);
}
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount;
}
emit TransferBatch(operator, from, to, ids, amounts);
_afterTokenTransfer(operator, from, to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][to] += amounts[i];
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `from`
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `from` must have at least `amount` tokens of token type `id`.
*/
function _burn(address from, uint256 id, uint256 amount) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
emit TransferSingle(operator, from, address(0), id, amount);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual {
require(from != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, from, address(0), ids, amounts, "");
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
uint256 amount = amounts[i];
uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
unchecked {
_balances[id][from] = fromBalance - amount;
}
}
emit TransferBatch(operator, from, address(0), ids, amounts);
_afterTokenTransfer(operator, from, address(0), ids, amounts, "");
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
require(owner != operator, "ERC1155: setting approval status for self");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `ids` and `amounts` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
/**
* @dev Hook that is called after any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {}
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver.onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) private {
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
bytes4 response
) {
if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non-ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}
// 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;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
pragma solidity ^0.8.0;
import "./IERC1155.sol";
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
// 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);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"XP_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addXp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deductXP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"modifiers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"nonces","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint32","name":"nonce","type":"uint32"}],"name":"rewardXP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mod","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setModifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setTradingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setURI","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":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c0604052600360809081526275726960e81b60a0526004906200002490826200018c565b506007805460ff191690553480156200003c57600080fd5b50604080516020810190915260008152620000578162000083565b50620000633362000095565b336000908152600560205260409020805460ff1916600117905562000258565b60026200009182826200018c565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011257607f821691505b6020821081036200013357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200018757600081815260208120601f850160051c81016020861015620001625750805b601f850160051c820191505b8181101562000183578281556001016200016e565b5050505b505050565b81516001600160401b03811115620001a857620001a8620000e7565b620001c081620001b98454620000fd565b8462000139565b602080601f831160018114620001f85760008415620001df5750858301515b600019600386901b1c1916600185901b17855562000183565b600085815260208120601f198616915b82811015620002295788860151825594840194600190910190840162000208565b5085821015620002485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611e5080620002686000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806391a43a52116100b8578063c3bacfa51161007c578063c3bacfa5146102b9578063d5ccb8ee146102c1578063e985e9c5146102d4578063eae50e8214610310578063f242432a14610323578063f2fde38b1461033657600080fd5b806391a43a521461022f5780639d0f0ea21461025d578063a22cb46514610280578063aaf0d1ad14610293578063c3a0ef89146102a657600080fd5b80634ada218b116100ff5780634ada218b146101cc5780634e1273f4146101d9578063715018a6146101f95780638625e7b1146102015780638da5cb5b1461021457600080fd5b8062fdd58e1461013b57806301ffc9a71461016157806302fe5305146101845780630e89341c146101995780632eb2c2d6146101b9575b600080fd5b61014e6101493660046113d8565b610349565b6040519081526020015b60405180910390f35b61017461016f366004611418565b6103e2565b6040519015158152602001610158565b6101976101923660046114dd565b610432565b005b6101ac6101a736600461152e565b61044a565b604051610158919061158d565b6101976101c7366004611655565b6104de565b6007546101749060ff1681565b6101ec6101e73660046116ff565b61052a565b6040516101589190611805565b610197610654565b61019761020f3660046113d8565b610668565b6003546040516001600160a01b039091168152602001610158565b61017461023d36600461182c565b600660209081526000928352604080842090915290825290205460ff1681565b61017461026b36600461185f565b60056020526000908152604090205460ff1681565b61019761028e36600461188a565b6106a3565b6101976102a13660046118b4565b6106ae565b6101976102b43660046113d8565b6107a1565b6101ac6107ec565b6101976102cf3660046118f0565b61087a565b6101746102e236600461190b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61019761031e36600461188a565b610895565b610197610331366004611935565b6108c8565b61019761034436600461185f565b61090d565b60006001600160a01b0383166103b95760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061041357506001600160e01b031982166303a24d0760e21b145b806103dc57506301ffc9a760e01b6001600160e01b03198316146103dc565b61043a610986565b60046104468282611a1a565b5050565b6060600480546104599061199a565b80601f01602080910402602001604051908101604052809291908181526020018280546104859061199a565b80156104d25780601f106104a7576101008083540402835291602001916104d2565b820191906000526020600020905b8154815290600101906020018083116104b557829003601f168201915b50505050509050919050565b6001600160a01b0385163314806104fa57506104fa85336102e2565b6105165760405162461bcd60e51b81526004016103b090611ada565b61052385858585856109e0565b5050505050565b6060815183511461058f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103b0565b6000835167ffffffffffffffff8111156105ab576105ab61143c565b6040519080825280602002602001820160405280156105d4578160200160208202803683370190505b50905060005b845181101561064c5761061f8582815181106105f8576105f8611b28565b602002602001015185838151811061061257610612611b28565b6020026020010151610349565b82828151811061063157610631611b28565b602090810291909101015261064581611b54565b90506105da565b509392505050565b61065c610986565b6106666000610bcb565b565b3360009081526005602052604090205460ff166106975760405162461bcd60e51b81526004016103b090611b6d565b61044682600183610c1d565b610446338383610db2565b3360009081526005602052604090205460ff166106dd5760405162461bcd60e51b81526004016103b090611b6d565b6001600160a01b038316600090815260066020908152604080832063ffffffff8516845290915290205460ff161561074d5760405162461bcd60e51b8152602060048201526013602482015272161408185b1c9958591e481c995dd85c991959606a1b60448201526064016103b0565b6001600160a01b038316600090815260066020908152604080832063ffffffff851684528252808320805460ff19166001908117909155815192830190915291815261079c9185918590610e92565b505050565b3360009081526005602052604090205460ff166107d05760405162461bcd60e51b81526004016103b090611b6d565b6104468260018360405180602001604052806000815250610e92565b600480546107f99061199a565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061199a565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b505050505081565b610882610986565b6007805460ff1916911515919091179055565b61089d610986565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001600160a01b0385163314806108e457506108e485336102e2565b6109005760405162461bcd60e51b81526004016103b090611ada565b6105238585858585610fac565b610915610986565b6001600160a01b03811661097a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b0565b61098381610bcb565b50565b6003546001600160a01b031633146106665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b8151835114610a425760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016103b0565b6001600160a01b038416610a685760405162461bcd60e51b81526004016103b090611b9c565b33610a778187878787876110e4565b60005b8451811015610b5d576000858281518110610a9757610a97611b28565b602002602001015190506000858381518110610ab557610ab5611b28565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b055760405162461bcd60e51b81526004016103b090611be1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610b42908490611c2b565b9250508190555050505080610b5690611b54565b9050610a7a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610bad929190611c3e565b60405180910390a4610bc381878787878761115b565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316610c7f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016103b0565b336000610c8b846112b6565b90506000610c98846112b6565b9050610cb8838760008585604051806020016040528060008152506110e4565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015610d355760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016103b0565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b816001600160a01b0316836001600160a01b031603610e255760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103b0565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610ef25760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103b0565b336000610efe856112b6565b90506000610f0b856112b6565b9050610f1c836000898585896110e4565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610f4c908490611c2b565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610da983600089898989611301565b6001600160a01b038416610fd25760405162461bcd60e51b81526004016103b090611b9c565b336000610fde856112b6565b90506000610feb856112b6565b9050610ffb8389898585896110e4565b6000868152602081815260408083206001600160a01b038c1684529091529020548581101561103c5760405162461bcd60e51b81526004016103b090611be1565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611079908490611c2b565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46110d9848a8a8a8a8a611301565b505050505050505050565b6001600160a01b03861660009081526005602052604090205460ff16610bc3576001600160a01b03851615610bc35760075460ff16610bc35760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b60448201526064016103b0565b6001600160a01b0384163b15610bc35760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061119f9089908990889088908890600401611c6c565b6020604051808303816000875af19250505080156111da575060408051601f3d908101601f191682019092526111d791810190611cca565b60015b611286576111e6611ce7565b806308c379a00361121f57506111fa611d03565b806112055750611221565b8060405162461bcd60e51b81526004016103b0919061158d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103b0565b6001600160e01b0319811663bc197c8160e01b14610da95760405162461bcd60e51b81526004016103b090611d8d565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106112f0576112f0611b28565b602090810291909101015292915050565b6001600160a01b0384163b15610bc35760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906113459089908990889088908890600401611dd5565b6020604051808303816000875af1925050508015611380575060408051601f3d908101601f1916820190925261137d91810190611cca565b60015b61138c576111e6611ce7565b6001600160e01b0319811663f23a6e6160e01b14610da95760405162461bcd60e51b81526004016103b090611d8d565b80356001600160a01b03811681146113d357600080fd5b919050565b600080604083850312156113eb57600080fd5b6113f4836113bc565b946020939093013593505050565b6001600160e01b03198116811461098357600080fd5b60006020828403121561142a57600080fd5b813561143581611402565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156114785761147861143c565b6040525050565b600067ffffffffffffffff8311156114995761149961143c565b6040516114b0601f8501601f191660200182611452565b8091508381528484840111156114c557600080fd5b83836020830137600060208583010152509392505050565b6000602082840312156114ef57600080fd5b813567ffffffffffffffff81111561150657600080fd5b8201601f8101841361151757600080fd5b6115268482356020840161147f565b949350505050565b60006020828403121561154057600080fd5b5035919050565b6000815180845260005b8181101561156d57602081850181015186830182015201611551565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006114356020830184611547565b600067ffffffffffffffff8211156115ba576115ba61143c565b5060051b60200190565b600082601f8301126115d557600080fd5b813560206115e2826115a0565b6040516115ef8282611452565b83815260059390931b850182019282810191508684111561160f57600080fd5b8286015b8481101561162a5780358352918301918301611613565b509695505050505050565b600082601f83011261164657600080fd5b6114358383356020850161147f565b600080600080600060a0868803121561166d57600080fd5b611676866113bc565b9450611684602087016113bc565b9350604086013567ffffffffffffffff808211156116a157600080fd5b6116ad89838a016115c4565b945060608801359150808211156116c357600080fd5b6116cf89838a016115c4565b935060808801359150808211156116e557600080fd5b506116f288828901611635565b9150509295509295909350565b6000806040838503121561171257600080fd5b823567ffffffffffffffff8082111561172a57600080fd5b818501915085601f83011261173e57600080fd5b8135602061174b826115a0565b6040516117588282611452565b83815260059390931b850182019282810191508984111561177857600080fd5b948201945b8386101561179d5761178e866113bc565b8252948201949082019061177d565b965050860135925050808211156117b357600080fd5b506117c0858286016115c4565b9150509250929050565b600081518084526020808501945080840160005b838110156117fa578151875295820195908201906001016117de565b509495945050505050565b60208152600061143560208301846117ca565b803563ffffffff811681146113d357600080fd5b6000806040838503121561183f57600080fd5b611848836113bc565b915061185660208401611818565b90509250929050565b60006020828403121561187157600080fd5b611435826113bc565b803580151581146113d357600080fd5b6000806040838503121561189d57600080fd5b6118a6836113bc565b91506118566020840161187a565b6000806000606084860312156118c957600080fd5b6118d2846113bc565b9250602084013591506118e760408501611818565b90509250925092565b60006020828403121561190257600080fd5b6114358261187a565b6000806040838503121561191e57600080fd5b611927836113bc565b9150611856602084016113bc565b600080600080600060a0868803121561194d57600080fd5b611956866113bc565b9450611964602087016113bc565b93506040860135925060608601359150608086013567ffffffffffffffff81111561198e57600080fd5b6116f288828901611635565b600181811c908216806119ae57607f821691505b6020821081036119ce57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561079c57600081815260208120601f850160051c810160208610156119fb5750805b601f850160051c820191505b81811015610bc357828155600101611a07565b815167ffffffffffffffff811115611a3457611a3461143c565b611a4881611a42845461199a565b846119d4565b602080601f831160018114611a7d5760008415611a655750858301515b600019600386901b1c1916600185901b178555610bc3565b600085815260208120601f198616915b82811015611aac57888601518255948401946001909101908401611a8d565b5085821015611aca5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611b6657611b66611b3e565b5060010190565b60208082526015908201527413db9b1e481b5bd91a599a595c88185b1b1bddd959605a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b808201808211156103dc576103dc611b3e565b604081526000611c5160408301856117ca565b8281036020840152611c6381856117ca565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611c98908301866117ca565b8281036060840152611caa81866117ca565b90508281036080840152611cbe8185611547565b98975050505050505050565b600060208284031215611cdc57600080fd5b815161143581611402565b600060033d1115611d005760046000803e5060005160e01c5b90565b600060443d1015611d115790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611d4157505050505090565b8285019150815181811115611d595750505050505090565b843d8701016020828501011115611d735750505050505090565b611d8260208286010187611452565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e0f90830184611547565b97965050505050505056fea2646970667358221220ef690b41fa67e776e2046fed511667bab0b81df78c51bc62673eec35397624af64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c806391a43a52116100b8578063c3bacfa51161007c578063c3bacfa5146102b9578063d5ccb8ee146102c1578063e985e9c5146102d4578063eae50e8214610310578063f242432a14610323578063f2fde38b1461033657600080fd5b806391a43a521461022f5780639d0f0ea21461025d578063a22cb46514610280578063aaf0d1ad14610293578063c3a0ef89146102a657600080fd5b80634ada218b116100ff5780634ada218b146101cc5780634e1273f4146101d9578063715018a6146101f95780638625e7b1146102015780638da5cb5b1461021457600080fd5b8062fdd58e1461013b57806301ffc9a71461016157806302fe5305146101845780630e89341c146101995780632eb2c2d6146101b9575b600080fd5b61014e6101493660046113d8565b610349565b6040519081526020015b60405180910390f35b61017461016f366004611418565b6103e2565b6040519015158152602001610158565b6101976101923660046114dd565b610432565b005b6101ac6101a736600461152e565b61044a565b604051610158919061158d565b6101976101c7366004611655565b6104de565b6007546101749060ff1681565b6101ec6101e73660046116ff565b61052a565b6040516101589190611805565b610197610654565b61019761020f3660046113d8565b610668565b6003546040516001600160a01b039091168152602001610158565b61017461023d36600461182c565b600660209081526000928352604080842090915290825290205460ff1681565b61017461026b36600461185f565b60056020526000908152604090205460ff1681565b61019761028e36600461188a565b6106a3565b6101976102a13660046118b4565b6106ae565b6101976102b43660046113d8565b6107a1565b6101ac6107ec565b6101976102cf3660046118f0565b61087a565b6101746102e236600461190b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61019761031e36600461188a565b610895565b610197610331366004611935565b6108c8565b61019761034436600461185f565b61090d565b60006001600160a01b0383166103b95760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061041357506001600160e01b031982166303a24d0760e21b145b806103dc57506301ffc9a760e01b6001600160e01b03198316146103dc565b61043a610986565b60046104468282611a1a565b5050565b6060600480546104599061199a565b80601f01602080910402602001604051908101604052809291908181526020018280546104859061199a565b80156104d25780601f106104a7576101008083540402835291602001916104d2565b820191906000526020600020905b8154815290600101906020018083116104b557829003601f168201915b50505050509050919050565b6001600160a01b0385163314806104fa57506104fa85336102e2565b6105165760405162461bcd60e51b81526004016103b090611ada565b61052385858585856109e0565b5050505050565b6060815183511461058f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103b0565b6000835167ffffffffffffffff8111156105ab576105ab61143c565b6040519080825280602002602001820160405280156105d4578160200160208202803683370190505b50905060005b845181101561064c5761061f8582815181106105f8576105f8611b28565b602002602001015185838151811061061257610612611b28565b6020026020010151610349565b82828151811061063157610631611b28565b602090810291909101015261064581611b54565b90506105da565b509392505050565b61065c610986565b6106666000610bcb565b565b3360009081526005602052604090205460ff166106975760405162461bcd60e51b81526004016103b090611b6d565b61044682600183610c1d565b610446338383610db2565b3360009081526005602052604090205460ff166106dd5760405162461bcd60e51b81526004016103b090611b6d565b6001600160a01b038316600090815260066020908152604080832063ffffffff8516845290915290205460ff161561074d5760405162461bcd60e51b8152602060048201526013602482015272161408185b1c9958591e481c995dd85c991959606a1b60448201526064016103b0565b6001600160a01b038316600090815260066020908152604080832063ffffffff851684528252808320805460ff19166001908117909155815192830190915291815261079c9185918590610e92565b505050565b3360009081526005602052604090205460ff166107d05760405162461bcd60e51b81526004016103b090611b6d565b6104468260018360405180602001604052806000815250610e92565b600480546107f99061199a565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061199a565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b505050505081565b610882610986565b6007805460ff1916911515919091179055565b61089d610986565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001600160a01b0385163314806108e457506108e485336102e2565b6109005760405162461bcd60e51b81526004016103b090611ada565b6105238585858585610fac565b610915610986565b6001600160a01b03811661097a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b0565b61098381610bcb565b50565b6003546001600160a01b031633146106665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b0565b8151835114610a425760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016103b0565b6001600160a01b038416610a685760405162461bcd60e51b81526004016103b090611b9c565b33610a778187878787876110e4565b60005b8451811015610b5d576000858281518110610a9757610a97611b28565b602002602001015190506000858381518110610ab557610ab5611b28565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b055760405162461bcd60e51b81526004016103b090611be1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610b42908490611c2b565b9250508190555050505080610b5690611b54565b9050610a7a565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610bad929190611c3e565b60405180910390a4610bc381878787878761115b565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316610c7f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016103b0565b336000610c8b846112b6565b90506000610c98846112b6565b9050610cb8838760008585604051806020016040528060008152506110e4565b6000858152602081815260408083206001600160a01b038a16845290915290205484811015610d355760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016103b0565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b816001600160a01b0316836001600160a01b031603610e255760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103b0565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610ef25760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103b0565b336000610efe856112b6565b90506000610f0b856112b6565b9050610f1c836000898585896110e4565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610f4c908490611c2b565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610da983600089898989611301565b6001600160a01b038416610fd25760405162461bcd60e51b81526004016103b090611b9c565b336000610fde856112b6565b90506000610feb856112b6565b9050610ffb8389898585896110e4565b6000868152602081815260408083206001600160a01b038c1684529091529020548581101561103c5760405162461bcd60e51b81526004016103b090611be1565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611079908490611c2b565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46110d9848a8a8a8a8a611301565b505050505050505050565b6001600160a01b03861660009081526005602052604090205460ff16610bc3576001600160a01b03851615610bc35760075460ff16610bc35760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b60448201526064016103b0565b6001600160a01b0384163b15610bc35760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061119f9089908990889088908890600401611c6c565b6020604051808303816000875af19250505080156111da575060408051601f3d908101601f191682019092526111d791810190611cca565b60015b611286576111e6611ce7565b806308c379a00361121f57506111fa611d03565b806112055750611221565b8060405162461bcd60e51b81526004016103b0919061158d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103b0565b6001600160e01b0319811663bc197c8160e01b14610da95760405162461bcd60e51b81526004016103b090611d8d565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106112f0576112f0611b28565b602090810291909101015292915050565b6001600160a01b0384163b15610bc35760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906113459089908990889088908890600401611dd5565b6020604051808303816000875af1925050508015611380575060408051601f3d908101601f1916820190925261137d91810190611cca565b60015b61138c576111e6611ce7565b6001600160e01b0319811663f23a6e6160e01b14610da95760405162461bcd60e51b81526004016103b090611d8d565b80356001600160a01b03811681146113d357600080fd5b919050565b600080604083850312156113eb57600080fd5b6113f4836113bc565b946020939093013593505050565b6001600160e01b03198116811461098357600080fd5b60006020828403121561142a57600080fd5b813561143581611402565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156114785761147861143c565b6040525050565b600067ffffffffffffffff8311156114995761149961143c565b6040516114b0601f8501601f191660200182611452565b8091508381528484840111156114c557600080fd5b83836020830137600060208583010152509392505050565b6000602082840312156114ef57600080fd5b813567ffffffffffffffff81111561150657600080fd5b8201601f8101841361151757600080fd5b6115268482356020840161147f565b949350505050565b60006020828403121561154057600080fd5b5035919050565b6000815180845260005b8181101561156d57602081850181015186830182015201611551565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006114356020830184611547565b600067ffffffffffffffff8211156115ba576115ba61143c565b5060051b60200190565b600082601f8301126115d557600080fd5b813560206115e2826115a0565b6040516115ef8282611452565b83815260059390931b850182019282810191508684111561160f57600080fd5b8286015b8481101561162a5780358352918301918301611613565b509695505050505050565b600082601f83011261164657600080fd5b6114358383356020850161147f565b600080600080600060a0868803121561166d57600080fd5b611676866113bc565b9450611684602087016113bc565b9350604086013567ffffffffffffffff808211156116a157600080fd5b6116ad89838a016115c4565b945060608801359150808211156116c357600080fd5b6116cf89838a016115c4565b935060808801359150808211156116e557600080fd5b506116f288828901611635565b9150509295509295909350565b6000806040838503121561171257600080fd5b823567ffffffffffffffff8082111561172a57600080fd5b818501915085601f83011261173e57600080fd5b8135602061174b826115a0565b6040516117588282611452565b83815260059390931b850182019282810191508984111561177857600080fd5b948201945b8386101561179d5761178e866113bc565b8252948201949082019061177d565b965050860135925050808211156117b357600080fd5b506117c0858286016115c4565b9150509250929050565b600081518084526020808501945080840160005b838110156117fa578151875295820195908201906001016117de565b509495945050505050565b60208152600061143560208301846117ca565b803563ffffffff811681146113d357600080fd5b6000806040838503121561183f57600080fd5b611848836113bc565b915061185660208401611818565b90509250929050565b60006020828403121561187157600080fd5b611435826113bc565b803580151581146113d357600080fd5b6000806040838503121561189d57600080fd5b6118a6836113bc565b91506118566020840161187a565b6000806000606084860312156118c957600080fd5b6118d2846113bc565b9250602084013591506118e760408501611818565b90509250925092565b60006020828403121561190257600080fd5b6114358261187a565b6000806040838503121561191e57600080fd5b611927836113bc565b9150611856602084016113bc565b600080600080600060a0868803121561194d57600080fd5b611956866113bc565b9450611964602087016113bc565b93506040860135925060608601359150608086013567ffffffffffffffff81111561198e57600080fd5b6116f288828901611635565b600181811c908216806119ae57607f821691505b6020821081036119ce57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561079c57600081815260208120601f850160051c810160208610156119fb5750805b601f850160051c820191505b81811015610bc357828155600101611a07565b815167ffffffffffffffff811115611a3457611a3461143c565b611a4881611a42845461199a565b846119d4565b602080601f831160018114611a7d5760008415611a655750858301515b600019600386901b1c1916600185901b178555610bc3565b600085815260208120601f198616915b82811015611aac57888601518255948401946001909101908401611a8d565b5085821015611aca5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611b6657611b66611b3e565b5060010190565b60208082526015908201527413db9b1e481b5bd91a599a595c88185b1b1bddd959605a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b808201808211156103dc576103dc611b3e565b604081526000611c5160408301856117ca565b8281036020840152611c6381856117ca565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611c98908301866117ca565b8281036060840152611caa81866117ca565b90508281036080840152611cbe8185611547565b98975050505050505050565b600060208284031215611cdc57600080fd5b815161143581611402565b600060033d1115611d005760046000803e5060005160e01c5b90565b600060443d1015611d115790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611d4157505050505090565b8285019150815181811115611d595750505050505090565b843d8701016020828501011115611d735750505050505090565b611d8260208286010187611452565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e0f90830184611547565b97965050505050505056fea2646970667358221220ef690b41fa67e776e2046fed511667bab0b81df78c51bc62673eec35397624af64736f6c63430008120033
Deployed Bytecode Sourcemap
107:1645:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2130:227:3;;;;;;:::i;:::-;;:::i;:::-;;;597:25:10;;;585:2;570:18;2130:227:3;;;;;;;;1181:305;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:10;;1177:22;1159:41;;1147:2;1132:18;1181:305:3;1019:187:10;1221:87:1;;;;;;:::i;:::-;;:::i;:::-;;1118:97;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3987:426:3:-;;;;;;:::i;:::-;;:::i;302:34:1:-;;;;;;;;;2514:486:3;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1817:101:9:-;;;:::i;771:112:1:-;;;;;;:::i;:::-;;:::i;1194:85:9:-;1266:6;;1194:85;;-1:-1:-1;;;;;1266:6:9;;;7521:51:10;;7509:2;7494:18;1194:85:9;7375:203:10;238:57:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;191:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3068:153:3;;;;;;:::i;:::-;;:::i;532:233:1:-;;;;;;:::i;:::-;;:::i;889:113::-;;;;;;:::i;:::-;;:::i;156:28::-;;;:::i;1314:93::-;;;;;;:::i;:::-;;:::i;3288:166:3:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3410:27:3;;;3387:4;3410:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3288:166;1008:104:1;;;;;;:::i;:::-;;:::i;3521:394:3:-;;;;;;:::i;:::-;;:::i;2067:198:9:-;;;;;;:::i;:::-;;:::i;2130:227:3:-;2216:7;-1:-1:-1;;;;;2243:21:3;;2235:76;;;;-1:-1:-1;;;2235:76:3;;10223:2:10;2235:76:3;;;10205:21:10;10262:2;10242:18;;;10235:30;10301:34;10281:18;;;10274:62;-1:-1:-1;;;10352:18:10;;;10345:40;10402:19;;2235:76:3;;;;;;;;;-1:-1:-1;2328:9:3;:13;;;;;;;;;;;-1:-1:-1;;;;;2328:22:3;;;;;;;;;;2130:227;;;;;:::o;1181:305::-;1283:4;-1:-1:-1;;;;;;1318:41:3;;-1:-1:-1;;;1318:41:3;;:109;;-1:-1:-1;;;;;;;1375:52:3;;-1:-1:-1;;;1375:52:3;1318:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:4;;;1443:36:3;829:155:4;1221:87:1;1087:13:9;:11;:13::i;:::-;1286:6:1::1;:15;1295:6:::0;1286;:15:::1;:::i;:::-;;1221:87:::0;:::o;1118:97::-;1170:13;1202:6;1195:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1118:97;;;:::o;3987:426:3:-;-1:-1:-1;;;;;4212:20:3;;719:10:2;4212:20:3;;:60;;-1:-1:-1;4236:36:3;4253:4;719:10:2;3288:166:3;:::i;4236:36::-;4191:153;;;;-1:-1:-1;;;4191:153:3;;;;;;;:::i;:::-;4354:52;4377:4;4383:2;4387:3;4392:7;4401:4;4354:22;:52::i;:::-;3987:426;;;;;:::o;2514:486::-;2647:16;2702:3;:10;2683:8;:15;:29;2675:83;;;;-1:-1:-1;;;2675:83:3;;13638:2:10;2675:83:3;;;13620:21:10;13677:2;13657:18;;;13650:30;13716:34;13696:18;;;13689:62;-1:-1:-1;;;13767:18:10;;;13760:39;13816:19;;2675:83:3;13436:405:10;2675:83:3;2769:30;2816:8;:15;2802:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2802:30:3;;2769:63;;2848:9;2843:120;2867:8;:15;2863:1;:19;2843:120;;;2922:30;2932:8;2941:1;2932:11;;;;;;;;:::i;:::-;;;;;;;2945:3;2949:1;2945:6;;;;;;;;:::i;:::-;;;;;;;2922:9;:30::i;:::-;2903:13;2917:1;2903:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2884:3;;;:::i;:::-;;;2843:120;;;-1:-1:-1;2980:13:3;2514:486;-1:-1:-1;;;2514:486:3:o;1817:101:9:-;1087:13;:11;:13::i;:::-;1881:30:::1;1908:1;1881:18;:30::i;:::-;1817:101::o:0;771:112:1:-;394:10;384:21;;;;:9;:21;;;;;;;;376:55;;;;-1:-1:-1;;;376:55:1;;;;;;;:::i;:::-;852:24:::1;858:6;866:1;869:6;852:5;:24::i;3068:153:3:-:0;3162:52;719:10:2;3195:8:3;3205;3162:18;:52::i;532:233:1:-;394:10;384:21;;;;:9;:21;;;;;;;;376:55;;;;-1:-1:-1;;;376:55:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;636:14:1;::::1;;::::0;;;:6:::1;:14;::::0;;;;;;;:21:::1;::::0;::::1;::::0;;;;;;;;::::1;;635:22;627:54;;;::::0;-1:-1:-1;;;627:54:1;;14802:2:10;627:54:1::1;::::0;::::1;14784:21:10::0;14841:2;14821:18;;;14814:30;-1:-1:-1;;;14860:18:10;;;14853:49;14919:18;;627:54:1::1;14600:343:10::0;627:54:1::1;-1:-1:-1::0;;;;;691:14:1;::::1;;::::0;;;:6:::1;:14;::::0;;;;;;;:21:::1;::::0;::::1;::::0;;;;;;;:28;;-1:-1:-1;;691:28:1::1;715:4;691:28:::0;;::::1;::::0;;;730;;;;::::1;::::0;;;;;;::::1;::::0;698:6;;747;;730:5:::1;:28::i;:::-;532:233:::0;;;:::o;889:113::-;394:10;384:21;;;;:9;:21;;;;;;;;376:55;;;;-1:-1:-1;;;376:55:1;;;;;;;:::i;:::-;967:28:::1;973:6;981:1;984:6;967:28;;;;;;;;;;;::::0;:5:::1;:28::i;156:::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1314:93::-;1087:13:9;:11;:13::i;:::-;1378:14:1::1;:22:::0;;-1:-1:-1;;1378:22:1::1;::::0;::::1;;::::0;;;::::1;::::0;;1314:93::o;1008:104::-;1087:13:9;:11;:13::i;:::-;-1:-1:-1;;;;;1082:14:1;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:23;;-1:-1:-1;;1082:23:1::1;::::0;::::1;;::::0;;;::::1;::::0;;1008:104::o;3521:394:3:-;-1:-1:-1;;;;;3721:20:3;;719:10:2;3721:20:3;;:60;;-1:-1:-1;3745:36:3;3762:4;719:10:2;3288:166:3;:::i;3745:36::-;3700:153;;;;-1:-1:-1;;;3700:153:3;;;;;;;:::i;:::-;3863:45;3881:4;3887:2;3891;3895:6;3903:4;3863:17;:45::i;2067:198:9:-;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2155:22:9;::::1;2147:73;;;::::0;-1:-1:-1;;;2147:73:9;;15150:2:10;2147:73:9::1;::::0;::::1;15132:21:10::0;15189:2;15169:18;;;15162:30;15228:34;15208:18;;;15201:62;-1:-1:-1;;;15279:18:10;;;15272:36;15325:19;;2147:73:9::1;14948:402:10::0;2147:73:9::1;2230:28;2249:8;2230:18;:28::i;:::-;2067:198:::0;:::o;1352:130::-;1266:6;;-1:-1:-1;;;;;1266:6:9;719:10:2;1415:23:9;1407:68;;;;-1:-1:-1;;;1407:68:9;;15557:2:10;1407:68:9;;;15539:21:10;;;15576:18;;;15569:30;15635:34;15615:18;;;15608:62;15687:18;;1407:68:9;15355:356:10;6156:1115:3;6376:7;:14;6362:3;:10;:28;6354:81;;;;-1:-1:-1;;;6354:81:3;;15918:2:10;6354:81:3;;;15900:21:10;15957:2;15937:18;;;15930:30;15996:34;15976:18;;;15969:62;-1:-1:-1;;;16047:18:10;;;16040:38;16095:19;;6354:81:3;15716:404:10;6354:81:3;-1:-1:-1;;;;;6453:16:3;;6445:66;;;;-1:-1:-1;;;6445:66:3;;;;;;;:::i;:::-;719:10:2;6564:60:3;719:10:2;6595:4:3;6601:2;6605:3;6610:7;6619:4;6564:20;:60::i;:::-;6640:9;6635:411;6659:3;:10;6655:1;:14;6635:411;;;6690:10;6703:3;6707:1;6703:6;;;;;;;;:::i;:::-;;;;;;;6690:19;;6723:14;6740:7;6748:1;6740:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6765:19;6787:13;;;;;;;;;;-1:-1:-1;;;;;6787:19:3;;;;;;;;;;;;6740:10;;-1:-1:-1;6828:21:3;;;;6820:76;;;;-1:-1:-1;;;6820:76:3;;;;;;;:::i;:::-;6938:9;:13;;;;;;;;;;;-1:-1:-1;;;;;6938:19:3;;;;;;;;;;6960:20;;;6938:42;;7008:17;;;;;;;:27;;6960:20;;6938:9;7008:27;;6960:20;;7008:27;:::i;:::-;;;;;;;;6676:370;;;6671:3;;;;:::i;:::-;;;6635:411;;;;7091:2;-1:-1:-1;;;;;7061:47:3;7085:4;-1:-1:-1;;;;;7061:47:3;7075:8;-1:-1:-1;;;;;7061:47:3;;7095:3;7100:7;7061:47;;;;;;;:::i;:::-;;;;;;;;7189:75;7225:8;7235:4;7241:2;7245:3;7250:7;7259:4;7189:35;:75::i;:::-;6344:927;6156:1115;;;;;:::o;2419:187:9:-;2511:6;;;-1:-1:-1;;;;;2527:17:9;;;-1:-1:-1;;;;;;2527:17:9;;;;;;;2559:40;;2511:6;;;2527:17;2511:6;;2559:40;;2492:16;;2559:40;2482:124;2419:187;:::o;10691:756:3:-;-1:-1:-1;;;;;10783:18:3;;10775:66;;;;-1:-1:-1;;;10775:66:3;;17744:2:10;10775:66:3;;;17726:21:10;17783:2;17763:18;;;17756:30;17822:34;17802:18;;;17795:62;-1:-1:-1;;;17873:18:10;;;17866:33;17916:19;;10775:66:3;17542:399:10;10775:66:3;719:10:2;10852:16:3;10916:21;10934:2;10916:17;:21::i;:::-;10893:44;;10947:24;10974:25;10992:6;10974:17;:25::i;:::-;10947:52;;11010:66;11031:8;11041:4;11055:1;11059:3;11064:7;11010:66;;;;;;;;;;;;:20;:66::i;:::-;11087:19;11109:13;;;;;;;;;;;-1:-1:-1;;;;;11109:19:3;;;;;;;;;;11146:21;;;;11138:70;;;;-1:-1:-1;;;11138:70:3;;18148:2:10;11138:70:3;;;18130:21:10;18187:2;18167:18;;;18160:30;18226:34;18206:18;;;18199:62;-1:-1:-1;;;18277:18:10;;;18270:34;18321:19;;11138:70:3;17946:400:10;11138:70:3;11242:9;:13;;;;;;;;;;;-1:-1:-1;;;;;11242:19:3;;;;;;;;;;;;11264:20;;;11242:42;;11310:54;;18525:25:10;;;18566:18;;;18559:34;;;11242:19:3;;11310:54;;;;;;18498:18:10;11310:54:3;;;;;;;11375:65;;;;;;;;;11419:1;11375:65;;;10765:682;;;;10691:756;;;:::o;12735:293::-;12855:8;-1:-1:-1;;;;;12846:17:3;:5;-1:-1:-1;;;;;12846:17:3;;12838:71;;;;-1:-1:-1;;;12838:71:3;;18806:2:10;12838:71:3;;;18788:21:10;18845:2;18825:18;;;18818:30;18884:34;18864:18;;;18857:62;-1:-1:-1;;;18935:18:10;;;18928:39;18984:19;;12838:71:3;18604:405:10;12838:71:3;-1:-1:-1;;;;;12919:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12919:46:3;;;;;;;;;;12980:41;;1159::10;;;12980::3;;1132:18:10;12980:41:3;;;;;;;12735:293;;;:::o;8553:671::-;-1:-1:-1;;;;;8662:16:3;;8654:62;;;;-1:-1:-1;;;8654:62:3;;19216:2:10;8654:62:3;;;19198:21:10;19255:2;19235:18;;;19228:30;19294:34;19274:18;;;19267:62;-1:-1:-1;;;19345:18:10;;;19338:31;19386:19;;8654:62:3;19014:397:10;8654:62:3;719:10:2;8727:16:3;8791:21;8809:2;8791:17;:21::i;:::-;8768:44;;8822:24;8849:25;8867:6;8849:17;:25::i;:::-;8822:52;;8885:66;8906:8;8924:1;8928:2;8932:3;8937:7;8946:4;8885:20;:66::i;:::-;8962:9;:13;;;;;;;;;;;-1:-1:-1;;;;;8962:17:3;;;;;;;;;:27;;8983:6;;8962:9;:27;;8983:6;;8962:27;:::i;:::-;;;;-1:-1:-1;;9004:52:3;;;18525:25:10;;;18581:2;18566:18;;18559:34;;;-1:-1:-1;;;;;9004:52:3;;;;9037:1;;9004:52;;;;;;18498:18:10;9004:52:3;;;;;;;9143:74;9174:8;9192:1;9196:2;9200;9204:6;9212:4;9143:30;:74::i;4863:947::-;-1:-1:-1;;;;;5044:16:3;;5036:66;;;;-1:-1:-1;;;5036:66:3;;;;;;;:::i;:::-;719:10:2;5113:16:3;5177:21;5195:2;5177:17;:21::i;:::-;5154:44;;5208:24;5235:25;5253:6;5235:17;:25::i;:::-;5208:52;;5271:60;5292:8;5302:4;5308:2;5312:3;5317:7;5326:4;5271:20;:60::i;:::-;5342:19;5364:13;;;;;;;;;;;-1:-1:-1;;;;;5364:19:3;;;;;;;;;;5401:21;;;;5393:76;;;;-1:-1:-1;;;5393:76:3;;;;;;;:::i;:::-;5503:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5503:19:3;;;;;;;;;;5525:20;;;5503:42;;5565:17;;;;;;;:27;;5525:20;;5503:9;5565:27;;5525:20;;5565:27;:::i;:::-;;;;-1:-1:-1;;5608:46:3;;;18525:25:10;;;18581:2;18566:18;;18559:34;;;-1:-1:-1;;;;;5608:46:3;;;;;;;;;;;;;;18498:18:10;5608:46:3;;;;;;;5735:68;5766:8;5776:4;5782:2;5786;5790:6;5798:4;5735:30;:68::i;:::-;5026:784;;;;4863:947;;;;;:::o;1413:337:1:-;-1:-1:-1;;;;;1620:19:1;;;;;;:9;:19;;;;;;;;1641:7;1617:31;-1:-1:-1;;;;;1660:18:1;;1657:30;1680:7;1657:30;1705:14;;;;1697:46;;;;-1:-1:-1;;;1697:46:1;;19618:2:10;1697:46:1;;;19600:21:10;19657:2;19637:18;;;19630:30;-1:-1:-1;;;19676:18:10;;;19669:49;19735:18;;1697:46:1;19416:343:10;16061:792:3;-1:-1:-1;;;;;16293:13:3;;1702:19:0;:23;16289:558:3;;16328:79;;-1:-1:-1;;;16328:79:3;;-1:-1:-1;;;;;16328:43:3;;;;;:79;;16372:8;;16382:4;;16388:3;;16393:7;;16402:4;;16328:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16328:79:3;;;;;;;;-1:-1:-1;;16328:79:3;;;;;;;;;;;;:::i;:::-;;;16324:513;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16713:6;16706:14;;-1:-1:-1;;;16706:14:3;;;;;;;;:::i;16324:513::-;;;16760:62;;-1:-1:-1;;;16760:62:3;;21912:2:10;16760:62:3;;;21894:21:10;21951:2;21931:18;;;21924:30;21990:34;21970:18;;;21963:62;-1:-1:-1;;;22041:18:10;;;22034:50;22101:19;;16760:62:3;21710:416:10;16324:513:3;-1:-1:-1;;;;;;16486:60:3;;-1:-1:-1;;;16486:60:3;16482:157;;16570:50;;-1:-1:-1;;;16570:50:3;;;;;;;:::i;16859:193::-;16978:16;;;16992:1;16978:16;;;;;;;;;16925;;16953:22;;16978:16;;;;;;;;;;;;-1:-1:-1;16978:16:3;16953:41;;17015:7;17004:5;17010:1;17004:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17040:5;16859:193;-1:-1:-1;;16859:193:3:o;15330:725::-;-1:-1:-1;;;;;15537:13:3;;1702:19:0;:23;15533:516:3;;15572:72;;-1:-1:-1;;;15572:72:3;;-1:-1:-1;;;;;15572:38:3;;;;;:72;;15611:8;;15621:4;;15627:2;;15631:6;;15639:4;;15572:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15572:72:3;;;;;;;;-1:-1:-1;;15572:72:3;;;;;;;;;;;;:::i;:::-;;;15568:471;;;;:::i;:::-;-1:-1:-1;;;;;;15693:55:3;;-1:-1:-1;;;15693:55:3;15689:152;;15772:50;;-1:-1:-1;;;15772:50:3;;;;;;;:::i;14:173:10:-;82:20;;-1:-1:-1;;;;;131:31:10;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:10:o;633:131::-;-1:-1:-1;;;;;;707:32:10;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:10:o;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:10;1418:40;;1488:18;1473:34;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:10:o;1597:469::-;1662:5;1696:18;1688:6;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:10;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;2282:18;2274:6;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:10;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;:::-;2432:84;2071:451;-1:-1:-1;;;;2071:451:10:o;2527:180::-;2586:6;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;-1:-1:-1;2678:23:10;;2527:180;-1:-1:-1;2527:180:10:o;2712:423::-;2754:3;2792:5;2786:12;2819:6;2814:3;2807:19;2844:1;2854:162;2868:6;2865:1;2862:13;2854:162;;;2930:4;2986:13;;;2982:22;;2976:29;2958:11;;;2954:20;;2947:59;2883:12;2854:162;;;2858:3;3061:1;3054:4;3045:6;3040:3;3036:16;3032:27;3025:38;3124:4;3117:2;3113:7;3108:2;3100:6;3096:15;3092:29;3087:3;3083:39;3079:50;3072:57;;;2712:423;;;;:::o;3140:220::-;3289:2;3278:9;3271:21;3252:4;3309:45;3350:2;3339:9;3335:18;3327:6;3309:45;:::i;3365:183::-;3425:4;3458:18;3450:6;3447:30;3444:56;;;3480:18;;:::i;:::-;-1:-1:-1;3525:1:10;3521:14;3537:4;3517:25;;3365:183::o;3553:724::-;3607:5;3660:3;3653:4;3645:6;3641:17;3637:27;3627:55;;3678:1;3675;3668:12;3627:55;3714:6;3701:20;3740:4;3763:43;3803:2;3763:43;:::i;:::-;3835:2;3829:9;3847:31;3875:2;3867:6;3847:31;:::i;:::-;3913:18;;;4005:1;4001:10;;;;3989:23;;3985:32;;;3947:15;;;;-1:-1:-1;4029:15:10;;;4026:35;;;4057:1;4054;4047:12;4026:35;4093:2;4085:6;4081:15;4105:142;4121:6;4116:3;4113:15;4105:142;;;4187:17;;4175:30;;4225:12;;;;4138;;4105:142;;;-1:-1:-1;4265:6:10;3553:724;-1:-1:-1;;;;;;3553:724:10:o;4282:221::-;4324:5;4377:3;4370:4;4362:6;4358:17;4354:27;4344:55;;4395:1;4392;4385:12;4344:55;4417:80;4493:3;4484:6;4471:20;4464:4;4456:6;4452:17;4417:80;:::i;4508:943::-;4662:6;4670;4678;4686;4694;4747:3;4735:9;4726:7;4722:23;4718:33;4715:53;;;4764:1;4761;4754:12;4715:53;4787:29;4806:9;4787:29;:::i;:::-;4777:39;;4835:38;4869:2;4858:9;4854:18;4835:38;:::i;:::-;4825:48;;4924:2;4913:9;4909:18;4896:32;4947:18;4988:2;4980:6;4977:14;4974:34;;;5004:1;5001;4994:12;4974:34;5027:61;5080:7;5071:6;5060:9;5056:22;5027:61;:::i;:::-;5017:71;;5141:2;5130:9;5126:18;5113:32;5097:48;;5170:2;5160:8;5157:16;5154:36;;;5186:1;5183;5176:12;5154:36;5209:63;5264:7;5253:8;5242:9;5238:24;5209:63;:::i;:::-;5199:73;;5325:3;5314:9;5310:19;5297:33;5281:49;;5355:2;5345:8;5342:16;5339:36;;;5371:1;5368;5361:12;5339:36;;5394:51;5437:7;5426:8;5415:9;5411:24;5394:51;:::i;:::-;5384:61;;;4508:943;;;;;;;;:::o;5456:1208::-;5574:6;5582;5635:2;5623:9;5614:7;5610:23;5606:32;5603:52;;;5651:1;5648;5641:12;5603:52;5691:9;5678:23;5720:18;5761:2;5753:6;5750:14;5747:34;;;5777:1;5774;5767:12;5747:34;5815:6;5804:9;5800:22;5790:32;;5860:7;5853:4;5849:2;5845:13;5841:27;5831:55;;5882:1;5879;5872:12;5831:55;5918:2;5905:16;5940:4;5963:43;6003:2;5963:43;:::i;:::-;6035:2;6029:9;6047:31;6075:2;6067:6;6047:31;:::i;:::-;6113:18;;;6201:1;6197:10;;;;6189:19;;6185:28;;;6147:15;;;;-1:-1:-1;6225:19:10;;;6222:39;;;6257:1;6254;6247:12;6222:39;6281:11;;;;6301:148;6317:6;6312:3;6309:15;6301:148;;;6383:23;6402:3;6383:23;:::i;:::-;6371:36;;6334:12;;;;6427;;;;6301:148;;;6468:6;-1:-1:-1;;6512:18:10;;6499:32;;-1:-1:-1;;6543:16:10;;;6540:36;;;6572:1;6569;6562:12;6540:36;;6595:63;6650:7;6639:8;6628:9;6624:24;6595:63;:::i;:::-;6585:73;;;5456:1208;;;;;:::o;6669:435::-;6722:3;6760:5;6754:12;6787:6;6782:3;6775:19;6813:4;6842:2;6837:3;6833:12;6826:19;;6879:2;6872:5;6868:14;6900:1;6910:169;6924:6;6921:1;6918:13;6910:169;;;6985:13;;6973:26;;7019:12;;;;7054:15;;;;6946:1;6939:9;6910:169;;;-1:-1:-1;7095:3:10;;6669:435;-1:-1:-1;;;;;6669:435:10:o;7109:261::-;7288:2;7277:9;7270:21;7251:4;7308:56;7360:2;7349:9;7345:18;7337:6;7308:56;:::i;7583:163::-;7650:20;;7710:10;7699:22;;7689:33;;7679:61;;7736:1;7733;7726:12;7751:258;7818:6;7826;7879:2;7867:9;7858:7;7854:23;7850:32;7847:52;;;7895:1;7892;7885:12;7847:52;7918:29;7937:9;7918:29;:::i;:::-;7908:39;;7966:37;7999:2;7988:9;7984:18;7966:37;:::i;:::-;7956:47;;7751:258;;;;;:::o;8014:186::-;8073:6;8126:2;8114:9;8105:7;8101:23;8097:32;8094:52;;;8142:1;8139;8132:12;8094:52;8165:29;8184:9;8165:29;:::i;8205:160::-;8270:20;;8326:13;;8319:21;8309:32;;8299:60;;8355:1;8352;8345:12;8370:254;8435:6;8443;8496:2;8484:9;8475:7;8471:23;8467:32;8464:52;;;8512:1;8509;8502:12;8464:52;8535:29;8554:9;8535:29;:::i;:::-;8525:39;;8583:35;8614:2;8603:9;8599:18;8583:35;:::i;8629:326::-;8705:6;8713;8721;8774:2;8762:9;8753:7;8749:23;8745:32;8742:52;;;8790:1;8787;8780:12;8742:52;8813:29;8832:9;8813:29;:::i;:::-;8803:39;;8889:2;8878:9;8874:18;8861:32;8851:42;;8912:37;8945:2;8934:9;8930:18;8912:37;:::i;:::-;8902:47;;8629:326;;;;;:::o;8960:180::-;9016:6;9069:2;9057:9;9048:7;9044:23;9040:32;9037:52;;;9085:1;9082;9075:12;9037:52;9108:26;9124:9;9108:26;:::i;9145:260::-;9213:6;9221;9274:2;9262:9;9253:7;9249:23;9245:32;9242:52;;;9290:1;9287;9280:12;9242:52;9313:29;9332:9;9313:29;:::i;:::-;9303:39;;9361:38;9395:2;9384:9;9380:18;9361:38;:::i;9410:606::-;9514:6;9522;9530;9538;9546;9599:3;9587:9;9578:7;9574:23;9570:33;9567:53;;;9616:1;9613;9606:12;9567:53;9639:29;9658:9;9639:29;:::i;:::-;9629:39;;9687:38;9721:2;9710:9;9706:18;9687:38;:::i;:::-;9677:48;;9772:2;9761:9;9757:18;9744:32;9734:42;;9823:2;9812:9;9808:18;9795:32;9785:42;;9878:3;9867:9;9863:19;9850:33;9906:18;9898:6;9895:30;9892:50;;;9938:1;9935;9928:12;9892:50;9961:49;10002:7;9993:6;9982:9;9978:22;9961:49;:::i;10432:380::-;10511:1;10507:12;;;;10554;;;10575:61;;10629:4;10621:6;10617:17;10607:27;;10575:61;10682:2;10674:6;10671:14;10651:18;10648:38;10645:161;;10728:10;10723:3;10719:20;10716:1;10709:31;10763:4;10760:1;10753:15;10791:4;10788:1;10781:15;10645:161;;10432:380;;;:::o;10943:545::-;11045:2;11040:3;11037:11;11034:448;;;11081:1;11106:5;11102:2;11095:17;11151:4;11147:2;11137:19;11221:2;11209:10;11205:19;11202:1;11198:27;11192:4;11188:38;11257:4;11245:10;11242:20;11239:47;;;-1:-1:-1;11280:4:10;11239:47;11335:2;11330:3;11326:12;11323:1;11319:20;11313:4;11309:31;11299:41;;11390:82;11408:2;11401:5;11398:13;11390:82;;;11453:17;;;11434:1;11423:13;11390:82;;11664:1352;11790:3;11784:10;11817:18;11809:6;11806:30;11803:56;;;11839:18;;:::i;:::-;11868:97;11958:6;11918:38;11950:4;11944:11;11918:38;:::i;:::-;11912:4;11868:97;:::i;:::-;12020:4;;12084:2;12073:14;;12101:1;12096:663;;;;12803:1;12820:6;12817:89;;;-1:-1:-1;12872:19:10;;;12866:26;12817:89;-1:-1:-1;;11621:1:10;11617:11;;;11613:24;11609:29;11599:40;11645:1;11641:11;;;11596:57;12919:81;;12066:944;;12096:663;10890:1;10883:14;;;10927:4;10914:18;;-1:-1:-1;;12132:20:10;;;12250:236;12264:7;12261:1;12258:14;12250:236;;;12353:19;;;12347:26;12332:42;;12445:27;;;;12413:1;12401:14;;;;12280:19;;12250:236;;;12254:3;12514:6;12505:7;12502:19;12499:201;;;12575:19;;;12569:26;-1:-1:-1;;12658:1:10;12654:14;;;12670:3;12650:24;12646:37;12642:42;12627:58;12612:74;;12499:201;-1:-1:-1;;;;;12746:1:10;12730:14;;;12726:22;12713:36;;-1:-1:-1;11664:1352:10:o;13021:410::-;13223:2;13205:21;;;13262:2;13242:18;;;13235:30;13301:34;13296:2;13281:18;;13274:62;-1:-1:-1;;;13367:2:10;13352:18;;13345:44;13421:3;13406:19;;13021:410::o;13846:127::-;13907:10;13902:3;13898:20;13895:1;13888:31;13938:4;13935:1;13928:15;13962:4;13959:1;13952:15;13978:127;14039:10;14034:3;14030:20;14027:1;14020:31;14070:4;14067:1;14060:15;14094:4;14091:1;14084:15;14110:135;14149:3;14170:17;;;14167:43;;14190:18;;:::i;:::-;-1:-1:-1;14237:1:10;14226:13;;14110:135::o;14250:345::-;14452:2;14434:21;;;14491:2;14471:18;;;14464:30;-1:-1:-1;;;14525:2:10;14510:18;;14503:51;14586:2;14571:18;;14250:345::o;16125:401::-;16327:2;16309:21;;;16366:2;16346:18;;;16339:30;16405:34;16400:2;16385:18;;16378:62;-1:-1:-1;;;16471:2:10;16456:18;;16449:35;16516:3;16501:19;;16125:401::o;16531:406::-;16733:2;16715:21;;;16772:2;16752:18;;;16745:30;16811:34;16806:2;16791:18;;16784:62;-1:-1:-1;;;16877:2:10;16862:18;;16855:40;16927:3;16912:19;;16531:406::o;16942:125::-;17007:9;;;17028:10;;;17025:36;;;17041:18;;:::i;17072:465::-;17329:2;17318:9;17311:21;17292:4;17355:56;17407:2;17396:9;17392:18;17384:6;17355:56;:::i;:::-;17459:9;17451:6;17447:22;17442:2;17431:9;17427:18;17420:50;17487:44;17524:6;17516;17487:44;:::i;:::-;17479:52;17072:465;-1:-1:-1;;;;;17072:465:10:o;19764:827::-;-1:-1:-1;;;;;20161:15:10;;;20143:34;;20213:15;;20208:2;20193:18;;20186:43;20123:3;20260:2;20245:18;;20238:31;;;20086:4;;20292:57;;20329:19;;20321:6;20292:57;:::i;:::-;20397:9;20389:6;20385:22;20380:2;20369:9;20365:18;20358:50;20431:44;20468:6;20460;20431:44;:::i;:::-;20417:58;;20524:9;20516:6;20512:22;20506:3;20495:9;20491:19;20484:51;20552:33;20578:6;20570;20552:33;:::i;:::-;20544:41;19764:827;-1:-1:-1;;;;;;;;19764:827:10:o;20596:249::-;20665:6;20718:2;20706:9;20697:7;20693:23;20689:32;20686:52;;;20734:1;20731;20724:12;20686:52;20766:9;20760:16;20785:30;20809:5;20785:30;:::i;20850:179::-;20885:3;20927:1;20909:16;20906:23;20903:120;;;20973:1;20970;20967;20952:23;-1:-1:-1;21010:1:10;21004:8;20999:3;20995:18;20903:120;20850:179;:::o;21034:671::-;21073:3;21115:4;21097:16;21094:26;21091:39;;;21034:671;:::o;21091:39::-;21157:2;21151:9;-1:-1:-1;;21222:16:10;21218:25;;21215:1;21151:9;21194:50;21273:4;21267:11;21297:16;21332:18;21403:2;21396:4;21388:6;21384:17;21381:25;21376:2;21368:6;21365:14;21362:45;21359:58;;;21410:5;;;;;21034:671;:::o;21359:58::-;21447:6;21441:4;21437:17;21426:28;;21483:3;21477:10;21510:2;21502:6;21499:14;21496:27;;;21516:5;;;;;;21034:671;:::o;21496:27::-;21600:2;21581:16;21575:4;21571:27;21567:36;21560:4;21551:6;21546:3;21542:16;21538:27;21535:69;21532:82;;;21607:5;;;;;;21034:671;:::o;21532:82::-;21623:57;21674:4;21665:6;21657;21653:19;21649:30;21643:4;21623:57;:::i;:::-;-1:-1:-1;21696:3:10;;21034:671;-1:-1:-1;;;;;21034:671:10:o;22131:404::-;22333:2;22315:21;;;22372:2;22352:18;;;22345:30;22411:34;22406:2;22391:18;;22384:62;-1:-1:-1;;;22477:2:10;22462:18;;22455:38;22525:3;22510:19;;22131:404::o;22540:561::-;-1:-1:-1;;;;;22837:15:10;;;22819:34;;22889:15;;22884:2;22869:18;;22862:43;22936:2;22921:18;;22914:34;;;22979:2;22964:18;;22957:34;;;22799:3;23022;23007:19;;23000:32;;;22762:4;;23049:46;;23075:19;;23067:6;23049:46;:::i;:::-;23041:54;22540:561;-1:-1:-1;;;;;;;22540:561:10:o
Swarm Source
ipfs://ef690b41fa67e776e2046fed511667bab0b81df78c51bc62673eec35397624af
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.