Polygon Sponsored slots available. Book your slot here!
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 306 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 72520662 | 230 days ago | IN | 0 POL | 0.00171601 | ||||
| Set Approval For... | 72096478 | 241 days ago | IN | 0 POL | 0.0016456 | ||||
| Set Approval For... | 70932318 | 269 days ago | IN | 0 POL | 0.00248426 | ||||
| Set Approval For... | 69561249 | 303 days ago | IN | 0 POL | 0.0015094 | ||||
| Set Approval For... | 66763281 | 373 days ago | IN | 0 POL | 0.00179417 | ||||
| Set Approval For... | 66286596 | 386 days ago | IN | 0 POL | 0.00138732 | ||||
| Set Approval For... | 66254776 | 386 days ago | IN | 0 POL | 0.00497354 | ||||
| Set Approval For... | 65043641 | 417 days ago | IN | 0 POL | 0.0013918 | ||||
| Set Approval For... | 65031384 | 417 days ago | IN | 0 POL | 0.0019584 | ||||
| Set Approval For... | 64984017 | 419 days ago | IN | 0 POL | 0.00106111 | ||||
| Set Approval For... | 64984014 | 419 days ago | IN | 0 POL | 0.00190592 | ||||
| Set Approval For... | 64856374 | 422 days ago | IN | 0 POL | 0.00138733 | ||||
| Set Approval For... | 64774333 | 424 days ago | IN | 0 POL | 0.00161862 | ||||
| Set Approval For... | 64524452 | 430 days ago | IN | 0 POL | 0.00162258 | ||||
| Set Approval For... | 64177335 | 439 days ago | IN | 0 POL | 0.00285876 | ||||
| Set Approval For... | 64031624 | 442 days ago | IN | 0 POL | 0.00267895 | ||||
| Set Approval For... | 63414630 | 458 days ago | IN | 0 POL | 0.01121564 | ||||
| Set Approval For... | 63031015 | 467 days ago | IN | 0 POL | 0.00799674 | ||||
| Set Approval For... | 62878715 | 471 days ago | IN | 0 POL | 0.0017442 | ||||
| Set Approval For... | 62663909 | 476 days ago | IN | 0 POL | 0.00138732 | ||||
| Set Approval For... | 62345016 | 484 days ago | IN | 0 POL | 0.00138733 | ||||
| Set Approval For... | 62320884 | 485 days ago | IN | 0 POL | 0.00138732 | ||||
| Set Approval For... | 61358944 | 509 days ago | IN | 0 POL | 0.00139055 | ||||
| Set Approval For... | 60778881 | 523 days ago | IN | 0 POL | 0.0013848 | ||||
| Set Approval For... | 60730871 | 525 days ago | IN | 0 POL | 0.00138732 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SLCPackagedNFT
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol"; import "@openzeppelin/[email protected]/access/AccessControl.sol"; // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol contract SLCPackagedNFT is ERC721, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); // auto mint tokenid = 1000 uint256 private BATCH_TOKEN_INC_INDEX = 0; // The maximum `quantity` that can be minted with {_mintERC721}. // This limit is to prevent overflows on the address data entries. // For a limit of 1000, a total of 3.689e15 calls to {_mintERC721} // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_QUANTITY_LIMIT = 1000; // modify batch start token only modify once. bool private modifyBatchToken = false; /** * batch mint and free mint start tokenId */ uint256 public maxTokenID; /** * nft baseUri */ string public baseUri; constructor( string memory _name, string memory _symbol, string memory _baseUri ) ERC721(_name, _symbol) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(BURNER_ROLE, _msgSender()); baseUri = _baseUri; maxTokenID = BATCH_TOKEN_INC_INDEX; } function setBatchStartTokenId(uint256 startTokenId) external onlyRole(DEFAULT_ADMIN_ROLE) { require( !modifyBatchToken, "NFT business has been launched and modification is not allowed." ); BATCH_TOKEN_INC_INDEX= startTokenId; maxTokenID = startTokenId; modifyBatchToken = true; } function setBaseURI(string memory _baseURIString) external onlyRole(DEFAULT_ADMIN_ROLE) { baseUri = _baseURIString; } function _baseURI() internal view override returns (string memory) { return baseUri; } function mint(address _to, uint256 _tokenId) external onlyRole(MINTER_ROLE) { require(_to != address(0), "require to address"); require(_tokenId <= BATCH_TOKEN_INC_INDEX, "Array length must equal. "); _mint(_to, _tokenId); modifyBatchToken = true; } function batchMint(address _to, uint256 _amount) external onlyRole(MINTER_ROLE) { require(_to != address(0), "require to address"); require(_amount > 0, "Amount must be greater than 0."); require(_amount <= MAX_MINT_QUANTITY_LIMIT, "Quantity overflow 1000."); for (uint256 i = 0; i < _amount; i++) { maxTokenID = maxTokenID + 1; _mint(_to, maxTokenID); } modifyBatchToken = true; } function ownerBatchMint(address[] calldata _tos) external onlyRole(MINTER_ROLE) { require(_tos.length > 0, "Array length must be greater than 0. "); require( _tos.length <= MAX_MINT_QUANTITY_LIMIT, "Quantity overflow 1000." ); for (uint256 i = 0; i < _tos.length; i++) { maxTokenID = maxTokenID + 1; _mint(_tos[i], maxTokenID); } modifyBatchToken = true; } function burn(uint256 _tokenId) external onlyRole(BURNER_ROLE) { _burn(_tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _ownerOf(tokenId);
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _ownerOf(tokenId) != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId, 1);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId, 1);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId, 1);
// Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
unchecked {
// Cannot overflow, as that would require more tokens to be burned/transferred
// out than the owner initially received through minting and transferring in.
_balances[owner] -= 1;
}
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId, 1);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId, 1);
// Check that tokenId was not transferred by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
unchecked {
// `_balances[from]` cannot overflow for the same reason as described in `_burn`:
// `from`'s balance is the number of token held, which is at least one before the current
// transfer.
// `_balances[to]` could overflow in the conditions described in `_mint`. That would require
// all 2**256 token ids to be minted, which in practice is impossible.
_balances[from] -= 1;
_balances[to] += 1;
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @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, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
* - When `from` is zero, the tokens will be minted for `to`.
* - When `to` is zero, ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256, /* firstTokenId */
uint256 batchSize
) internal virtual {
if (batchSize > 1) {
if (from != address(0)) {
_balances[from] -= batchSize;
}
if (to != address(0)) {
_balances[to] += batchSize;
}
}
}
/**
* @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
* used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
* - When `from` is zero, the tokens were minted for `to`.
* - When `to` is zero, ``from``'s tokens were burned.
* - `from` and `to` are never both zero.
* - `batchSize` is non-zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 firstTokenId,
uint256 batchSize
) internal virtual {}
}// 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.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// 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.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return 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 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// 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.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// �� `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// �� `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"}],"name":"ownerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"string","name":"_baseURIString","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTokenId","type":"uint256"}],"name":"setBatchStartTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260006007556008805460ff191690553480156200002057600080fd5b506040516200266138038062002661833981016040819052620000439162000264565b8282600062000053838262000384565b50600162000062828262000384565b506200007491506000905033620000eb565b620000a07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000eb565b620000cc7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833620000eb565b600a620000da828262000384565b505060075460095550620004509050565b620000f78282620000fb565b5050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620000f75760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200015b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001c757600080fd5b81516001600160401b0380821115620001e457620001e46200019f565b604051601f8301601f19908116603f011681019082821181831017156200020f576200020f6200019f565b816040528381526020925086838588010111156200022c57600080fd5b600091505b8382101562000250578582018301518183018401529082019062000231565b600093810190920192909252949350505050565b6000806000606084860312156200027a57600080fd5b83516001600160401b03808211156200029257600080fd5b620002a087838801620001b5565b94506020860151915080821115620002b757600080fd5b620002c587838801620001b5565b93506040860151915080821115620002dc57600080fd5b50620002eb86828701620001b5565b9150509250925092565b600181811c908216806200030a57607f821691505b6020821081036200032b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037f57600081815260208120601f850160051c810160208610156200035a5750805b601f850160051c820191505b818110156200037b5782815560010162000366565b5050505b505050565b81516001600160401b03811115620003a057620003a06200019f565b620003b881620003b18454620002f5565b8462000331565b602080601f831160018114620003f05760008415620003d75750858301515b600019600386901b1c1916600185901b1785556200037b565b600085815260208120601f198616915b82811015620004215788860151825594840194600190910190840162000400565b5085821015620004405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61220180620004606000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806343508b05116101045780639abc8320116100a2578063c87b56dd11610071578063c87b56dd146103e7578063d5391393146103fa578063d547741f1461040f578063e985e9c51461042257600080fd5b80639abc8320146103b1578063a217fddf146103b9578063a22cb465146103c1578063b88d4fde146103d457600080fd5b80636352211e116100de5780636352211e1461037057806370a082311461038357806391d148541461039657806395d89b41146103a957600080fd5b806343508b051461034157806355f804b3146103545780635a570c0c1461036757600080fd5b80632f2ff15d1161017157806340c10f191161014b57806340c10f19146102f55780634253e8a01461030857806342842e0e1461031b57806342966c681461032e57600080fd5b80632f2ff15d146102bc57806336568abe146102cf5780633e262e5a146102e257600080fd5b8063095ea7b3116101ad578063095ea7b31461023c57806323b872dd14610251578063248a9ca314610264578063282c51f31461029557600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611a5a565b61045e565b60405190151581526020015b60405180910390f35b61020461046f565b6040516101f39190611ac7565b61022461021f366004611ada565b610501565b6040516001600160a01b0390911681526020016101f3565b61024f61024a366004611b0f565b610528565b005b61024f61025f366004611b39565b610642565b610287610272366004611ada565b60009081526006602052604090206001015490565b6040519081526020016101f3565b6102877f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61024f6102ca366004611b75565b610673565b61024f6102dd366004611b75565b610698565b61024f6102f0366004611ba1565b610716565b61024f610303366004611b0f565b610848565b61024f610316366004611ada565b610919565b61024f610329366004611b39565b6109b5565b61024f61033c366004611ada565b6109d0565b61024f61034f366004611b0f565b610a03565b61024f610362366004611ca2565b610b3d565b61028760095481565b61022461037e366004611ada565b610b54565b610287610391366004611ceb565b610bb4565b6101e76103a4366004611b75565b610c3a565b610204610c65565b610204610c74565b610287600081565b61024f6103cf366004611d06565b610d02565b61024f6103e2366004611d42565b610d0d565b6102046103f5366004611ada565b610d45565b6102876000805160206121ac83398151915281565b61024f61041d366004611b75565b610dac565b6101e7610430366004611dbe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061046982610dd1565b92915050565b60606000805461047e90611de8565b80601f01602080910402602001604051908101604052809291908181526020018280546104aa90611de8565b80156104f75780601f106104cc576101008083540402835291602001916104f7565b820191906000526020600020905b8154815290600101906020018083116104da57829003601f168201915b5050505050905090565b600061050c82610df6565b506000908152600460205260409020546001600160a01b031690565b600061053382610b54565b9050806001600160a01b0316836001600160a01b0316036105a55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105c157506105c18133610430565b6106335760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161059c565b61063d8383610e58565b505050565b61064c3382610ec6565b6106685760405162461bcd60e51b815260040161059c90611e22565b61063d838383610f45565b60008281526006602052604090206001015461068e816110b6565b61063d83836110c0565b6001600160a01b03811633146107085760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161059c565b6107128282611146565b5050565b6000805160206121ac83398151915261072e816110b6565b816107895760405162461bcd60e51b815260206004820152602560248201527f4172726179206c656e677468206d757374206265206772656174657220746861604482015264037101817160dd1b606482015260840161059c565b6103e88211156107d55760405162461bcd60e51b815260206004820152601760248201527628bab0b73a34ba3c9037bb32b9333637bb90189818181760491b604482015260640161059c565b60005b82811015610835576009546107ee906001611e85565b60095561082384848381811061080657610806611e98565b905060200201602081019061081b9190611ceb565b6009546111ad565b8061082d81611eae565b9150506107d8565b50506008805460ff191660011790555050565b6000805160206121ac833981519152610860816110b6565b6001600160a01b0383166108ab5760405162461bcd60e51b81526020600482015260126024820152717265717569726520746f206164647265737360701b604482015260640161059c565b6007548211156108fd5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e677468206d75737420657175616c2e2000000000000000604482015260640161059c565b61090783836111ad565b50506008805460ff1916600117905550565b6000610924816110b6565b60085460ff161561099d5760405162461bcd60e51b815260206004820152603f60248201527f4e465420627573696e65737320686173206265656e206c61756e63686564206160448201527f6e64206d6f64696669636174696f6e206973206e6f7420616c6c6f7765642e00606482015260840161059c565b5060078190556009556008805460ff19166001179055565b61063d83838360405180602001604052806000815250610d0d565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486109fa816110b6565b61071282611346565b6000805160206121ac833981519152610a1b816110b6565b6001600160a01b038316610a665760405162461bcd60e51b81526020600482015260126024820152717265717569726520746f206164647265737360701b604482015260640161059c565b60008211610ab65760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206d7573742062652067726561746572207468616e20302e0000604482015260640161059c565b6103e8821115610b025760405162461bcd60e51b815260206004820152601760248201527628bab0b73a34ba3c9037bb32b9333637bb90189818181760491b604482015260640161059c565b60005b8281101561083557600954610b1b906001611e85565b6009819055610b2b9085906111ad565b80610b3581611eae565b915050610b05565b6000610b48816110b6565b600a61063d8382611f15565b6000818152600260205260408120546001600160a01b0316806104695760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161059c565b60006001600160a01b038216610c1e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161059c565b506001600160a01b031660009081526003602052604090205490565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461047e90611de8565b600a8054610c8190611de8565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad90611de8565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b505050505081565b6107123383836113e9565b610d173383610ec6565b610d335760405162461bcd60e51b815260040161059c90611e22565b610d3f848484846114b7565b50505050565b6060610d5082610df6565b6000610d5a6114ea565b90506000815111610d7a5760405180602001604052806000815250610da5565b80610d84846114f9565b604051602001610d95929190611fd5565b6040516020818303038152906040525b9392505050565b600082815260066020526040902060010154610dc7816110b6565b61063d8383611146565b60006001600160e01b03198216637965db0b60e01b148061046957506104698261158c565b6000818152600260205260409020546001600160a01b0316610e555760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161059c565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e8d82610b54565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610ed283610b54565b9050806001600160a01b0316846001600160a01b03161480610f1957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610f3d5750836001600160a01b0316610f3284610501565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f5882610b54565b6001600160a01b031614610f7e5760405162461bcd60e51b815260040161059c90612004565b6001600160a01b038216610fe05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161059c565b610fed83838360016115dc565b826001600160a01b031661100082610b54565b6001600160a01b0316146110265760405162461bcd60e51b815260040161059c90612004565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e558133611664565b6110ca8282610c3a565b6107125760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556111023390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111508282610c3a565b156107125760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0382166112035760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161059c565b6000818152600260205260409020546001600160a01b0316156112685760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161059c565b6112766000838360016115dc565b6000818152600260205260409020546001600160a01b0316156112db5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161059c565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061135182610b54565b90506113618160008460016115dc565b61136a82610b54565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b03160361144a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161059c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114c2848484610f45565b6114ce848484846116bd565b610d3f5760405162461bcd60e51b815260040161059c90612049565b6060600a805461047e90611de8565b60606000611506836117be565b600101905060008167ffffffffffffffff81111561152657611526611c16565b6040519080825280601f01601f191660200182016040528015611550576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461155a57509392505050565b60006001600160e01b031982166380ac58cd60e01b14806115bd57506001600160e01b03198216635b5e139f60e01b145b8061046957506301ffc9a760e01b6001600160e01b0319831614610469565b6001811115610d3f576001600160a01b03841615611622576001600160a01b0384166000908152600360205260408120805483929061161c90849061209b565b90915550505b6001600160a01b03831615610d3f576001600160a01b03831660009081526003602052604081208054839290611659908490611e85565b909155505050505050565b61166e8282610c3a565b6107125761167b81611896565b6116868360206118a8565b6040516020016116979291906120ae565b60408051601f198184030181529082905262461bcd60e51b825261059c91600401611ac7565b60006001600160a01b0384163b156117b357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611701903390899088908890600401612123565b6020604051808303816000875af192505050801561173c575060408051601f3d908101601f1916820190925261173991810190612160565b60015b611799573d80801561176a576040519150601f19603f3d011682016040523d82523d6000602084013e61176f565b606091505b5080516000036117915760405162461bcd60e51b815260040161059c90612049565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f3d565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106117fd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611829576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061184757662386f26fc10000830492506010015b6305f5e100831061185f576305f5e100830492506008015b612710831061187357612710830492506004015b60648310611885576064830492506002015b600a83106104695760010192915050565b60606104696001600160a01b03831660145b606060006118b783600261217d565b6118c2906002611e85565b67ffffffffffffffff8111156118da576118da611c16565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b509050600360fc1b8160008151811061191f5761191f611e98565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061194e5761194e611e98565b60200101906001600160f81b031916908160001a905350600061197284600261217d565b61197d906001611e85565b90505b60018111156119f5576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119b1576119b1611e98565b1a60f81b8282815181106119c7576119c7611e98565b60200101906001600160f81b031916908160001a90535060049490941c936119ee81612194565b9050611980565b508315610da55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161059c565b6001600160e01b031981168114610e5557600080fd5b600060208284031215611a6c57600080fd5b8135610da581611a44565b60005b83811015611a92578181015183820152602001611a7a565b50506000910152565b60008151808452611ab3816020860160208601611a77565b601f01601f19169290920160200192915050565b602081526000610da56020830184611a9b565b600060208284031215611aec57600080fd5b5035919050565b80356001600160a01b0381168114611b0a57600080fd5b919050565b60008060408385031215611b2257600080fd5b611b2b83611af3565b946020939093013593505050565b600080600060608486031215611b4e57600080fd5b611b5784611af3565b9250611b6560208501611af3565b9150604084013590509250925092565b60008060408385031215611b8857600080fd5b82359150611b9860208401611af3565b90509250929050565b60008060208385031215611bb457600080fd5b823567ffffffffffffffff80821115611bcc57600080fd5b818501915085601f830112611be057600080fd5b813581811115611bef57600080fd5b8660208260051b8501011115611c0457600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611c4757611c47611c16565b604051601f8501601f19908116603f01168101908282118183101715611c6f57611c6f611c16565b81604052809350858152868686011115611c8857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611cb457600080fd5b813567ffffffffffffffff811115611ccb57600080fd5b8201601f81018413611cdc57600080fd5b610f3d84823560208401611c2c565b600060208284031215611cfd57600080fd5b610da582611af3565b60008060408385031215611d1957600080fd5b611d2283611af3565b915060208301358015158114611d3757600080fd5b809150509250929050565b60008060008060808587031215611d5857600080fd5b611d6185611af3565b9350611d6f60208601611af3565b925060408501359150606085013567ffffffffffffffff811115611d9257600080fd5b8501601f81018713611da357600080fd5b611db287823560208401611c2c565b91505092959194509250565b60008060408385031215611dd157600080fd5b611dda83611af3565b9150611b9860208401611af3565b600181811c90821680611dfc57607f821691505b602082108103611e1c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561046957610469611e6f565b634e487b7160e01b600052603260045260246000fd5b600060018201611ec057611ec0611e6f565b5060010190565b601f82111561063d57600081815260208120601f850160051c81016020861015611eee5750805b601f850160051c820191505b81811015611f0d57828155600101611efa565b505050505050565b815167ffffffffffffffff811115611f2f57611f2f611c16565b611f4381611f3d8454611de8565b84611ec7565b602080601f831160018114611f785760008415611f605750858301515b600019600386901b1c1916600185901b178555611f0d565b600085815260208120601f198616915b82811015611fa757888601518255948401946001909101908401611f88565b5085821015611fc55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351611fe7818460208801611a77565b835190830190611ffb818360208801611a77565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b8181038181111561046957610469611e6f565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516120e6816017850160208801611a77565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612117816028840160208801611a77565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061215690830184611a9b565b9695505050505050565b60006020828403121561217257600080fd5b8151610da581611a44565b808202811582820484141761046957610469611e6f565b6000816121a3576121a3611e6f565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a264697066735822122027689b65dc898158b0edee39dd1e17d3f6a92db6339fab5c28b04960bef1fd2c64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000f534c432d7061636b616765644e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000541704e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f6c61756e636861737365742e636f7265736b792e636f6d2f70672f736c632f00000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806343508b05116101045780639abc8320116100a2578063c87b56dd11610071578063c87b56dd146103e7578063d5391393146103fa578063d547741f1461040f578063e985e9c51461042257600080fd5b80639abc8320146103b1578063a217fddf146103b9578063a22cb465146103c1578063b88d4fde146103d457600080fd5b80636352211e116100de5780636352211e1461037057806370a082311461038357806391d148541461039657806395d89b41146103a957600080fd5b806343508b051461034157806355f804b3146103545780635a570c0c1461036757600080fd5b80632f2ff15d1161017157806340c10f191161014b57806340c10f19146102f55780634253e8a01461030857806342842e0e1461031b57806342966c681461032e57600080fd5b80632f2ff15d146102bc57806336568abe146102cf5780633e262e5a146102e257600080fd5b8063095ea7b3116101ad578063095ea7b31461023c57806323b872dd14610251578063248a9ca314610264578063282c51f31461029557600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611a5a565b61045e565b60405190151581526020015b60405180910390f35b61020461046f565b6040516101f39190611ac7565b61022461021f366004611ada565b610501565b6040516001600160a01b0390911681526020016101f3565b61024f61024a366004611b0f565b610528565b005b61024f61025f366004611b39565b610642565b610287610272366004611ada565b60009081526006602052604090206001015490565b6040519081526020016101f3565b6102877f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61024f6102ca366004611b75565b610673565b61024f6102dd366004611b75565b610698565b61024f6102f0366004611ba1565b610716565b61024f610303366004611b0f565b610848565b61024f610316366004611ada565b610919565b61024f610329366004611b39565b6109b5565b61024f61033c366004611ada565b6109d0565b61024f61034f366004611b0f565b610a03565b61024f610362366004611ca2565b610b3d565b61028760095481565b61022461037e366004611ada565b610b54565b610287610391366004611ceb565b610bb4565b6101e76103a4366004611b75565b610c3a565b610204610c65565b610204610c74565b610287600081565b61024f6103cf366004611d06565b610d02565b61024f6103e2366004611d42565b610d0d565b6102046103f5366004611ada565b610d45565b6102876000805160206121ac83398151915281565b61024f61041d366004611b75565b610dac565b6101e7610430366004611dbe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600061046982610dd1565b92915050565b60606000805461047e90611de8565b80601f01602080910402602001604051908101604052809291908181526020018280546104aa90611de8565b80156104f75780601f106104cc576101008083540402835291602001916104f7565b820191906000526020600020905b8154815290600101906020018083116104da57829003601f168201915b5050505050905090565b600061050c82610df6565b506000908152600460205260409020546001600160a01b031690565b600061053382610b54565b9050806001600160a01b0316836001600160a01b0316036105a55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105c157506105c18133610430565b6106335760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161059c565b61063d8383610e58565b505050565b61064c3382610ec6565b6106685760405162461bcd60e51b815260040161059c90611e22565b61063d838383610f45565b60008281526006602052604090206001015461068e816110b6565b61063d83836110c0565b6001600160a01b03811633146107085760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161059c565b6107128282611146565b5050565b6000805160206121ac83398151915261072e816110b6565b816107895760405162461bcd60e51b815260206004820152602560248201527f4172726179206c656e677468206d757374206265206772656174657220746861604482015264037101817160dd1b606482015260840161059c565b6103e88211156107d55760405162461bcd60e51b815260206004820152601760248201527628bab0b73a34ba3c9037bb32b9333637bb90189818181760491b604482015260640161059c565b60005b82811015610835576009546107ee906001611e85565b60095561082384848381811061080657610806611e98565b905060200201602081019061081b9190611ceb565b6009546111ad565b8061082d81611eae565b9150506107d8565b50506008805460ff191660011790555050565b6000805160206121ac833981519152610860816110b6565b6001600160a01b0383166108ab5760405162461bcd60e51b81526020600482015260126024820152717265717569726520746f206164647265737360701b604482015260640161059c565b6007548211156108fd5760405162461bcd60e51b815260206004820152601960248201527f4172726179206c656e677468206d75737420657175616c2e2000000000000000604482015260640161059c565b61090783836111ad565b50506008805460ff1916600117905550565b6000610924816110b6565b60085460ff161561099d5760405162461bcd60e51b815260206004820152603f60248201527f4e465420627573696e65737320686173206265656e206c61756e63686564206160448201527f6e64206d6f64696669636174696f6e206973206e6f7420616c6c6f7765642e00606482015260840161059c565b5060078190556009556008805460ff19166001179055565b61063d83838360405180602001604052806000815250610d0d565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486109fa816110b6565b61071282611346565b6000805160206121ac833981519152610a1b816110b6565b6001600160a01b038316610a665760405162461bcd60e51b81526020600482015260126024820152717265717569726520746f206164647265737360701b604482015260640161059c565b60008211610ab65760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206d7573742062652067726561746572207468616e20302e0000604482015260640161059c565b6103e8821115610b025760405162461bcd60e51b815260206004820152601760248201527628bab0b73a34ba3c9037bb32b9333637bb90189818181760491b604482015260640161059c565b60005b8281101561083557600954610b1b906001611e85565b6009819055610b2b9085906111ad565b80610b3581611eae565b915050610b05565b6000610b48816110b6565b600a61063d8382611f15565b6000818152600260205260408120546001600160a01b0316806104695760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161059c565b60006001600160a01b038216610c1e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161059c565b506001600160a01b031660009081526003602052604090205490565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461047e90611de8565b600a8054610c8190611de8565b80601f0160208091040260200160405190810160405280929190818152602001828054610cad90611de8565b8015610cfa5780601f10610ccf57610100808354040283529160200191610cfa565b820191906000526020600020905b815481529060010190602001808311610cdd57829003601f168201915b505050505081565b6107123383836113e9565b610d173383610ec6565b610d335760405162461bcd60e51b815260040161059c90611e22565b610d3f848484846114b7565b50505050565b6060610d5082610df6565b6000610d5a6114ea565b90506000815111610d7a5760405180602001604052806000815250610da5565b80610d84846114f9565b604051602001610d95929190611fd5565b6040516020818303038152906040525b9392505050565b600082815260066020526040902060010154610dc7816110b6565b61063d8383611146565b60006001600160e01b03198216637965db0b60e01b148061046957506104698261158c565b6000818152600260205260409020546001600160a01b0316610e555760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161059c565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e8d82610b54565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610ed283610b54565b9050806001600160a01b0316846001600160a01b03161480610f1957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610f3d5750836001600160a01b0316610f3284610501565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f5882610b54565b6001600160a01b031614610f7e5760405162461bcd60e51b815260040161059c90612004565b6001600160a01b038216610fe05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161059c565b610fed83838360016115dc565b826001600160a01b031661100082610b54565b6001600160a01b0316146110265760405162461bcd60e51b815260040161059c90612004565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610e558133611664565b6110ca8282610c3a565b6107125760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556111023390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111508282610c3a565b156107125760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b0382166112035760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161059c565b6000818152600260205260409020546001600160a01b0316156112685760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161059c565b6112766000838360016115dc565b6000818152600260205260409020546001600160a01b0316156112db5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161059c565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061135182610b54565b90506113618160008460016115dc565b61136a82610b54565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b03160361144a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161059c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114c2848484610f45565b6114ce848484846116bd565b610d3f5760405162461bcd60e51b815260040161059c90612049565b6060600a805461047e90611de8565b60606000611506836117be565b600101905060008167ffffffffffffffff81111561152657611526611c16565b6040519080825280601f01601f191660200182016040528015611550576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461155a57509392505050565b60006001600160e01b031982166380ac58cd60e01b14806115bd57506001600160e01b03198216635b5e139f60e01b145b8061046957506301ffc9a760e01b6001600160e01b0319831614610469565b6001811115610d3f576001600160a01b03841615611622576001600160a01b0384166000908152600360205260408120805483929061161c90849061209b565b90915550505b6001600160a01b03831615610d3f576001600160a01b03831660009081526003602052604081208054839290611659908490611e85565b909155505050505050565b61166e8282610c3a565b6107125761167b81611896565b6116868360206118a8565b6040516020016116979291906120ae565b60408051601f198184030181529082905262461bcd60e51b825261059c91600401611ac7565b60006001600160a01b0384163b156117b357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611701903390899088908890600401612123565b6020604051808303816000875af192505050801561173c575060408051601f3d908101601f1916820190925261173991810190612160565b60015b611799573d80801561176a576040519150601f19603f3d011682016040523d82523d6000602084013e61176f565b606091505b5080516000036117915760405162461bcd60e51b815260040161059c90612049565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f3d565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106117fd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611829576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061184757662386f26fc10000830492506010015b6305f5e100831061185f576305f5e100830492506008015b612710831061187357612710830492506004015b60648310611885576064830492506002015b600a83106104695760010192915050565b60606104696001600160a01b03831660145b606060006118b783600261217d565b6118c2906002611e85565b67ffffffffffffffff8111156118da576118da611c16565b6040519080825280601f01601f191660200182016040528015611904576020820181803683370190505b509050600360fc1b8160008151811061191f5761191f611e98565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061194e5761194e611e98565b60200101906001600160f81b031916908160001a905350600061197284600261217d565b61197d906001611e85565b90505b60018111156119f5576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119b1576119b1611e98565b1a60f81b8282815181106119c7576119c7611e98565b60200101906001600160f81b031916908160001a90535060049490941c936119ee81612194565b9050611980565b508315610da55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161059c565b6001600160e01b031981168114610e5557600080fd5b600060208284031215611a6c57600080fd5b8135610da581611a44565b60005b83811015611a92578181015183820152602001611a7a565b50506000910152565b60008151808452611ab3816020860160208601611a77565b601f01601f19169290920160200192915050565b602081526000610da56020830184611a9b565b600060208284031215611aec57600080fd5b5035919050565b80356001600160a01b0381168114611b0a57600080fd5b919050565b60008060408385031215611b2257600080fd5b611b2b83611af3565b946020939093013593505050565b600080600060608486031215611b4e57600080fd5b611b5784611af3565b9250611b6560208501611af3565b9150604084013590509250925092565b60008060408385031215611b8857600080fd5b82359150611b9860208401611af3565b90509250929050565b60008060208385031215611bb457600080fd5b823567ffffffffffffffff80821115611bcc57600080fd5b818501915085601f830112611be057600080fd5b813581811115611bef57600080fd5b8660208260051b8501011115611c0457600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611c4757611c47611c16565b604051601f8501601f19908116603f01168101908282118183101715611c6f57611c6f611c16565b81604052809350858152868686011115611c8857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611cb457600080fd5b813567ffffffffffffffff811115611ccb57600080fd5b8201601f81018413611cdc57600080fd5b610f3d84823560208401611c2c565b600060208284031215611cfd57600080fd5b610da582611af3565b60008060408385031215611d1957600080fd5b611d2283611af3565b915060208301358015158114611d3757600080fd5b809150509250929050565b60008060008060808587031215611d5857600080fd5b611d6185611af3565b9350611d6f60208601611af3565b925060408501359150606085013567ffffffffffffffff811115611d9257600080fd5b8501601f81018713611da357600080fd5b611db287823560208401611c2c565b91505092959194509250565b60008060408385031215611dd157600080fd5b611dda83611af3565b9150611b9860208401611af3565b600181811c90821680611dfc57607f821691505b602082108103611e1c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561046957610469611e6f565b634e487b7160e01b600052603260045260246000fd5b600060018201611ec057611ec0611e6f565b5060010190565b601f82111561063d57600081815260208120601f850160051c81016020861015611eee5750805b601f850160051c820191505b81811015611f0d57828155600101611efa565b505050505050565b815167ffffffffffffffff811115611f2f57611f2f611c16565b611f4381611f3d8454611de8565b84611ec7565b602080601f831160018114611f785760008415611f605750858301515b600019600386901b1c1916600185901b178555611f0d565b600085815260208120601f198616915b82811015611fa757888601518255948401946001909101908401611f88565b5085821015611fc55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008351611fe7818460208801611a77565b835190830190611ffb818360208801611a77565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b8181038181111561046957610469611e6f565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516120e6816017850160208801611a77565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612117816028840160208801611a77565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061215690830184611a9b565b9695505050505050565b60006020828403121561217257600080fd5b8151610da581611a44565b808202811582820484141761046957610469611e6f565b6000816121a3576121a3611e6f565b50600019019056fe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6a264697066735822122027689b65dc898158b0edee39dd1e17d3f6a92db6339fab5c28b04960bef1fd2c64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000f534c432d7061636b616765644e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000541704e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f6c61756e636861737365742e636f7265736b792e636f6d2f70672f736c632f00000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): SLC-packagedNFT
Arg [1] : _symbol (string): ApNFT
Arg [2] : _baseUri (string): https://launchasset.coresky.com/pg/slc/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [4] : 534c432d7061636b616765644e46540000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 41704e4654000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [8] : 68747470733a2f2f6c61756e636861737365742e636f7265736b792e636f6d2f
Arg [9] : 70672f736c632f00000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
324:3437:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3557:202;;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;3557:202:12;;;;;;;;2471:98:2;;;:::i;:::-;;;;;;;:::i;3935:167::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:13;;;1679:51;;1667:2;1652:18;3935:167:2;1533:203:13;3468:406:2;;;;;;:::i;:::-;;:::i;:::-;;4612:326;;;;;;:::i;:::-;;:::i;4378:129:0:-;;;;;;:::i;:::-;4452:7;4478:12;;;:6;:12;;;;;:22;;;;4378:129;;;;2842:25:13;;;2830:2;2815:18;4378:129:0;2696:177:13;447:62:12;;485:24;447:62;;4803:145:0;;;;;;:::i;:::-;;:::i;5912:214::-;;;;;;:::i;:::-;;:::i;2974:476:12:-;;;;;;:::i;:::-;;:::i;2180:305::-;;;;;;:::i;:::-;;:::i;1548:367::-;;;;;;:::i;:::-;;:::i;5004:179:2:-;;;;;;:::i;:::-;;:::i;3456:95:12:-;;;;;;:::i;:::-;;:::i;2491:477::-;;;;;;:::i;:::-;;:::i;1921:149::-;;;;;;:::i;:::-;;:::i;1088:25::-;;;;;;2190:219:2;;;;;;:::i;:::-;;:::i;1929:204::-;;;;;;:::i;:::-;;:::i;2895:145:0:-;;;;;;:::i;:::-;;:::i;2633:102:2:-;;;:::i;1154:21:12:-;;;:::i;2027:49:0:-;;2072:4;2027:49;;4169:153:2;;;;;;:::i;:::-;;:::i;5249:314::-;;;;;;:::i;:::-;;:::i;2801:276::-;;;;;;:::i;:::-;;:::i;379:62:12:-;;-1:-1:-1;;;;;;;;;;;379:62:12;;5228:147:0;;;;;;:::i;:::-;;:::i;4388:162:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4508:25:2;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4388:162;3557:202:12;3689:4;3716:36;3740:11;3716:23;:36::i;:::-;3709:43;3557:202;-1:-1:-1;;3557:202:12:o;2471:98:2:-;2525:13;2557:5;2550:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2471:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;-1:-1:-1;4071:24:2;;;;:15;:24;;;;;;-1:-1:-1;;;;;4071:24:2;;3935:167::o;3468:406::-;3548:13;3564:23;3579:7;3564:14;:23::i;:::-;3548:39;;3611:5;-1:-1:-1;;;;;3605:11:2;:2;-1:-1:-1;;;;;3605:11:2;;3597:57;;;;-1:-1:-1;;;3597:57:2;;7231:2:13;3597:57:2;;;7213:21:13;7270:2;7250:18;;;7243:30;7309:34;7289:18;;;7282:62;-1:-1:-1;;;7360:18:13;;;7353:31;7401:19;;3597:57:2;;;;;;;;;719:10:7;-1:-1:-1;;;;;3686:21:2;;;;:62;;-1:-1:-1;3711:37:2;3728:5;719:10:7;4388:162:2;:::i;3711:37::-;3665:170;;;;-1:-1:-1;;;3665:170:2;;7633:2:13;3665:170:2;;;7615:21:13;7672:2;7652:18;;;7645:30;7711:34;7691:18;;;7684:62;7782:31;7762:18;;;7755:59;7831:19;;3665:170:2;7431:425:13;3665:170:2;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3538:336;3468:406;;:::o;4612:326::-;4801:41;719:10:7;4834:7:2;4801:18;:41::i;:::-;4793:99;;;;-1:-1:-1;;;4793:99:2;;;;;;;:::i;:::-;4903:28;4913:4;4919:2;4923:7;4903:9;:28::i;4803:145:0:-;4452:7;4478:12;;;:6;:12;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;4916:25:::1;4927:4;4933:7;4916:10;:25::i;5912:214::-:0;-1:-1:-1;;;;;6007:23:0;;719:10:7;6007:23:0;5999:83;;;;-1:-1:-1;;;5999:83:0;;8477:2:13;5999:83:0;;;8459:21:13;8516:2;8496:18;;;8489:30;8555:34;8535:18;;;8528:62;-1:-1:-1;;;8606:18:13;;;8599:45;8661:19;;5999:83:0;8275:411:13;5999:83:0;6093:26;6105:4;6111:7;6093:11;:26::i;:::-;5912:214;;:::o;2974:476:12:-;-1:-1:-1;;;;;;;;;;;2505:16:0;2516:4;2505:10;:16::i;:::-;3092:15:12;3084:65:::1;;;::::0;-1:-1:-1;;;3084:65:12;;8893:2:13;3084:65:12::1;::::0;::::1;8875:21:13::0;8932:2;8912:18;;;8905:30;8971:34;8951:18;;;8944:62;-1:-1:-1;;;9022:18:13;;;9015:35;9067:19;;3084:65:12::1;8691:401:13::0;3084:65:12::1;921:4;3180:38:::0;::::1;;3159:108;;;::::0;-1:-1:-1;;;3159:108:12;;9299:2:13;3159:108:12::1;::::0;::::1;9281:21:13::0;9338:2;9318:18;;;9311:30;-1:-1:-1;;;9357:18:13;;;9350:53;9420:18;;3159:108:12::1;9097:347:13::0;3159:108:12::1;3282:9;3277:134;3297:15:::0;;::::1;3277:134;;;3346:10;::::0;:14:::1;::::0;3359:1:::1;3346:14;:::i;:::-;3333:10;:27:::0;3374:26:::1;3380:4:::0;;3385:1;3380:7;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3389:10;;3374:5;:26::i;:::-;3314:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3277:134;;;-1:-1:-1::0;;3420:16:12::1;:23:::0;;-1:-1:-1;;3420:23:12::1;3439:4;3420:23;::::0;;-1:-1:-1;;2974:476:12:o;2180:305::-;-1:-1:-1;;;;;;;;;;;2505:16:0;2516:4;2505:10;:16::i;:::-;-1:-1:-1;;;;;2294:17:12;::::1;2286:48;;;::::0;-1:-1:-1;;;2286:48:12;;10185:2:13;2286:48:12::1;::::0;::::1;10167:21:13::0;10224:2;10204:18;;;10197:30;-1:-1:-1;;;10243:18:13;;;10236:48;10301:18;;2286:48:12::1;9983:342:13::0;2286:48:12::1;2364:21;;2352:8;:33;;2344:71;;;::::0;-1:-1:-1;;;2344:71:12;;10532:2:13;2344:71:12::1;::::0;::::1;10514:21:13::0;10571:2;10551:18;;;10544:30;10610:27;10590:18;;;10583:55;10655:18;;2344:71:12::1;10330:349:13::0;2344:71:12::1;2425:20;2431:3;2436:8;2425:5;:20::i;:::-;-1:-1:-1::0;;2455:16:12::1;:23:::0;;-1:-1:-1;;2455:23:12::1;2474:4;2455:23;::::0;;-1:-1:-1;2180:305:12:o;1548:367::-;2072:4:0;2505:16;2072:4;2505:10;:16::i;:::-;1690::12::1;::::0;::::1;;1689:17;1668:127;;;::::0;-1:-1:-1;;;1668:127:12;;10886:2:13;1668:127:12::1;::::0;::::1;10868:21:13::0;10925:2;10905:18;;;10898:30;10964:34;10944:18;;;10937:62;11035:33;11015:18;;;11008:61;11086:19;;1668:127:12::1;10684:427:13::0;1668:127:12::1;-1:-1:-1::0;1805:21:12::1;:35:::0;;;1850:10:::1;:25:::0;1885:16:::1;:23:::0;;-1:-1:-1;;1885:23:12::1;1904:4;1885:23;::::0;;1548:367::o;5004:179:2:-;5137:39;5154:4;5160:2;5164:7;5137:39;;;;;;;;;;;;:16;:39::i;3456:95:12:-;485:24;2505:16:0;2516:4;2505:10;:16::i;:::-;3529:15:12::1;3535:8;3529:5;:15::i;2491:477::-:0;-1:-1:-1;;;;;;;;;;;2505:16:0;2516:4;2505:10;:16::i;:::-;-1:-1:-1;;;;;2609:17:12;::::1;2601:48;;;::::0;-1:-1:-1;;;2601:48:12;;10185:2:13;2601:48:12::1;::::0;::::1;10167:21:13::0;10224:2;10204:18;;;10197:30;-1:-1:-1;;;10243:18:13;;;10236:48;10301:18;;2601:48:12::1;9983:342:13::0;2601:48:12::1;2677:1;2667:7;:11;2659:54;;;::::0;-1:-1:-1;;;2659:54:12;;11318:2:13;2659:54:12::1;::::0;::::1;11300:21:13::0;11357:2;11337:18;;;11330:30;11396:32;11376:18;;;11369:60;11446:18;;2659:54:12::1;11116:354:13::0;2659:54:12::1;921:4;2731:7;:34;;2723:70;;;::::0;-1:-1:-1;;;2723:70:12;;9299:2:13;2723:70:12::1;::::0;::::1;9281:21:13::0;9338:2;9318:18;;;9311:30;-1:-1:-1;;;9357:18:13;;;9350:53;9420:18;;2723:70:12::1;9097:347:13::0;2723:70:12::1;2808:9;2803:126;2827:7;2823:1;:11;2803:126;;;2868:10;::::0;:14:::1;::::0;2881:1:::1;2868:14;:::i;:::-;2855:10;:27:::0;;;2896:22:::1;::::0;2902:3;;2896:5:::1;:22::i;:::-;2836:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2803:126;;1921:149:::0;2072:4:0;2505:16;2072:4;2505:10;:16::i;:::-;2039:7:12::1;:24;2049:14:::0;2039:7;:24:::1;:::i;2190:219:2:-:0;2262:7;6930:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6930:16:2;;2324:56;;;;-1:-1:-1;;;2324:56:2;;13881:2:13;2324:56:2;;;13863:21:13;13920:2;13900:18;;;13893:30;-1:-1:-1;;;13939:18:13;;;13932:54;14003:18;;2324:56:2;13679:348:13;1929:204:2;2001:7;-1:-1:-1;;;;;2028:19:2;;2020:73;;;;-1:-1:-1;;;2020:73:2;;14234:2:13;2020:73:2;;;14216:21:13;14273:2;14253:18;;;14246:30;14312:34;14292:18;;;14285:62;-1:-1:-1;;;14363:18:13;;;14356:39;14412:19;;2020:73:2;14032:405:13;2020:73:2;-1:-1:-1;;;;;;2110:16:2;;;;;:9;:16;;;;;;;1929:204::o;2895:145:0:-;2981:4;3004:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;3004:29:0;;;;;;;;;;;;;;;2895:145::o;2633:102:2:-;2689:13;2721:7;2714:14;;;;;:::i;1154:21:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4169:153:2:-;4263:52;719:10:7;4296:8:2;4306;4263:18;:52::i;5249:314::-;5417:41;719:10:7;5450:7:2;5417:18;:41::i;:::-;5409:99;;;;-1:-1:-1;;;5409:99:2;;;;;;;:::i;:::-;5518:38;5532:4;5538:2;5542:7;5551:4;5518:13;:38::i;:::-;5249:314;;;;:::o;2801:276::-;2874:13;2899:23;2914:7;2899:14;:23::i;:::-;2933:21;2957:10;:8;:10::i;:::-;2933:34;;3008:1;2990:7;2984:21;:25;:86;;;;;;;;;;;;;;;;;3036:7;3045:18;:7;:16;:18::i;:::-;3019:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2984:86;2977:93;2801:276;-1:-1:-1;;;2801:276:2:o;5228:147:0:-;4452:7;4478:12;;;:6;:12;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;5342:26:::1;5354:4;5360:7;5342:11;:26::i;2606:202::-:0;2691:4;-1:-1:-1;;;;;;2714:47:0;;-1:-1:-1;;;2714:47:0;;:87;;;2765:36;2789:11;2765:23;:36::i;13466:133:2:-;7321:4;6930:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6930:16:2;13539:53;;;;-1:-1:-1;;;13539:53:2;;13881:2:13;13539:53:2;;;13863:21:13;13920:2;13900:18;;;13893:30;-1:-1:-1;;;13939:18:13;;;13932:54;14003:18;;13539:53:2;13679:348:13;13539:53:2;13466:133;:::o;12768:171::-;12842:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12842:29:2;-1:-1:-1;;;;;12842:29:2;;;;;;;;:24;;12895:23;12842:24;12895:14;:23::i;:::-;-1:-1:-1;;;;;12886:46:2;;;;;;;;;;;12768:171;;:::o;7540:261::-;7633:4;7649:13;7665:23;7680:7;7665:14;:23::i;:::-;7649:39;;7717:5;-1:-1:-1;;;;;7706:16:2;:7;-1:-1:-1;;;;;7706:16:2;;:52;;;-1:-1:-1;;;;;;4508:25:2;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7726:32;7706:87;;;;7786:7;-1:-1:-1;;;;;7762:31:2;:20;7774:7;7762:11;:20::i;:::-;-1:-1:-1;;;;;7762:31:2;;7706:87;7698:96;7540:261;-1:-1:-1;;;;7540:261:2:o;11423:1233::-;11577:4;-1:-1:-1;;;;;11550:31:2;:23;11565:7;11550:14;:23::i;:::-;-1:-1:-1;;;;;11550:31:2;;11542:81;;;;-1:-1:-1;;;11542:81:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;11641:16:2;;11633:65;;;;-1:-1:-1;;;11633:65:2;;15551:2:13;11633:65:2;;;15533:21:13;15590:2;15570:18;;;15563:30;15629:34;15609:18;;;15602:62;-1:-1:-1;;;15680:18:13;;;15673:34;15724:19;;11633:65:2;15349:400:13;11633:65:2;11709:42;11730:4;11736:2;11740:7;11749:1;11709:20;:42::i;:::-;11878:4;-1:-1:-1;;;;;11851:31:2;:23;11866:7;11851:14;:23::i;:::-;-1:-1:-1;;;;;11851:31:2;;11843:81;;;;-1:-1:-1;;;11843:81:2;;;;;;;:::i;:::-;11993:24;;;;:15;:24;;;;;;;;11986:31;;-1:-1:-1;;;;;;11986:31:2;;;;;;-1:-1:-1;;;;;12461:15:2;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;12461:20:2;;;12495:13;;;;;;;;;:18;;11986:31;12495:18;;;12533:16;;;:7;:16;;;;;;:21;;;;;;;;;;12570:27;;12009:7;;12570:27;;;3538:336;3468:406;;:::o;3334:103:0:-;3400:30;3411:4;719:10:7;3400::0;:30::i;7461:233::-;7544:22;7552:4;7558:7;7544;:22::i;:::-;7539:149;;7582:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;7582:29:0;;;;;;;;;:36;;-1:-1:-1;;7582:36:0;7614:4;7582:36;;;7664:12;719:10:7;;640:96;7664:12:0;-1:-1:-1;;;;;7637:40:0;7655:7;-1:-1:-1;;;;;7637:40:0;7649:4;7637:40;;;;;;;;;;7461:233;;:::o;7865:234::-;7948:22;7956:4;7962:7;7948;:22::i;:::-;7944:149;;;8018:5;7986:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;7986:29:0;;;;;;;;;;:37;;-1:-1:-1;;7986:37:0;;;8042:40;719:10:7;;7986:12:0;;8042:40;;8018:5;8042:40;7865:234;;:::o;9091:920:2:-;-1:-1:-1;;;;;9170:16:2;;9162:61;;;;-1:-1:-1;;;9162:61:2;;15956:2:13;9162:61:2;;;15938:21:13;;;15975:18;;;15968:30;16034:34;16014:18;;;16007:62;16086:18;;9162:61:2;15754:356:13;9162:61:2;7321:4;6930:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6930:16:2;7344:31;9233:58;;;;-1:-1:-1;;;9233:58:2;;16317:2:13;9233:58:2;;;16299:21:13;16356:2;16336:18;;;16329:30;16395;16375:18;;;16368:58;16443:18;;9233:58:2;16115:352:13;9233:58:2;9302:48;9331:1;9335:2;9339:7;9348:1;9302:20;:48::i;:::-;7321:4;6930:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6930:16:2;7344:31;9437:58;;;;-1:-1:-1;;;9437:58:2;;16317:2:13;9437:58:2;;;16299:21:13;16356:2;16336:18;;;16329:30;16395;16375:18;;;16368:58;16443:18;;9437:58:2;16115:352:13;9437:58:2;-1:-1:-1;;;;;9837:13:2;;;;;;:9;:13;;;;;;;;:18;;9854:1;9837:18;;;9876:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9876:21:2;;;;;9913:33;9884:7;;9837:13;;9913:33;;9837:13;;9913:33;5912:214:0;;:::o;10337:762:2:-;10396:13;10412:23;10427:7;10412:14;:23::i;:::-;10396:39;;10446:51;10467:5;10482:1;10486:7;10495:1;10446:20;:51::i;:::-;10607:23;10622:7;10607:14;:23::i;:::-;10675:24;;;;:15;:24;;;;;;;;10668:31;;-1:-1:-1;;;;;;10668:31:2;;;;;;-1:-1:-1;;;;;10915:16:2;;;;;:9;:16;;;;;:21;;-1:-1:-1;;10915:21:2;;;10963:16;;;:7;:16;;;;;;10956:23;;;;;;;10995:36;10599:31;;-1:-1:-1;10691:7:2;;10995:36;;10675:24;;10995:36;5912:214:0;;:::o;13075:307:2:-;13225:8;-1:-1:-1;;;;;13216:17:2;:5;-1:-1:-1;;;;;13216:17:2;;13208:55;;;;-1:-1:-1;;;13208:55:2;;16674:2:13;13208:55:2;;;16656:21:13;16713:2;16693:18;;;16686:30;16752:27;16732:18;;;16725:55;16797:18;;13208:55:2;16472:349:13;13208:55:2;-1:-1:-1;;;;;13273:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13273:46:2;;;;;;;;;;13334:41;;540::13;;;13334::2;;513:18:13;13334:41:2;;;;;;;13075:307;;;:::o;6424:305::-;6574:28;6584:4;6590:2;6594:7;6574:9;:28::i;:::-;6620:47;6643:4;6649:2;6653:7;6662:4;6620:22;:47::i;:::-;6612:110;;;;-1:-1:-1;;;6612:110:2;;;;;;;:::i;2076:98:12:-;2128:13;2160:7;2153:14;;;;;:::i;415:696:8:-;471:13;520:14;537:17;548:5;537:10;:17::i;:::-;557:1;537:21;520:38;;572:20;606:6;595:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;595:18:8;-1:-1:-1;572:41:8;-1:-1:-1;733:28:8;;;749:2;733:28;788:280;-1:-1:-1;;819:5:8;-1:-1:-1;;;953:2:8;942:14;;937:30;819:5;924:44;1012:2;1003:11;;;-1:-1:-1;1032:21:8;788:280;1032:21;-1:-1:-1;1088:6:8;415:696;-1:-1:-1;;;415:696:8:o;1570:300:2:-;1672:4;-1:-1:-1;;;;;;1707:40:2;;-1:-1:-1;;;1707:40:2;;:104;;-1:-1:-1;;;;;;;1763:48:2;;-1:-1:-1;;;1763:48:2;1707:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:9;;;1827:36:2;829:155:9;15698:396:2;15882:1;15870:9;:13;15866:222;;;-1:-1:-1;;;;;15903:18:2;;;15899:85;;-1:-1:-1;;;;;15941:15:2;;;;;;:9;:15;;;;;:28;;15960:9;;15941:15;:28;;15960:9;;15941:28;:::i;:::-;;;;-1:-1:-1;;15899:85:2;-1:-1:-1;;;;;16001:16:2;;;15997:81;;-1:-1:-1;;;;;16037:13:2;;;;;;:9;:13;;;;;:26;;16054:9;;16037:13;:26;;16054:9;;16037:26;:::i;:::-;;;;-1:-1:-1;;15698:396:2;;;;:::o;3718:479:0:-;3806:22;3814:4;3820:7;3806;:22::i;:::-;3801:390;;3989:28;4009:7;3989:19;:28::i;:::-;4088:38;4116:4;4123:2;4088:19;:38::i;:::-;3896:252;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3896:252:0;;;;;;;;;;-1:-1:-1;;;3844:336:0;;;;;;;:::i;14151:831:2:-;14300:4;-1:-1:-1;;;;;14320:13:2;;1465:19:6;:23;14316:660:2;;14355:71;;-1:-1:-1;;;14355:71:2;;-1:-1:-1;;;;;14355:36:2;;;;;:71;;719:10:7;;14406:4:2;;14412:7;;14421:4;;14355:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14355:71:2;;;;;;;;-1:-1:-1;;14355:71:2;;;;;;;;;;;;:::i;:::-;;;14351:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14593:6;:13;14610:1;14593:18;14589:321;;14635:60;;-1:-1:-1;;;14635:60:2;;;;;;;:::i;14589:321::-;14862:6;14856:13;14847:6;14843:2;14839:15;14832:38;14351:573;-1:-1:-1;;;;;;14476:51:2;-1:-1:-1;;;14476:51:2;;-1:-1:-1;14469:58:2;;14316:660;-1:-1:-1;14961:4:2;14151:831;;;;;;:::o;9895:890:11:-;9948:7;;-1:-1:-1;;;10023:15:11;;10019:99;;-1:-1:-1;;;10058:15:11;;;-1:-1:-1;10101:2:11;10091:12;10019:99;10144:6;10135:5;:15;10131:99;;10179:6;10170:15;;;-1:-1:-1;10213:2:11;10203:12;10131:99;10256:6;10247:5;:15;10243:99;;10291:6;10282:15;;;-1:-1:-1;10325:2:11;10315:12;10243:99;10368:5;10359;:14;10355:96;;10402:5;10393:14;;;-1:-1:-1;10435:1:11;10425:11;10355:96;10477:5;10468;:14;10464:96;;10511:5;10502:14;;;-1:-1:-1;10544:1:11;10534:11;10464:96;10586:5;10577;:14;10573:96;;10620:5;10611:14;;;-1:-1:-1;10653:1:11;10643:11;10573:96;10695:5;10686;:14;10682:64;;10730:1;10720:11;10772:6;9895:890;-1:-1:-1;;9895:890:11:o;2102:149:8:-;2160:13;2192:52;-1:-1:-1;;;;;2204:22:8;;311:2;1513:437;1588:13;1613:19;1645:10;1649:6;1645:1;:10;:::i;:::-;:14;;1658:1;1645:14;:::i;:::-;1635:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1635:25:8;;1613:47;;-1:-1:-1;;;1670:6:8;1677:1;1670:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1670:15:8;;;;;;;;;-1:-1:-1;;;1695:6:8;1702:1;1695:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1695:15:8;;;;;;;;-1:-1:-1;1725:9:8;1737:10;1741:6;1737:1;:10;:::i;:::-;:14;;1750:1;1737:14;:::i;:::-;1725:26;;1720:128;1757:1;1753;:5;1720:128;;;-1:-1:-1;;;1800:5:8;1808:3;1800:11;1791:21;;;;;;;:::i;:::-;;;;1779:6;1786:1;1779:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;1779:33:8;;;;;;;;-1:-1:-1;1836:1:8;1826:11;;;;;1760:3;;;:::i;:::-;;;1720:128;;;-1:-1:-1;1865:10:8;;1857:55;;;;-1:-1:-1;;;1857:55:8;;19591:2:13;1857:55:8;;;19573:21:13;;;19610:18;;;19603:30;19669:34;19649:18;;;19642:62;19721:18;;1857:55:8;19389:356:13;14:131;-1:-1:-1;;;;;;88:32:13;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:13;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:13;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:13:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:13;;1348:180;-1:-1:-1;1348:180:13:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:13;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:13:o;2178:328::-;2255:6;2263;2271;2324:2;2312:9;2303:7;2299:23;2295:32;2292:52;;;2340:1;2337;2330:12;2292:52;2363:29;2382:9;2363:29;:::i;:::-;2353:39;;2411:38;2445:2;2434:9;2430:18;2411:38;:::i;:::-;2401:48;;2496:2;2485:9;2481:18;2468:32;2458:42;;2178:328;;;;;:::o;2878:254::-;2946:6;2954;3007:2;2995:9;2986:7;2982:23;2978:32;2975:52;;;3023:1;3020;3013:12;2975:52;3059:9;3046:23;3036:33;;3088:38;3122:2;3111:9;3107:18;3088:38;:::i;:::-;3078:48;;2878:254;;;;;:::o;3137:615::-;3223:6;3231;3284:2;3272:9;3263:7;3259:23;3255:32;3252:52;;;3300:1;3297;3290:12;3252:52;3340:9;3327:23;3369:18;3410:2;3402:6;3399:14;3396:34;;;3426:1;3423;3416:12;3396:34;3464:6;3453:9;3449:22;3439:32;;3509:7;3502:4;3498:2;3494:13;3490:27;3480:55;;3531:1;3528;3521:12;3480:55;3571:2;3558:16;3597:2;3589:6;3586:14;3583:34;;;3613:1;3610;3603:12;3583:34;3666:7;3661:2;3651:6;3648:1;3644:14;3640:2;3636:23;3632:32;3629:45;3626:65;;;3687:1;3684;3677:12;3626:65;3718:2;3710:11;;;;;3740:6;;-1:-1:-1;3137:615:13;;-1:-1:-1;;;;3137:615:13:o;3757:127::-;3818:10;3813:3;3809:20;3806:1;3799:31;3849:4;3846:1;3839:15;3873:4;3870:1;3863:15;3889:632;3954:5;3984:18;4025:2;4017:6;4014:14;4011:40;;;4031:18;;:::i;:::-;4106:2;4100:9;4074:2;4160:15;;-1:-1:-1;;4156:24:13;;;4182:2;4152:33;4148:42;4136:55;;;4206:18;;;4226:22;;;4203:46;4200:72;;;4252:18;;:::i;:::-;4292:10;4288:2;4281:22;4321:6;4312:15;;4351:6;4343;4336:22;4391:3;4382:6;4377:3;4373:16;4370:25;4367:45;;;4408:1;4405;4398:12;4367:45;4458:6;4453:3;4446:4;4438:6;4434:17;4421:44;4513:1;4506:4;4497:6;4489;4485:19;4481:30;4474:41;;;;3889:632;;;;;:::o;4526:451::-;4595:6;4648:2;4636:9;4627:7;4623:23;4619:32;4616:52;;;4664:1;4661;4654:12;4616:52;4704:9;4691:23;4737:18;4729:6;4726:30;4723:50;;;4769:1;4766;4759:12;4723:50;4792:22;;4845:4;4837:13;;4833:27;-1:-1:-1;4823:55:13;;4874:1;4871;4864:12;4823:55;4897:74;4963:7;4958:2;4945:16;4940:2;4936;4932:11;4897:74;:::i;5164:186::-;5223:6;5276:2;5264:9;5255:7;5251:23;5247:32;5244:52;;;5292:1;5289;5282:12;5244:52;5315:29;5334:9;5315:29;:::i;5355:347::-;5420:6;5428;5481:2;5469:9;5460:7;5456:23;5452:32;5449:52;;;5497:1;5494;5487:12;5449:52;5520:29;5539:9;5520:29;:::i;:::-;5510:39;;5599:2;5588:9;5584:18;5571:32;5646:5;5639:13;5632:21;5625:5;5622:32;5612:60;;5668:1;5665;5658:12;5612:60;5691:5;5681:15;;;5355:347;;;;;:::o;5707:667::-;5802:6;5810;5818;5826;5879:3;5867:9;5858:7;5854:23;5850:33;5847:53;;;5896:1;5893;5886:12;5847:53;5919:29;5938:9;5919:29;:::i;:::-;5909:39;;5967:38;6001:2;5990:9;5986:18;5967:38;:::i;:::-;5957:48;;6052:2;6041:9;6037:18;6024:32;6014:42;;6107:2;6096:9;6092:18;6079:32;6134:18;6126:6;6123:30;6120:50;;;6166:1;6163;6156:12;6120:50;6189:22;;6242:4;6234:13;;6230:27;-1:-1:-1;6220:55:13;;6271:1;6268;6261:12;6220:55;6294:74;6360:7;6355:2;6342:16;6337:2;6333;6329:11;6294:74;:::i;:::-;6284:84;;;5707:667;;;;;;;:::o;6379:260::-;6447:6;6455;6508:2;6496:9;6487:7;6483:23;6479:32;6476:52;;;6524:1;6521;6514:12;6476:52;6547:29;6566:9;6547:29;:::i;:::-;6537:39;;6595:38;6629:2;6618:9;6614:18;6595:38;:::i;6644:380::-;6723:1;6719:12;;;;6766;;;6787:61;;6841:4;6833:6;6829:17;6819:27;;6787:61;6894:2;6886:6;6883:14;6863:18;6860:38;6857:161;;6940:10;6935:3;6931:20;6928:1;6921:31;6975:4;6972:1;6965:15;7003:4;7000:1;6993:15;6857:161;;6644:380;;;:::o;7861:409::-;8063:2;8045:21;;;8102:2;8082:18;;;8075:30;8141:34;8136:2;8121:18;;8114:62;-1:-1:-1;;;8207:2:13;8192:18;;8185:43;8260:3;8245:19;;7861:409::o;9449:127::-;9510:10;9505:3;9501:20;9498:1;9491:31;9541:4;9538:1;9531:15;9565:4;9562:1;9555:15;9581:125;9646:9;;;9667:10;;;9664:36;;;9680:18;;:::i;9711:127::-;9772:10;9767:3;9763:20;9760:1;9753:31;9803:4;9800:1;9793:15;9827:4;9824:1;9817:15;9843:135;9882:3;9903:17;;;9900:43;;9923:18;;:::i;:::-;-1:-1:-1;9970:1:13;9959:13;;9843:135::o;11601:545::-;11703:2;11698:3;11695:11;11692:448;;;11739:1;11764:5;11760:2;11753:17;11809:4;11805:2;11795:19;11879:2;11867:10;11863:19;11860:1;11856:27;11850:4;11846:38;11915:4;11903:10;11900:20;11897:47;;;-1:-1:-1;11938:4:13;11897:47;11993:2;11988:3;11984:12;11981:1;11977:20;11971:4;11967:31;11957:41;;12048:82;12066:2;12059:5;12056:13;12048:82;;;12111:17;;;12092:1;12081:13;12048:82;;;12052:3;;;11601:545;;;:::o;12322:1352::-;12448:3;12442:10;12475:18;12467:6;12464:30;12461:56;;;12497:18;;:::i;:::-;12526:97;12616:6;12576:38;12608:4;12602:11;12576:38;:::i;:::-;12570:4;12526:97;:::i;:::-;12678:4;;12742:2;12731:14;;12759:1;12754:663;;;;13461:1;13478:6;13475:89;;;-1:-1:-1;13530:19:13;;;13524:26;13475:89;-1:-1:-1;;12279:1:13;12275:11;;;12271:24;12267:29;12257:40;12303:1;12299:11;;;12254:57;13577:81;;12724:944;;12754:663;11548:1;11541:14;;;11585:4;11572:18;;-1:-1:-1;;12790:20:13;;;12908:236;12922:7;12919:1;12916:14;12908:236;;;13011:19;;;13005:26;12990:42;;13103:27;;;;13071:1;13059:14;;;;12938:19;;12908:236;;;12912:3;13172:6;13163:7;13160:19;13157:201;;;13233:19;;;13227:26;-1:-1:-1;;13316:1:13;13312:14;;;13328:3;13308:24;13304:37;13300:42;13285:58;13270:74;;13157:201;-1:-1:-1;;;;;13404:1:13;13388:14;;;13384:22;13371:36;;-1:-1:-1;12322:1352:13:o;14442:496::-;14621:3;14659:6;14653:13;14675:66;14734:6;14729:3;14722:4;14714:6;14710:17;14675:66;:::i;:::-;14804:13;;14763:16;;;;14826:70;14804:13;14763:16;14873:4;14861:17;;14826:70;:::i;:::-;14912:20;;14442:496;-1:-1:-1;;;;14442:496:13:o;14943:401::-;15145:2;15127:21;;;15184:2;15164:18;;;15157:30;15223:34;15218:2;15203:18;;15196:62;-1:-1:-1;;;15289:2:13;15274:18;;15267:35;15334:3;15319:19;;14943:401::o;16826:414::-;17028:2;17010:21;;;17067:2;17047:18;;;17040:30;17106:34;17101:2;17086:18;;17079:62;-1:-1:-1;;;17172:2:13;17157:18;;17150:48;17230:3;17215:19;;16826:414::o;17377:128::-;17444:9;;;17465:11;;;17462:37;;;17479:18;;:::i;17510:812::-;17921:25;17916:3;17909:38;17891:3;17976:6;17970:13;17992:75;18060:6;18055:2;18050:3;18046:12;18039:4;18031:6;18027:17;17992:75;:::i;:::-;-1:-1:-1;;;18126:2:13;18086:16;;;18118:11;;;18111:40;18176:13;;18198:76;18176:13;18260:2;18252:11;;18245:4;18233:17;;18198:76;:::i;:::-;18294:17;18313:2;18290:26;;17510:812;-1:-1:-1;;;;17510:812:13:o;18327:489::-;-1:-1:-1;;;;;18596:15:13;;;18578:34;;18648:15;;18643:2;18628:18;;18621:43;18695:2;18680:18;;18673:34;;;18743:3;18738:2;18723:18;;18716:31;;;18521:4;;18764:46;;18790:19;;18782:6;18764:46;:::i;:::-;18756:54;18327:489;-1:-1:-1;;;;;;18327:489:13:o;18821:249::-;18890:6;18943:2;18931:9;18922:7;18918:23;18914:32;18911:52;;;18959:1;18956;18949:12;18911:52;18991:9;18985:16;19010:30;19034:5;19010:30;:::i;19075:168::-;19148:9;;;19179;;19196:15;;;19190:22;;19176:37;19166:71;;19217:18;;:::i;19248:136::-;19287:3;19315:5;19305:39;;19324:18;;:::i;:::-;-1:-1:-1;;;19360:18:13;;19248:136::o
Swarm Source
ipfs://27689b65dc898158b0edee39dd1e17d3f6a92db6339fab5c28b04960bef1fd2c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in POL
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.