Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ScotchNFT
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-07-12
*/
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_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) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @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);
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// 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;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/scBeneficiary.sol
pragma solidity ^0.8.8;
abstract contract ScotchBeneficiary is Ownable {
// Beneficiary (commission recipient) Mode
enum BeneficiaryMode{
// 0: No Beneficiary Specified
None,
// 1: Beneficiary - simple the recipient address
Beneficiary,
// 2: Distributor - the service to distribute money
Distributor
}
// Beneficiary Model
struct Beneficiary {
BeneficiaryMode mode; // mode of the beneficiary send funds
address payable recipient; // beneficiary recipient address
}
// beneficiary - receiver of the funds - the address where the funds will be sent
Beneficiary internal _beneficiary;
// ===========================================
// ======= Secondary public functions ========
// ===========================================
// get current beneficiary info
function getBeneficiary() public view returns (Beneficiary memory) {
return _beneficiary;
}
// ===========================================
// =========== Owner's functions =============
// ===========================================
// change beneficiary of the Scotch Marketplace
function changeBeneficiary(BeneficiaryMode mode, address payable recipient) public virtual onlyOwner {
if (mode == BeneficiaryMode.None)
require(recipient == address(0), "Beneficiar mode None requires zero address for recipient!");
else
require(recipient != address(0), "Beneficiary recipient address should be specified!");
_beneficiary.mode = mode;
_beneficiary.recipient = recipient;
}
// send accumulated funds to recipient (native-token = zero tokenContract)
function sendFunds(uint256 amount, address tokenContract) public virtual onlyOwner {
require(_isBeneficiaryExists(), "Beneficiary should be specified!");
require(amount > 0, "Send Amount should be positive!");
// address of the current contract
address current = address(this);
if (tokenContract == address(0)) {
// get Scotch Marketplace balance in native token
uint256 balance = current.balance;
require(balance >= amount, "Send Amount exceeds Smart Contract's native token balance!");
// send native token amount to _beneficiar
_beneficiary.recipient.transfer(amount);
}
else {
// get ERC-20 Token Contract
ERC20 hostTokenContract = ERC20(tokenContract);
// get Scotch Marketplace balance in ERC-20 Token
uint256 balance = hostTokenContract.balanceOf(current);
require(balance >= amount, "Send Amount exceeds Smart Contract's ERC-20 token balance!");
// send ERC-20 token amount to recipient
hostTokenContract.transfer(_beneficiary.recipient, amount);
}
}
// ===========================================
// ======= Internal helper functions =========
// ===========================================
// check if beneficiary is specified to send funds
function _isBeneficiaryExists() internal view virtual returns (bool){
return _beneficiary.mode != BeneficiaryMode.None && _beneficiary.recipient != address(0);
}
// charge funds from caller in native tokens
function _chargeFunds(uint256 amount, string memory message) internal virtual {
if (amount > 0) {
// check payment for appropriate funds amount
require(msg.value >= amount, message);
// send funds to _beneficiary
if (_isBeneficiaryExists())
_beneficiary.recipient.transfer(msg.value);
}
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.7.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 functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// 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);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// 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);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* 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);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @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);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @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 = _owners[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 nor 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 nor 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 nor 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 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 _owners[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);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @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);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @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.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping(uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev See {ERC721-_burn}. This override additionally checks to see if a
* token-specific URI was set for the token, and if so, it deletes the token URI from
* the storage mapping.
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File: contracts/scNFT.sol
pragma solidity ^0.8.12;
contract ScotchNFT is ScotchBeneficiary, ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
// maximum amount of NFTs to mint
uint _maxNftToMint;
// price for minting NFT
uint256 _mintingPrice;
constructor() ERC721("Scotch NFT", "scNFT")
{
_maxNftToMint = 100;
_mintingPrice = 0;
}
// ===========================================
// ======= MAIN Scotch NFTS functions ========
// ===========================================
function createNFT(string memory tokenURI) public payable returns (uint256)
{
// charge minting-price
_chargeFunds(_mintingPrice, "Minting Price should be sent to mint NFT");
_tokenIds.increment();
uint256 id = _tokenIds.current();
_mint(msg.sender, id);
_setTokenURI(id, tokenURI);
return id;
}
function createNFTs(uint count, string memory baseURI) public payable
{
require(count <= _maxNftToMint, "Amount of NFTs exceeds Maximum Allowed Amount");
// charge minting-price
_chargeFunds(_mintingPrice * count, "Minting Price should be sent to mint NFT");
address sender = msg.sender;
for (uint i = 1; i <= count; i++)
{
_tokenIds.increment();
uint256 id = _tokenIds.current();
_mint(sender, id);
_setTokenURI(id, string.concat(baseURI, Strings.toString(i), ".json"));
}
}
// ===========================================
// ======= Secondary public functions ========
// ===========================================
// get minting-price
function getMintingPrice() public view returns (uint256) {
return _mintingPrice;
}
// ===========================================
// =========== Owner's functions =============
// ===========================================
// set maximum amount of nfts that could be minted
function setMaxNftToMint(uint maxNftToMint) public onlyOwner {
_maxNftToMint = maxNftToMint;
}
// set minting-price
function setMintingPrice(uint256 mintingPrice) public onlyOwner {
_mintingPrice = mintingPrice;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"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":[{"internalType":"enum ScotchBeneficiary.BeneficiaryMode","name":"mode","type":"uint8"},{"internalType":"address payable","name":"recipient","type":"address"}],"name":"changeBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"name":"createNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"createNFTs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBeneficiary","outputs":[{"components":[{"internalType":"enum ScotchBeneficiary.BeneficiaryMode","name":"mode","type":"uint8"},{"internalType":"address payable","name":"recipient","type":"address"}],"internalType":"struct ScotchBeneficiary.Beneficiary","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"}],"name":"sendFunds","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":"uint256","name":"maxNftToMint","type":"uint256"}],"name":"setMaxNftToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintingPrice","type":"uint256"}],"name":"setMintingPrice","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600a81526020016914d8dbdd18da0813919560b21b815250604051806040016040528060058152602001641cd8d3919560da1b8152506200006d620000676200009d60201b60201c565b620000a1565b60026200007b838262000196565b5060036200008a828262000196565b50506064600a55506000600b5562000262565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011c57607f821691505b6020821081036200013d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019157600081815260208120601f850160051c810160208610156200016c5750805b601f850160051c820191505b818110156200018d5782815560010162000178565b5050505b505050565b81516001600160401b03811115620001b257620001b2620000f1565b620001ca81620001c3845462000107565b8462000143565b602080601f831160018114620002025760008415620001e95750858301515b600019600386901b1c1916600185901b1785556200018d565b600085815260208120601f198616915b82811015620002335788860151825594840194600190910190840162000212565b5085821015620002525787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6121a380620002726000396000f3fe60806040526004361061014b5760003560e01c80638417b47f116100b6578063b75892c51161006f578063b75892c5146103ae578063b88d4fde146103c1578063c87b56dd146103e1578063da2ed03e14610401578063e985e9c514610414578063f2fde38b1461045d57600080fd5b80638417b47f146102fb5780638da5cb5b1461031b57806395d89b4114610339578063a22cb4651461034e578063a765eccd1461036e578063b26867741461038e57600080fd5b806343c062131161010857806343c0621314610241578063565a2e2c146102615780636352211e1461028357806370a08231146102a3578063715018a6146102d157806377d24762146102e657600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806323b872dd1461020157806342842e0e14610221575b600080fd5b34801561015c57600080fd5b5061017061016b36600461199b565b61047d565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a6104cf565b60405161017c9190611a10565b3480156101b357600080fd5b506101c76101c2366004611a23565b610561565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa366004611a51565b610588565b005b34801561020d57600080fd5b506101ff61021c366004611a7d565b6106a2565b34801561022d57600080fd5b506101ff61023c366004611a7d565b6106d3565b34801561024d57600080fd5b506101ff61025c366004611abe565b6106ee565b34801561026d57600080fd5b5061027661084e565b60405161017c9190611b11565b34801561028f57600080fd5b506101c761029e366004611a23565b6108b4565b3480156102af57600080fd5b506102c36102be366004611b52565b610914565b60405190815260200161017c565b3480156102dd57600080fd5b506101ff61099a565b3480156102f257600080fd5b50600b546102c3565b34801561030757600080fd5b506101ff610316366004611a23565b6109ae565b34801561032757600080fd5b506000546001600160a01b03166101c7565b34801561034557600080fd5b5061019a6109bb565b34801561035a57600080fd5b506101ff610369366004611b7d565b6109ca565b34801561037a57600080fd5b506101ff610389366004611a23565b6109d9565b34801561039a57600080fd5b506101ff6103a9366004611bab565b6109e6565b6101ff6103bc366004611c7c565b610cd2565b3480156103cd57600080fd5b506101ff6103dc366004611cc3565b610de5565b3480156103ed57600080fd5b5061019a6103fc366004611a23565b610e17565b6102c361040f366004611d43565b610f27565b34801561042057600080fd5b5061017061042f366004611d78565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561046957600080fd5b506101ff610478366004611b52565b610f7c565b60006001600160e01b031982166380ac58cd60e01b14806104ae57506001600160e01b03198216635b5e139f60e01b145b806104c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546104de90611d96565b80601f016020809104026020016040519081016040528092919081815260200182805461050a90611d96565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b5050505050905090565b600061056c82610ff5565b506000908152600660205260409020546001600160a01b031690565b6000610593826108b4565b9050806001600160a01b0316836001600160a01b0316036106055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806106215750610621813361042f565b6106935760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105fc565b61069d8383611054565b505050565b6106ac33826110c2565b6106c85760405162461bcd60e51b81526004016105fc90611dd0565b61069d838383611140565b61069d83838360405180602001604052806000815250610de5565b6106f66112dc565b600082600281111561070a5761070a611afb565b03610791576001600160a01b0381161561078c5760405162461bcd60e51b815260206004820152603960248201527f42656e65666963696172206d6f6465204e6f6e65207265717569726573207a6560448201527f726f206164647265737320666f7220726563697069656e74210000000000000060648201526084016105fc565b610802565b6001600160a01b0381166108025760405162461bcd60e51b815260206004820152603260248201527f42656e656669636961727920726563697069656e7420616464726573732073686044820152716f756c64206265207370656369666965642160701b60648201526084016105fc565b6001805483919060ff19168183600281111561082057610820611afb565b0217905550600180546001600160a01b0390921661010002610100600160a81b031990921691909117905550565b60408051808201909152600080825260208201526040805180820190915260018054829060ff16600281111561088657610886611afb565b600281111561089757610897611afb565b8152905461010090046001600160a01b0316602090910152919050565b6000818152600460205260408120546001600160a01b0316806104c95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105fc565b60006001600160a01b03821661097e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105fc565b506001600160a01b031660009081526005602052604090205490565b6109a26112dc565b6109ac6000611336565b565b6109b66112dc565b600b55565b6060600380546104de90611d96565b6109d5338383611386565b5050565b6109e16112dc565b600a55565b6109ee6112dc565b6109f6611454565b610a425760405162461bcd60e51b815260206004820181905260248201527f42656e65666963696172792073686f756c64206265207370656369666965642160448201526064016105fc565b60008211610a925760405162461bcd60e51b815260206004820152601f60248201527f53656e6420416d6f756e742073686f756c6420626520706f736974697665210060448201526064016105fc565b306001600160a01b038216610b67576001600160a01b0381163183811015610b225760405162461bcd60e51b815260206004820152603a60248201527f53656e6420416d6f756e74206578636565647320536d61727420436f6e74726160448201527f63742773206e617469766520746f6b656e2062616c616e63652100000000000060648201526084016105fc565b6001546040516101009091046001600160a01b0316906108fc8615029086906000818181858888f19350505050158015610b60573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81526001600160a01b03828116600483015283916000918316906370a0823190602401602060405180830381865afa158015610bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd69190611e1e565b905084811015610c4e5760405162461bcd60e51b815260206004820152603a60248201527f53656e6420416d6f756e74206578636565647320536d61727420436f6e74726160448201527f63742773204552432d323020746f6b656e2062616c616e63652100000000000060648201526084016105fc565b60015460405163a9059cbb60e01b81526101009091046001600160a01b0390811660048301526024820187905283169063a9059cbb906044016020604051808303816000875af1158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cca9190611e37565b505050505050565b600a54821115610d3a5760405162461bcd60e51b815260206004820152602d60248201527f416d6f756e74206f66204e4654732065786365656473204d6178696d756d204160448201526c1b1b1bddd95908105b5bdd5b9d609a1b60648201526084016105fc565b610d6982600b54610d4b9190611e6a565b60405180606001604052806028815260200161214660289139611490565b3360015b838111610ddf57610d82600980546001019055565b6000610d8d60095490565b9050610d998382611507565b610dcc8185610da785611649565b604051602001610db8929190611e89565b60405160208183030381529060405261174a565b5080610dd781611ec8565b915050610d6d565b50505050565b610def33836110c2565b610e0b5760405162461bcd60e51b81526004016105fc90611dd0565b610ddf848484846117dd565b6060610e2282610ff5565b60008281526008602052604081208054610e3b90611d96565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6790611d96565b8015610eb45780601f10610e8957610100808354040283529160200191610eb4565b820191906000526020600020905b815481529060010190602001808311610e9757829003601f168201915b505050505090506000610ed260408051602081019091526000815290565b90508051600003610ee4575092915050565b815115610f16578082604051602001610efe929190611ee1565b60405160208183030381529060405292505050919050565b610f1f84611810565b949350505050565b6000610f4d600b5460405180606001604052806028815260200161214660289139611490565b610f5b600980546001019055565b6000610f6660095490565b9050610f723382611507565b6104c9818461174a565b610f846112dc565b6001600160a01b038116610fe95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105fc565b610ff281611336565b50565b6000818152600460205260409020546001600160a01b0316610ff25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105fc565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611089826108b4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110ce836108b4565b9050806001600160a01b0316846001600160a01b0316148061111557506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80610f1f5750836001600160a01b031661112e84610561565b6001600160a01b031614949350505050565b826001600160a01b0316611153826108b4565b6001600160a01b0316146111b75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105fc565b6001600160a01b0382166112195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105fc565b611224600082611054565b6001600160a01b038316600090815260056020526040812080546001929061124d908490611f10565b90915550506001600160a01b038216600090815260056020526040812080546001929061127b908490611f27565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146109ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316036113e75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105fc565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008060015460ff16600281111561146e5761146e611afb565b1415801561148b575060015461010090046001600160a01b031615155b905090565b81156109d5578134101581906114b95760405162461bcd60e51b81526004016105fc9190611a10565b506114c2611454565b156109d5576001546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f1935050505015801561069d573d6000803e3d6000fd5b6001600160a01b03821661155d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fc565b6000818152600460205260409020546001600160a01b0316156115c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105fc565b6001600160a01b03821660009081526005602052604081208054600192906115eb908490611f27565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816000036116705750506040805180820190915260018152600360fc1b602082015290565b8160005b811561169a578061168481611ec8565b91506116939050600a83611f55565b9150611674565b60008167ffffffffffffffff8111156116b5576116b5611bd0565b6040519080825280601f01601f1916602001820160405280156116df576020820181803683370190505b5090505b8415610f1f576116f4600183611f10565b9150611701600a86611f69565b61170c906030611f27565b60f81b81838151811061172157611721611f7d565b60200101906001600160f81b031916908160001a905350611743600a86611f55565b94506116e3565b6000828152600460205260409020546001600160a01b03166117c55760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016105fc565b600082815260086020526040902061069d8282611fd9565b6117e8848484611140565b6117f484848484611884565b610ddf5760405162461bcd60e51b81526004016105fc90612099565b606061181b82610ff5565b600061183260408051602081019091526000815290565b90506000815111611852576040518060200160405280600081525061187d565b8061185c84611649565b60405160200161186d929190611ee1565b6040516020818303038152906040525b9392505050565b60006001600160a01b0384163b1561197a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118c89033908990889088906004016120eb565b6020604051808303816000875af1925050508015611903575060408051601f3d908101601f1916820190925261190091810190612128565b60015b611960573d808015611931576040519150601f19603f3d011682016040523d82523d6000602084013e611936565b606091505b5080516000036119585760405162461bcd60e51b81526004016105fc90612099565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f1f565b506001949350505050565b6001600160e01b031981168114610ff257600080fd5b6000602082840312156119ad57600080fd5b813561187d81611985565b60005b838110156119d35781810151838201526020016119bb565b83811115610ddf5750506000910152565b600081518084526119fc8160208601602086016119b8565b601f01601f19169290920160200192915050565b60208152600061187d60208301846119e4565b600060208284031215611a3557600080fd5b5035919050565b6001600160a01b0381168114610ff257600080fd5b60008060408385031215611a6457600080fd5b8235611a6f81611a3c565b946020939093013593505050565b600080600060608486031215611a9257600080fd5b8335611a9d81611a3c565b92506020840135611aad81611a3c565b929592945050506040919091013590565b60008060408385031215611ad157600080fd5b823560038110611ae057600080fd5b91506020830135611af081611a3c565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b8151604082019060038110611b3657634e487b7160e01b600052602160045260246000fd5b82526020928301516001600160a01b0316929091019190915290565b600060208284031215611b6457600080fd5b813561187d81611a3c565b8015158114610ff257600080fd5b60008060408385031215611b9057600080fd5b8235611b9b81611a3c565b91506020830135611af081611b6f565b60008060408385031215611bbe57600080fd5b823591506020830135611af081611a3c565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611c0157611c01611bd0565b604051601f8501601f19908116603f01168101908282118183101715611c2957611c29611bd0565b81604052809350858152868686011115611c4257600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611c6d57600080fd5b61187d83833560208501611be6565b60008060408385031215611c8f57600080fd5b82359150602083013567ffffffffffffffff811115611cad57600080fd5b611cb985828601611c5c565b9150509250929050565b60008060008060808587031215611cd957600080fd5b8435611ce481611a3c565b93506020850135611cf481611a3c565b925060408501359150606085013567ffffffffffffffff811115611d1757600080fd5b8501601f81018713611d2857600080fd5b611d3787823560208401611be6565b91505092959194509250565b600060208284031215611d5557600080fd5b813567ffffffffffffffff811115611d6c57600080fd5b610f1f84828501611c5c565b60008060408385031215611d8b57600080fd5b8235611ae081611a3c565b600181811c90821680611daa57607f821691505b602082108103611dca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600060208284031215611e3057600080fd5b5051919050565b600060208284031215611e4957600080fd5b815161187d81611b6f565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611e8457611e84611e54565b500290565b60008351611e9b8184602088016119b8565b835190830190611eaf8183602088016119b8565b64173539b7b760d91b9101908152600501949350505050565b600060018201611eda57611eda611e54565b5060010190565b60008351611ef38184602088016119b8565b835190830190611f078183602088016119b8565b01949350505050565b600082821015611f2257611f22611e54565b500390565b60008219821115611f3a57611f3a611e54565b500190565b634e487b7160e01b600052601260045260246000fd5b600082611f6457611f64611f3f565b500490565b600082611f7857611f78611f3f565b500690565b634e487b7160e01b600052603260045260246000fd5b601f82111561069d57600081815260208120601f850160051c81016020861015611fba5750805b601f850160051c820191505b81811015610cca57828155600101611fc6565b815167ffffffffffffffff811115611ff357611ff3611bd0565b612007816120018454611d96565b84611f93565b602080601f83116001811461203c57600084156120245750858301515b600019600386901b1c1916600185901b178555610cca565b600085815260208120601f198616915b8281101561206b5788860151825594840194600190910190840161204c565b50858210156120895787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061211e908301846119e4565b9695505050505050565b60006020828403121561213a57600080fd5b815161187d8161198556fe4d696e74696e672050726963652073686f756c642062652073656e7420746f206d696e74204e4654a2646970667358221220102cd03db25bd730ea0fe16be968e9851cde6b4971934bdae0942247a4ebc02264736f6c634300080f0033
Deployed Bytecode
0x60806040526004361061014b5760003560e01c80638417b47f116100b6578063b75892c51161006f578063b75892c5146103ae578063b88d4fde146103c1578063c87b56dd146103e1578063da2ed03e14610401578063e985e9c514610414578063f2fde38b1461045d57600080fd5b80638417b47f146102fb5780638da5cb5b1461031b57806395d89b4114610339578063a22cb4651461034e578063a765eccd1461036e578063b26867741461038e57600080fd5b806343c062131161010857806343c0621314610241578063565a2e2c146102615780636352211e1461028357806370a08231146102a3578063715018a6146102d157806377d24762146102e657600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806323b872dd1461020157806342842e0e14610221575b600080fd5b34801561015c57600080fd5b5061017061016b36600461199b565b61047d565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a6104cf565b60405161017c9190611a10565b3480156101b357600080fd5b506101c76101c2366004611a23565b610561565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa366004611a51565b610588565b005b34801561020d57600080fd5b506101ff61021c366004611a7d565b6106a2565b34801561022d57600080fd5b506101ff61023c366004611a7d565b6106d3565b34801561024d57600080fd5b506101ff61025c366004611abe565b6106ee565b34801561026d57600080fd5b5061027661084e565b60405161017c9190611b11565b34801561028f57600080fd5b506101c761029e366004611a23565b6108b4565b3480156102af57600080fd5b506102c36102be366004611b52565b610914565b60405190815260200161017c565b3480156102dd57600080fd5b506101ff61099a565b3480156102f257600080fd5b50600b546102c3565b34801561030757600080fd5b506101ff610316366004611a23565b6109ae565b34801561032757600080fd5b506000546001600160a01b03166101c7565b34801561034557600080fd5b5061019a6109bb565b34801561035a57600080fd5b506101ff610369366004611b7d565b6109ca565b34801561037a57600080fd5b506101ff610389366004611a23565b6109d9565b34801561039a57600080fd5b506101ff6103a9366004611bab565b6109e6565b6101ff6103bc366004611c7c565b610cd2565b3480156103cd57600080fd5b506101ff6103dc366004611cc3565b610de5565b3480156103ed57600080fd5b5061019a6103fc366004611a23565b610e17565b6102c361040f366004611d43565b610f27565b34801561042057600080fd5b5061017061042f366004611d78565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561046957600080fd5b506101ff610478366004611b52565b610f7c565b60006001600160e01b031982166380ac58cd60e01b14806104ae57506001600160e01b03198216635b5e139f60e01b145b806104c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546104de90611d96565b80601f016020809104026020016040519081016040528092919081815260200182805461050a90611d96565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b5050505050905090565b600061056c82610ff5565b506000908152600660205260409020546001600160a01b031690565b6000610593826108b4565b9050806001600160a01b0316836001600160a01b0316036106055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806106215750610621813361042f565b6106935760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105fc565b61069d8383611054565b505050565b6106ac33826110c2565b6106c85760405162461bcd60e51b81526004016105fc90611dd0565b61069d838383611140565b61069d83838360405180602001604052806000815250610de5565b6106f66112dc565b600082600281111561070a5761070a611afb565b03610791576001600160a01b0381161561078c5760405162461bcd60e51b815260206004820152603960248201527f42656e65666963696172206d6f6465204e6f6e65207265717569726573207a6560448201527f726f206164647265737320666f7220726563697069656e74210000000000000060648201526084016105fc565b610802565b6001600160a01b0381166108025760405162461bcd60e51b815260206004820152603260248201527f42656e656669636961727920726563697069656e7420616464726573732073686044820152716f756c64206265207370656369666965642160701b60648201526084016105fc565b6001805483919060ff19168183600281111561082057610820611afb565b0217905550600180546001600160a01b0390921661010002610100600160a81b031990921691909117905550565b60408051808201909152600080825260208201526040805180820190915260018054829060ff16600281111561088657610886611afb565b600281111561089757610897611afb565b8152905461010090046001600160a01b0316602090910152919050565b6000818152600460205260408120546001600160a01b0316806104c95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105fc565b60006001600160a01b03821661097e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105fc565b506001600160a01b031660009081526005602052604090205490565b6109a26112dc565b6109ac6000611336565b565b6109b66112dc565b600b55565b6060600380546104de90611d96565b6109d5338383611386565b5050565b6109e16112dc565b600a55565b6109ee6112dc565b6109f6611454565b610a425760405162461bcd60e51b815260206004820181905260248201527f42656e65666963696172792073686f756c64206265207370656369666965642160448201526064016105fc565b60008211610a925760405162461bcd60e51b815260206004820152601f60248201527f53656e6420416d6f756e742073686f756c6420626520706f736974697665210060448201526064016105fc565b306001600160a01b038216610b67576001600160a01b0381163183811015610b225760405162461bcd60e51b815260206004820152603a60248201527f53656e6420416d6f756e74206578636565647320536d61727420436f6e74726160448201527f63742773206e617469766520746f6b656e2062616c616e63652100000000000060648201526084016105fc565b6001546040516101009091046001600160a01b0316906108fc8615029086906000818181858888f19350505050158015610b60573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81526001600160a01b03828116600483015283916000918316906370a0823190602401602060405180830381865afa158015610bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd69190611e1e565b905084811015610c4e5760405162461bcd60e51b815260206004820152603a60248201527f53656e6420416d6f756e74206578636565647320536d61727420436f6e74726160448201527f63742773204552432d323020746f6b656e2062616c616e63652100000000000060648201526084016105fc565b60015460405163a9059cbb60e01b81526101009091046001600160a01b0390811660048301526024820187905283169063a9059cbb906044016020604051808303816000875af1158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cca9190611e37565b505050505050565b600a54821115610d3a5760405162461bcd60e51b815260206004820152602d60248201527f416d6f756e74206f66204e4654732065786365656473204d6178696d756d204160448201526c1b1b1bddd95908105b5bdd5b9d609a1b60648201526084016105fc565b610d6982600b54610d4b9190611e6a565b60405180606001604052806028815260200161214660289139611490565b3360015b838111610ddf57610d82600980546001019055565b6000610d8d60095490565b9050610d998382611507565b610dcc8185610da785611649565b604051602001610db8929190611e89565b60405160208183030381529060405261174a565b5080610dd781611ec8565b915050610d6d565b50505050565b610def33836110c2565b610e0b5760405162461bcd60e51b81526004016105fc90611dd0565b610ddf848484846117dd565b6060610e2282610ff5565b60008281526008602052604081208054610e3b90611d96565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6790611d96565b8015610eb45780601f10610e8957610100808354040283529160200191610eb4565b820191906000526020600020905b815481529060010190602001808311610e9757829003601f168201915b505050505090506000610ed260408051602081019091526000815290565b90508051600003610ee4575092915050565b815115610f16578082604051602001610efe929190611ee1565b60405160208183030381529060405292505050919050565b610f1f84611810565b949350505050565b6000610f4d600b5460405180606001604052806028815260200161214660289139611490565b610f5b600980546001019055565b6000610f6660095490565b9050610f723382611507565b6104c9818461174a565b610f846112dc565b6001600160a01b038116610fe95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105fc565b610ff281611336565b50565b6000818152600460205260409020546001600160a01b0316610ff25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105fc565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611089826108b4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110ce836108b4565b9050806001600160a01b0316846001600160a01b0316148061111557506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b80610f1f5750836001600160a01b031661112e84610561565b6001600160a01b031614949350505050565b826001600160a01b0316611153826108b4565b6001600160a01b0316146111b75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105fc565b6001600160a01b0382166112195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105fc565b611224600082611054565b6001600160a01b038316600090815260056020526040812080546001929061124d908490611f10565b90915550506001600160a01b038216600090815260056020526040812080546001929061127b908490611f27565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000546001600160a01b031633146109ac5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316036113e75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105fc565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008060015460ff16600281111561146e5761146e611afb565b1415801561148b575060015461010090046001600160a01b031615155b905090565b81156109d5578134101581906114b95760405162461bcd60e51b81526004016105fc9190611a10565b506114c2611454565b156109d5576001546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f1935050505015801561069d573d6000803e3d6000fd5b6001600160a01b03821661155d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fc565b6000818152600460205260409020546001600160a01b0316156115c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105fc565b6001600160a01b03821660009081526005602052604081208054600192906115eb908490611f27565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816000036116705750506040805180820190915260018152600360fc1b602082015290565b8160005b811561169a578061168481611ec8565b91506116939050600a83611f55565b9150611674565b60008167ffffffffffffffff8111156116b5576116b5611bd0565b6040519080825280601f01601f1916602001820160405280156116df576020820181803683370190505b5090505b8415610f1f576116f4600183611f10565b9150611701600a86611f69565b61170c906030611f27565b60f81b81838151811061172157611721611f7d565b60200101906001600160f81b031916908160001a905350611743600a86611f55565b94506116e3565b6000828152600460205260409020546001600160a01b03166117c55760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016105fc565b600082815260086020526040902061069d8282611fd9565b6117e8848484611140565b6117f484848484611884565b610ddf5760405162461bcd60e51b81526004016105fc90612099565b606061181b82610ff5565b600061183260408051602081019091526000815290565b90506000815111611852576040518060200160405280600081525061187d565b8061185c84611649565b60405160200161186d929190611ee1565b6040516020818303038152906040525b9392505050565b60006001600160a01b0384163b1561197a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118c89033908990889088906004016120eb565b6020604051808303816000875af1925050508015611903575060408051601f3d908101601f1916820190925261190091810190612128565b60015b611960573d808015611931576040519150601f19603f3d011682016040523d82523d6000602084013e611936565b606091505b5080516000036119585760405162461bcd60e51b81526004016105fc90612099565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f1f565b506001949350505050565b6001600160e01b031981168114610ff257600080fd5b6000602082840312156119ad57600080fd5b813561187d81611985565b60005b838110156119d35781810151838201526020016119bb565b83811115610ddf5750506000910152565b600081518084526119fc8160208601602086016119b8565b601f01601f19169290920160200192915050565b60208152600061187d60208301846119e4565b600060208284031215611a3557600080fd5b5035919050565b6001600160a01b0381168114610ff257600080fd5b60008060408385031215611a6457600080fd5b8235611a6f81611a3c565b946020939093013593505050565b600080600060608486031215611a9257600080fd5b8335611a9d81611a3c565b92506020840135611aad81611a3c565b929592945050506040919091013590565b60008060408385031215611ad157600080fd5b823560038110611ae057600080fd5b91506020830135611af081611a3c565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b8151604082019060038110611b3657634e487b7160e01b600052602160045260246000fd5b82526020928301516001600160a01b0316929091019190915290565b600060208284031215611b6457600080fd5b813561187d81611a3c565b8015158114610ff257600080fd5b60008060408385031215611b9057600080fd5b8235611b9b81611a3c565b91506020830135611af081611b6f565b60008060408385031215611bbe57600080fd5b823591506020830135611af081611a3c565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611c0157611c01611bd0565b604051601f8501601f19908116603f01168101908282118183101715611c2957611c29611bd0565b81604052809350858152868686011115611c4257600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611c6d57600080fd5b61187d83833560208501611be6565b60008060408385031215611c8f57600080fd5b82359150602083013567ffffffffffffffff811115611cad57600080fd5b611cb985828601611c5c565b9150509250929050565b60008060008060808587031215611cd957600080fd5b8435611ce481611a3c565b93506020850135611cf481611a3c565b925060408501359150606085013567ffffffffffffffff811115611d1757600080fd5b8501601f81018713611d2857600080fd5b611d3787823560208401611be6565b91505092959194509250565b600060208284031215611d5557600080fd5b813567ffffffffffffffff811115611d6c57600080fd5b610f1f84828501611c5c565b60008060408385031215611d8b57600080fd5b8235611ae081611a3c565b600181811c90821680611daa57607f821691505b602082108103611dca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b600060208284031215611e3057600080fd5b5051919050565b600060208284031215611e4957600080fd5b815161187d81611b6f565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611e8457611e84611e54565b500290565b60008351611e9b8184602088016119b8565b835190830190611eaf8183602088016119b8565b64173539b7b760d91b9101908152600501949350505050565b600060018201611eda57611eda611e54565b5060010190565b60008351611ef38184602088016119b8565b835190830190611f078183602088016119b8565b01949350505050565b600082821015611f2257611f22611e54565b500390565b60008219821115611f3a57611f3a611e54565b500190565b634e487b7160e01b600052601260045260246000fd5b600082611f6457611f64611f3f565b500490565b600082611f7857611f78611f3f565b500690565b634e487b7160e01b600052603260045260246000fd5b601f82111561069d57600081815260208120601f850160051c81016020861015611fba5750805b601f850160051c820191505b81811015610cca57828155600101611fc6565b815167ffffffffffffffff811115611ff357611ff3611bd0565b612007816120018454611d96565b84611f93565b602080601f83116001811461203c57600084156120245750858301515b600019600386901b1c1916600185901b178555610cca565b600085815260208120601f198616915b8281101561206b5788860151825594840194600190910190840161204c565b50858210156120895787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061211e908301846119e4565b9695505050505050565b60006020828403121561213a57600080fd5b815161187d8161198556fe4d696e74696e672050726963652073686f756c642062652073656e7420746f206d696e74204e4654a2646970667358221220102cd03db25bd730ea0fe16be968e9851cde6b4971934bdae0942247a4ebc02264736f6c634300080f0033
Deployed Bytecode Sourcemap
61563:2160:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46350:305;;;;;;;;;;-1:-1:-1;46350:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;46350:305:0;;;;;;;;47277:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48790:171::-;;;;;;;;;;-1:-1:-1;48790:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;48790:171:0;1528:203:1;48307:417:0;;;;;;;;;;-1:-1:-1;48307:417:0;;;;;:::i;:::-;;:::i;:::-;;49490:336;;;;;;;;;;-1:-1:-1;49490:336:0;;;;;:::i;:::-;;:::i;49897:185::-;;;;;;;;;;-1:-1:-1;49897:185:0;;;;;:::i;:::-;;:::i;25318:427::-;;;;;;;;;;-1:-1:-1;25318:427:0;;;;;:::i;:::-;;:::i;25008:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46988:222::-;;;;;;;;;;-1:-1:-1;46988:222:0;;;;;:::i;:::-;;:::i;46719:207::-;;;;;;;;;;-1:-1:-1;46719:207:0;;;;;:::i;:::-;;:::i;:::-;;;4119:25:1;;;4107:2;4092:18;46719:207:0;3973:177:1;23284:103:0;;;;;;;;;;;;;:::i;63177:90::-;;;;;;;;;;-1:-1:-1;63248:13:0;;63177:90;;63615:105;;;;;;;;;;-1:-1:-1;63615:105:0;;;;;:::i;:::-;;:::i;22636:87::-;;;;;;;;;;-1:-1:-1;22682:7:0;22709:6;-1:-1:-1;;;;;22709:6:0;22636:87;;47446:104;;;;;;;;;;;;;:::i;49033:155::-;;;;;;;;;;-1:-1:-1;49033:155:0;;;;;:::i;:::-;;:::i;63481:102::-;;;;;;;;;;-1:-1:-1;63481:102:0;;;;;:::i;:::-;;:::i;25829:1091::-;;;;;;;;;;-1:-1:-1;25829:1091:0;;;;;:::i;:::-;;:::i;62437:556::-;;;;;;:::i;:::-;;:::i;50153:323::-;;;;;;;;;;-1:-1:-1;50153:323:0;;;;;:::i;:::-;;:::i;60058:624::-;;;;;;;;;;-1:-1:-1;60058:624:0;;;;;:::i;:::-;;:::i;62088:343::-;;;;;;:::i;:::-;;:::i;49259:164::-;;;;;;;;;;-1:-1:-1;49259:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;49380:25:0;;;49356:4;49380:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49259:164;23542:201;;;;;;;;;;-1:-1:-1;23542:201:0;;;;;:::i;:::-;;:::i;46350:305::-;46452:4;-1:-1:-1;;;;;;46489:40:0;;-1:-1:-1;;;46489:40:0;;:105;;-1:-1:-1;;;;;;;46546:48:0;;-1:-1:-1;;;46546:48:0;46489:105;:158;;;-1:-1:-1;;;;;;;;;;39201:40:0;;;46611:36;46469:178;46350:305;-1:-1:-1;;46350:305:0:o;47277:100::-;47331:13;47364:5;47357:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47277:100;:::o;48790:171::-;48866:7;48886:23;48901:7;48886:14;:23::i;:::-;-1:-1:-1;48929:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48929:24:0;;48790:171::o;48307:417::-;48388:13;48404:23;48419:7;48404:14;:23::i;:::-;48388:39;;48452:5;-1:-1:-1;;;;;48446:11:0;:2;-1:-1:-1;;;;;48446:11:0;;48438:57;;;;-1:-1:-1;;;48438:57:0;;8483:2:1;48438:57:0;;;8465:21:1;8522:2;8502:18;;;8495:30;8561:34;8541:18;;;8534:62;-1:-1:-1;;;8612:18:1;;;8605:31;8653:19;;48438:57:0;;;;;;;;;8335:10;-1:-1:-1;;;;;48530:21:0;;;;:62;;-1:-1:-1;48555:37:0;48572:5;8335:10;49259:164;:::i;48555:37::-;48508:174;;;;-1:-1:-1;;;48508:174:0;;8885:2:1;48508:174:0;;;8867:21:1;8924:2;8904:18;;;8897:30;8963:34;8943:18;;;8936:62;9034:32;9014:18;;;9007:60;9084:19;;48508:174:0;8683:426:1;48508:174:0;48695:21;48704:2;48708:7;48695:8;:21::i;:::-;48377:347;48307:417;;:::o;49490:336::-;49685:41;8335:10;49718:7;49685:18;:41::i;:::-;49677:100;;;;-1:-1:-1;;;49677:100:0;;;;;;;:::i;:::-;49790:28;49800:4;49806:2;49810:7;49790:9;:28::i;49897:185::-;50035:39;50052:4;50058:2;50062:7;50035:39;;;;;;;;;;;;:16;:39::i;25318:427::-;22522:13;:11;:13::i;:::-;25438:20:::1;25430:4;:28;;;;;;;;:::i;:::-;::::0;25426:239:::1;;-1:-1:-1::0;;;;;25475:23:0;::::1;::::0;25467:93:::1;;;::::0;-1:-1:-1;;;25467:93:0;;9731:2:1;25467:93:0::1;::::0;::::1;9713:21:1::0;9770:2;9750:18;;;9743:30;9809:34;9789:18;;;9782:62;9880:27;9860:18;;;9853:55;9925:19;;25467:93:0::1;9529:421:1::0;25467:93:0::1;25426:239;;;-1:-1:-1::0;;;;;25587:23:0;::::1;25579:86;;;::::0;-1:-1:-1;;;25579:86:0;;10157:2:1;25579:86:0::1;::::0;::::1;10139:21:1::0;10196:2;10176:18;;;10169:30;10235:34;10215:18;;;10208:62;-1:-1:-1;;;10286:18:1;;;10279:48;10344:19;;25579:86:0::1;9955:414:1::0;25579:86:0::1;25674:12;:24:::0;;25694:4;;25674:12;-1:-1:-1;;25674:24:0::1;:12:::0;25694:4;25674:24:::1;::::0;::::1;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;25705:12:0::1;:34:::0;;-1:-1:-1;;;;;25705:34:0;;::::1;;;-1:-1:-1::0;;;;;;25705:34:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;25318:427:0:o;25008:99::-;-1:-1:-1;;;;;;;;;;;;;;;;;25082:19:0;;;;;;;;;25089:12;25082:19;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;25082:19:0;;;;;;;;-1:-1:-1;25008:99:0:o;46988:222::-;47060:7;47096:16;;;:7;:16;;;;;;-1:-1:-1;;;;;47096:16:0;;47123:56;;;;-1:-1:-1;;;47123:56:0;;10576:2:1;47123:56:0;;;10558:21:1;10615:2;10595:18;;;10588:30;-1:-1:-1;;;10634:18:1;;;10627:54;10698:18;;47123:56:0;10374:348:1;46719:207:0;46791:7;-1:-1:-1;;;;;46819:19:0;;46811:73;;;;-1:-1:-1;;;46811:73:0;;10929:2:1;46811:73:0;;;10911:21:1;10968:2;10948:18;;;10941:30;11007:34;10987:18;;;10980:62;-1:-1:-1;;;11058:18:1;;;11051:39;11107:19;;46811:73:0;10727:405:1;46811:73:0;-1:-1:-1;;;;;;46902:16:0;;;;;:9;:16;;;;;;;46719:207::o;23284:103::-;22522:13;:11;:13::i;:::-;23349:30:::1;23376:1;23349:18;:30::i;:::-;23284:103::o:0;63615:105::-;22522:13;:11;:13::i;:::-;63686::::1;:28:::0;63615:105::o;47446:104::-;47502:13;47535:7;47528:14;;;;;:::i;49033:155::-;49128:52;8335:10;49161:8;49171;49128:18;:52::i;:::-;49033:155;;:::o;63481:102::-;22522:13;:11;:13::i;:::-;63549::::1;:28:::0;63481:102::o;25829:1091::-;22522:13;:11;:13::i;:::-;25927:22:::1;:20;:22::i;:::-;25919:67;;;::::0;-1:-1:-1;;;25919:67:0;;11339:2:1;25919:67:0::1;::::0;::::1;11321:21:1::0;;;11358:18;;;11351:30;11417:34;11397:18;;;11390:62;11469:18;;25919:67:0::1;11137:356:1::0;25919:67:0::1;26010:1;26001:6;:10;25993:54;;;::::0;-1:-1:-1;;;25993:54:0;;11700:2:1;25993:54:0::1;::::0;::::1;11682:21:1::0;11739:2;11719:18;;;11712:30;11778:33;11758:18;;;11751:61;11829:18;;25993:54:0::1;11498:355:1::0;25993:54:0::1;26122:4;-1:-1:-1::0;;;;;26140:27:0;::::1;26136:779;;-1:-1:-1::0;;;;;26253:15:0;::::1;;26285:17:::0;;::::1;;26277:88;;;::::0;-1:-1:-1;;;26277:88:0;;12060:2:1;26277:88:0::1;::::0;::::1;12042:21:1::0;12099:2;12079:18;;;12072:30;12138:34;12118:18;;;12111:62;12209:28;12189:18;;;12182:56;12255:19;;26277:88:0::1;11858:422:1::0;26277:88:0::1;26426:12;:22:::0;:39:::1;::::0;:22:::1;::::0;;::::1;-1:-1:-1::0;;;;;26426:22:0::1;::::0;:39:::1;::::0;::::1;;::::0;;;:22:::1;:39:::0;:22;:39;;:22;:39;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;26169:304;48377:347:::0;48307:417;;:::o;26136:779::-:1;26659:36;::::0;-1:-1:-1;;;26659:36:0;;-1:-1:-1;;;;;1692:32:1;;;26659:36:0::1;::::0;::::1;1674:51:1::0;26561:13:0;;26529:23:::1;::::0;26659:27;::::1;::::0;::::1;::::0;1647:18:1;;26659:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26641:54;;26723:6;26712:7;:17;;26704:88;;;::::0;-1:-1:-1;;;26704:88:0;;12676:2:1;26704:88:0::1;::::0;::::1;12658:21:1::0;12715:2;12695:18;;;12688:30;12754:34;12734:18;;;12727:62;12825:28;12805:18;;;12798:56;12871:19;;26704:88:0::1;12474:422:1::0;26704:88:0::1;26876:12;:22:::0;26849:58:::1;::::0;-1:-1:-1;;;26849:58:0;;26876:22:::1;::::0;;::::1;-1:-1:-1::0;;;;;26876:22:0;;::::1;26849:58;::::0;::::1;13083:51:1::0;13150:18;;;13143:34;;;26849:26:0;::::1;::::0;::::1;::::0;13056:18:1;;26849:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26484:431;;25912:1008;25829:1091:::0;;:::o;62437:556::-;62534:13;;62525:5;:22;;62517:80;;;;-1:-1:-1;;;62517:80:0;;13640:2:1;62517:80:0;;;13622:21:1;13679:2;13659:18;;;13652:30;13718:34;13698:18;;;13691:62;-1:-1:-1;;;13769:18:1;;;13762:43;13822:19;;62517:80:0;13438:409:1;62517:80:0;62636:79;62665:5;62649:13;;:21;;;;:::i;:::-;62636:79;;;;;;;;;;;;;;;;;:12;:79::i;:::-;62741:10;62774:1;62760:228;62782:5;62777:1;:10;62760:228;;62808:21;:9;4697:19;;4715:1;4697:19;;;4608:127;62808:21;62840:10;62853:19;:9;4578:14;;4486:114;62853:19;62840:32;;62881:17;62887:6;62895:2;62881:5;:17::i;:::-;62909:71;62922:2;62941:7;62950:19;62967:1;62950:16;:19::i;:::-;62927:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62909:12;:71::i;:::-;-1:-1:-1;62789:3:0;;;;:::i;:::-;;;;62760:228;;;;62510:483;62437:556;;:::o;50153:323::-;50327:41;8335:10;50360:7;50327:18;:41::i;:::-;50319:100;;;;-1:-1:-1;;;50319:100:0;;;;;;;:::i;:::-;50430:38;50444:4;50450:2;50454:7;50463:4;50430:13;:38::i;60058:624::-;60131:13;60157:23;60172:7;60157:14;:23::i;:::-;60193;60219:19;;;:10;:19;;;;;60193:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60249:18;60270:10;48228:9;;;;;;;;;-1:-1:-1;48228:9:0;;;48151:94;60270:10;60249:31;;60362:4;60356:18;60378:1;60356:23;60352:72;;-1:-1:-1;60403:9:0;60058:624;-1:-1:-1;;60058:624:0:o;60352:72::-;60528:23;;:27;60524:108;;60603:4;60609:9;60586:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60572:48;;;;60058:624;;;:::o;60524:108::-;60651:23;60666:7;60651:14;:23::i;:::-;60644:30;60058:624;-1:-1:-1;;;;60058:624:0:o;62088:343::-;62155:7;62204:71;62217:13;;62204:71;;;;;;;;;;;;;;;;;:12;:71::i;:::-;62284:21;:9;4697:19;;4715:1;4697:19;;;4608:127;62284:21;62314:10;62327:19;:9;4578:14;;4486:114;62327:19;62314:32;;62353:21;62359:10;62371:2;62353:5;:21::i;:::-;62381:26;62394:2;62398:8;62381:12;:26::i;23542:201::-;22522:13;:11;:13::i;:::-;-1:-1:-1;;;;;23631:22:0;::::1;23623:73;;;::::0;-1:-1:-1;;;23623:73:0;;15605:2:1;23623:73:0::1;::::0;::::1;15587:21:1::0;15644:2;15624:18;;;15617:30;15683:34;15663:18;;;15656:62;-1:-1:-1;;;15734:18:1;;;15727:36;15780:19;;23623:73:0::1;15403:402:1::0;23623:73:0::1;23707:28;23726:8;23707:18;:28::i;:::-;23542:201:::0;:::o;56765:135::-;52048:4;52072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52072:16:0;56839:53;;;;-1:-1:-1;;;56839:53:0;;10576:2:1;56839:53:0;;;10558:21:1;10615:2;10595:18;;;10588:30;-1:-1:-1;;;10634:18:1;;;10627:54;10698:18;;56839:53:0;10374:348:1;56044:174:0;56119:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;56119:29:0;-1:-1:-1;;;;;56119:29:0;;;;;;;;:24;;56173:23;56119:24;56173:14;:23::i;:::-;-1:-1:-1;;;;;56164:46:0;;;;;;;;;;;56044:174;;:::o;52277:264::-;52370:4;52387:13;52403:23;52418:7;52403:14;:23::i;:::-;52387:39;;52456:5;-1:-1:-1;;;;;52445:16:0;:7;-1:-1:-1;;;;;52445:16:0;;:52;;;-1:-1:-1;;;;;;49380:25:0;;;49356:4;49380:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;52465:32;52445:87;;;;52525:7;-1:-1:-1;;;;;52501:31:0;:20;52513:7;52501:11;:20::i;:::-;-1:-1:-1;;;;;52501:31:0;;52437:96;52277:264;-1:-1:-1;;;;52277:264:0:o;55300:625::-;55459:4;-1:-1:-1;;;;;55432:31:0;:23;55447:7;55432:14;:23::i;:::-;-1:-1:-1;;;;;55432:31:0;;55424:81;;;;-1:-1:-1;;;55424:81:0;;16012:2:1;55424:81:0;;;15994:21:1;16051:2;16031:18;;;16024:30;16090:34;16070:18;;;16063:62;-1:-1:-1;;;16141:18:1;;;16134:35;16186:19;;55424:81:0;15810:401:1;55424:81:0;-1:-1:-1;;;;;55524:16:0;;55516:65;;;;-1:-1:-1;;;55516:65:0;;16418:2:1;55516:65:0;;;16400:21:1;16457:2;16437:18;;;16430:30;16496:34;16476:18;;;16469:62;-1:-1:-1;;;16547:18:1;;;16540:34;16591:19;;55516:65:0;16216:400:1;55516:65:0;55698:29;55715:1;55719:7;55698:8;:29::i;:::-;-1:-1:-1;;;;;55740:15:0;;;;;;:9;:15;;;;;:20;;55759:1;;55740:15;:20;;55759:1;;55740:20;:::i;:::-;;;;-1:-1:-1;;;;;;;55771:13:0;;;;;;:9;:13;;;;;:18;;55788:1;;55771:13;:18;;55788:1;;55771:18;:::i;:::-;;;;-1:-1:-1;;55800:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;55800:21:0;-1:-1:-1;;;;;55800:21:0;;;;;;;;;55839:27;;55800:16;;55839:27;;;;;;;48377:347;48307:417;;:::o;22801:132::-;22682:7;22709:6;-1:-1:-1;;;;;22709:6:0;8335:10;22865:23;22857:68;;;;-1:-1:-1;;;22857:68:0;;17086:2:1;22857:68:0;;;17068:21:1;;;17105:18;;;17098:30;17164:34;17144:18;;;17137:62;17216:18;;22857:68:0;16884:356:1;23903:191:0;23977:16;23996:6;;-1:-1:-1;;;;;24013:17:0;;;-1:-1:-1;;;;;;24013:17:0;;;;;;24046:40;;23996:6;;;;;;;24046:40;;23977:16;24046:40;23966:128;23903:191;:::o;56361:315::-;56516:8;-1:-1:-1;;;;;56507:17:0;:5;-1:-1:-1;;;;;56507:17:0;;56499:55;;;;-1:-1:-1;;;56499:55:0;;17447:2:1;56499:55:0;;;17429:21:1;17486:2;17466:18;;;17459:30;17525:27;17505:18;;;17498:55;17570:18;;56499:55:0;17245:349:1;56499:55:0;-1:-1:-1;;;;;56565:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;56565:46:0;;;;;;;;;;56627:41;;540::1;;;56627::0;;513:18:1;56627:41:0;;;;;;;56361:315;;;:::o;27132:169::-;27195:4;;27214:12;:17;;;:41;;;;;;;;:::i;:::-;;;:81;;;;-1:-1:-1;27259:12:0;:22;;;;-1:-1:-1;;;;;27259:22:0;:36;;27214:81;27207:88;;27132:169;:::o;27356:340::-;27445:10;;27441:250;;27540:6;27527:9;:19;;27548:7;27519:37;;;;;-1:-1:-1;;;27519:37:0;;;;;;;;:::i;:::-;;27608:22;:20;:22::i;:::-;27604:79;;;27641:12;:22;:42;;-1:-1:-1;;;;;27641:22:0;;;;;;;;;27673:9;27641:42;;;;;:22;:42;:22;:42;27673:9;27641:22;:42;;;;;;;;;;;;;;;;;;;53875:439;-1:-1:-1;;;;;53955:16:0;;53947:61;;;;-1:-1:-1;;;53947:61:0;;17801:2:1;53947:61:0;;;17783:21:1;;;17820:18;;;17813:30;17879:34;17859:18;;;17852:62;17931:18;;53947:61:0;17599:356:1;53947:61:0;52048:4;52072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52072:16:0;:30;54019:58;;;;-1:-1:-1;;;54019:58:0;;18162:2:1;54019:58:0;;;18144:21:1;18201:2;18181:18;;;18174:30;18240;18220:18;;;18213:58;18288:18;;54019:58:0;17960:352:1;54019:58:0;-1:-1:-1;;;;;54148:13:0;;;;;;:9;:13;;;;;:18;;54165:1;;54148:13;:18;;54165:1;;54148:18;:::i;:::-;;;;-1:-1:-1;;54177:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;54177:21:0;-1:-1:-1;;;;;54177:21:0;;;;;;;;54216:33;;54177:16;;;54216:33;;54177:16;;54216:33;49033:155;;:::o;5509:723::-;5565:13;5786:5;5795:1;5786:10;5782:53;;-1:-1:-1;;5813:10:0;;;;;;;;;;;;-1:-1:-1;;;5813:10:0;;;;;5509:723::o;5782:53::-;5860:5;5845:12;5901:78;5908:9;;5901:78;;5934:8;;;;:::i;:::-;;-1:-1:-1;5957:10:0;;-1:-1:-1;5965:2:0;5957:10;;:::i;:::-;;;5901:78;;;5989:19;6021:6;6011:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6011:17:0;;5989:39;;6039:154;6046:10;;6039:154;;6073:11;6083:1;6073:11;;:::i;:::-;;-1:-1:-1;6142:10:0;6150:2;6142:5;:10;:::i;:::-;6129:24;;:2;:24;:::i;:::-;6116:39;;6099:6;6106;6099:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6099:56:0;;;;;;;;-1:-1:-1;6170:11:0;6179:2;6170:11;;:::i;:::-;;;6039:154;;60838:217;52048:4;52072:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52072:16:0;60930:75;;;;-1:-1:-1;;;60930:75:0;;19025:2:1;60930:75:0;;;19007:21:1;19064:2;19044:18;;;19037:30;19103:34;19083:18;;;19076:62;-1:-1:-1;;;19154:18:1;;;19147:44;19208:19;;60930:75:0;18823:410:1;60930:75:0;61016:19;;;;:10;:19;;;;;:31;61038:9;61016:19;:31;:::i;51357:313::-;51513:28;51523:4;51529:2;51533:7;51513:9;:28::i;:::-;51560:47;51583:4;51589:2;51593:7;51602:4;51560:22;:47::i;:::-;51552:110;;;;-1:-1:-1;;;51552:110:0;;;;;;;:::i;47621:281::-;47694:13;47720:23;47735:7;47720:14;:23::i;:::-;47756:21;47780:10;48228:9;;;;;;;;;-1:-1:-1;48228:9:0;;;48151:94;47780:10;47756:34;;47832:1;47814:7;47808:21;:25;:86;;;;;;;;;;;;;;;;;47860:7;47869:18;:7;:16;:18::i;:::-;47843:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47808:86;47801:93;47621:281;-1:-1:-1;;;47621:281:0:o;57464:853::-;57618:4;-1:-1:-1;;;;;57639:13:0;;29231:19;:23;57635:675;;57675:71;;-1:-1:-1;;;57675:71:0;;-1:-1:-1;;;;;57675:36:0;;;;;:71;;8335:10;;57726:4;;57732:7;;57741:4;;57675:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57675:71:0;;;;;;;;-1:-1:-1;;57675:71:0;;;;;;;;;;;;:::i;:::-;;;57671:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57916:6;:13;57933:1;57916:18;57912:328;;57959:60;;-1:-1:-1;;;57959:60:0;;;;;;;:::i;57912:328::-;58190:6;58184:13;58175:6;58171:2;58167:15;58160:38;57671:584;-1:-1:-1;;;;;;57797:51:0;-1:-1:-1;;;57797:51:0;;-1:-1:-1;57790:58:0;;57635:675;-1:-1:-1;58294:4:0;57464:853;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:456::-;2269:6;2277;2285;2338:2;2326:9;2317:7;2313:23;2309:32;2306:52;;;2354:1;2351;2344:12;2306:52;2393:9;2380:23;2412:31;2437:5;2412:31;:::i;:::-;2462:5;-1:-1:-1;2519:2:1;2504:18;;2491:32;2532:33;2491:32;2532:33;:::i;:::-;2192:456;;2584:7;;-1:-1:-1;;;2638:2:1;2623:18;;;;2610:32;;2192:456::o;2653:425::-;2749:6;2757;2810:2;2798:9;2789:7;2785:23;2781:32;2778:52;;;2826:1;2823;2816:12;2778:52;2865:9;2852:23;2904:1;2897:5;2894:12;2884:40;;2920:1;2917;2910:12;2884:40;2943:5;-1:-1:-1;3000:2:1;2985:18;;2972:32;3013:33;2972:32;3013:33;:::i;:::-;3065:7;3055:17;;;2653:425;;;;;:::o;3083:127::-;3144:10;3139:3;3135:20;3132:1;3125:31;3175:4;3172:1;3165:15;3199:4;3196:1;3189:15;3215:501;3429:13;;3407:2;3392:18;;;3468:1;3461:9;;3451:140;;3513:10;3508:3;3504:20;3501:1;3494:31;3548:4;3545:1;3538:15;3576:4;3573:1;3566:15;3451:140;3600:21;;3681:4;3669:17;;;3663:24;-1:-1:-1;;;;;3659:50:1;3637:20;;;;3630:80;;;;3215:501;:::o;3721:247::-;3780:6;3833:2;3821:9;3812:7;3808:23;3804:32;3801:52;;;3849:1;3846;3839:12;3801:52;3888:9;3875:23;3907:31;3932:5;3907:31;:::i;4155:118::-;4241:5;4234:13;4227:21;4220:5;4217:32;4207:60;;4263:1;4260;4253:12;4278:382;4343:6;4351;4404:2;4392:9;4383:7;4379:23;4375:32;4372:52;;;4420:1;4417;4410:12;4372:52;4459:9;4446:23;4478:31;4503:5;4478:31;:::i;:::-;4528:5;-1:-1:-1;4585:2:1;4570:18;;4557:32;4598:30;4557:32;4598:30;:::i;4665:315::-;4733:6;4741;4794:2;4782:9;4773:7;4769:23;4765:32;4762:52;;;4810:1;4807;4800:12;4762:52;4846:9;4833:23;4823:33;;4906:2;4895:9;4891:18;4878:32;4919:31;4944:5;4919:31;:::i;4985:127::-;5046:10;5041:3;5037:20;5034:1;5027:31;5077:4;5074:1;5067:15;5101:4;5098:1;5091:15;5117:632;5182:5;5212:18;5253:2;5245:6;5242:14;5239:40;;;5259:18;;:::i;:::-;5334:2;5328:9;5302:2;5388:15;;-1:-1:-1;;5384:24:1;;;5410:2;5380:33;5376:42;5364:55;;;5434:18;;;5454:22;;;5431:46;5428:72;;;5480:18;;:::i;:::-;5520:10;5516:2;5509:22;5549:6;5540:15;;5579:6;5571;5564:22;5619:3;5610:6;5605:3;5601:16;5598:25;5595:45;;;5636:1;5633;5626:12;5595:45;5686:6;5681:3;5674:4;5666:6;5662:17;5649:44;5741:1;5734:4;5725:6;5717;5713:19;5709:30;5702:41;;;;5117:632;;;;;:::o;5754:222::-;5797:5;5850:3;5843:4;5835:6;5831:17;5827:27;5817:55;;5868:1;5865;5858:12;5817:55;5890:80;5966:3;5957:6;5944:20;5937:4;5929:6;5925:17;5890:80;:::i;5981:390::-;6059:6;6067;6120:2;6108:9;6099:7;6095:23;6091:32;6088:52;;;6136:1;6133;6126:12;6088:52;6172:9;6159:23;6149:33;;6233:2;6222:9;6218:18;6205:32;6260:18;6252:6;6249:30;6246:50;;;6292:1;6289;6282:12;6246:50;6315;6357:7;6348:6;6337:9;6333:22;6315:50;:::i;:::-;6305:60;;;5981:390;;;;;:::o;6376:795::-;6471:6;6479;6487;6495;6548:3;6536:9;6527:7;6523:23;6519:33;6516:53;;;6565:1;6562;6555:12;6516:53;6604:9;6591:23;6623:31;6648:5;6623:31;:::i;:::-;6673:5;-1:-1:-1;6730:2:1;6715:18;;6702:32;6743:33;6702:32;6743:33;:::i;:::-;6795:7;-1:-1:-1;6849:2:1;6834:18;;6821:32;;-1:-1:-1;6904:2:1;6889:18;;6876:32;6931:18;6920:30;;6917:50;;;6963:1;6960;6953:12;6917:50;6986:22;;7039:4;7031:13;;7027:27;-1:-1:-1;7017:55:1;;7068:1;7065;7058:12;7017:55;7091:74;7157:7;7152:2;7139:16;7134:2;7130;7126:11;7091:74;:::i;:::-;7081:84;;;6376:795;;;;;;;:::o;7176:322::-;7245:6;7298:2;7286:9;7277:7;7273:23;7269:32;7266:52;;;7314:1;7311;7304:12;7266:52;7354:9;7341:23;7387:18;7379:6;7376:30;7373:50;;;7419:1;7416;7409:12;7373:50;7442;7484:7;7475:6;7464:9;7460:22;7442:50;:::i;7503:388::-;7571:6;7579;7632:2;7620:9;7611:7;7607:23;7603:32;7600:52;;;7648:1;7645;7638:12;7600:52;7687:9;7674:23;7706:31;7731:5;7706:31;:::i;7896:380::-;7975:1;7971:12;;;;8018;;;8039:61;;8093:4;8085:6;8081:17;8071:27;;8039:61;8146:2;8138:6;8135:14;8115:18;8112:38;8109:161;;8192:10;8187:3;8183:20;8180:1;8173:31;8227:4;8224:1;8217:15;8255:4;8252:1;8245:15;8109:161;;7896:380;;;:::o;9114:410::-;9316:2;9298:21;;;9355:2;9335:18;;;9328:30;9394:34;9389:2;9374:18;;9367:62;-1:-1:-1;;;9460:2:1;9445:18;;9438:44;9514:3;9499:19;;9114:410::o;12285:184::-;12355:6;12408:2;12396:9;12387:7;12383:23;12379:32;12376:52;;;12424:1;12421;12414:12;12376:52;-1:-1:-1;12447:16:1;;12285:184;-1:-1:-1;12285:184:1:o;13188:245::-;13255:6;13308:2;13296:9;13287:7;13283:23;13279:32;13276:52;;;13324:1;13321;13314:12;13276:52;13356:9;13350:16;13375:28;13397:5;13375:28;:::i;13852:127::-;13913:10;13908:3;13904:20;13901:1;13894:31;13944:4;13941:1;13934:15;13968:4;13965:1;13958:15;13984:168;14024:7;14090:1;14086;14082:6;14078:14;14075:1;14072:21;14067:1;14060:9;14053:17;14049:45;14046:71;;;14097:18;;:::i;:::-;-1:-1:-1;14137:9:1;;13984:168::o;14157:626::-;14426:3;14464:6;14458:13;14480:53;14526:6;14521:3;14514:4;14506:6;14502:17;14480:53;:::i;:::-;14596:13;;14555:16;;;;14618:57;14596:13;14555:16;14652:4;14640:17;;14618:57;:::i;:::-;-1:-1:-1;;;14697:20:1;;14726:22;;;14775:1;14764:13;;14157:626;-1:-1:-1;;;;14157:626:1:o;14788:135::-;14827:3;14848:17;;;14845:43;;14868:18;;:::i;:::-;-1:-1:-1;14915:1:1;14904:13;;14788:135::o;14928:470::-;15107:3;15145:6;15139:13;15161:53;15207:6;15202:3;15195:4;15187:6;15183:17;15161:53;:::i;:::-;15277:13;;15236:16;;;;15299:57;15277:13;15236:16;15333:4;15321:17;;15299:57;:::i;:::-;15372:20;;14928:470;-1:-1:-1;;;;14928:470:1:o;16621:125::-;16661:4;16689:1;16686;16683:8;16680:34;;;16694:18;;:::i;:::-;-1:-1:-1;16731:9:1;;16621:125::o;16751:128::-;16791:3;16822:1;16818:6;16815:1;16812:13;16809:39;;;16828:18;;:::i;:::-;-1:-1:-1;16864:9:1;;16751:128::o;18317:127::-;18378:10;18373:3;18369:20;18366:1;18359:31;18409:4;18406:1;18399:15;18433:4;18430:1;18423:15;18449:120;18489:1;18515;18505:35;;18520:18;;:::i;:::-;-1:-1:-1;18554:9:1;;18449:120::o;18574:112::-;18606:1;18632;18622:35;;18637:18;;:::i;:::-;-1:-1:-1;18671:9:1;;18574:112::o;18691:127::-;18752:10;18747:3;18743:20;18740:1;18733:31;18783:4;18780:1;18773:15;18807:4;18804:1;18797:15;19364:545;19466:2;19461:3;19458:11;19455:448;;;19502:1;19527:5;19523:2;19516:17;19572:4;19568:2;19558:19;19642:2;19630:10;19626:19;19623:1;19619:27;19613:4;19609:38;19678:4;19666:10;19663:20;19660:47;;;-1:-1:-1;19701:4:1;19660:47;19756:2;19751:3;19747:12;19744:1;19740:20;19734:4;19730:31;19720:41;;19811:82;19829:2;19822:5;19819:13;19811:82;;;19874:17;;;19855:1;19844:13;19811:82;;20085:1352;20211:3;20205:10;20238:18;20230:6;20227:30;20224:56;;;20260:18;;:::i;:::-;20289:97;20379:6;20339:38;20371:4;20365:11;20339:38;:::i;:::-;20333:4;20289:97;:::i;:::-;20441:4;;20505:2;20494:14;;20522:1;20517:663;;;;21224:1;21241:6;21238:89;;;-1:-1:-1;21293:19:1;;;21287:26;21238:89;-1:-1:-1;;20042:1:1;20038:11;;;20034:24;20030:29;20020:40;20066:1;20062:11;;;20017:57;21340:81;;20487:944;;20517:663;19311:1;19304:14;;;19348:4;19335:18;;-1:-1:-1;;20553:20:1;;;20671:236;20685:7;20682:1;20679:14;20671:236;;;20774:19;;;20768:26;20753:42;;20866:27;;;;20834:1;20822:14;;;;20701:19;;20671:236;;;20675:3;20935:6;20926:7;20923:19;20920:201;;;20996:19;;;20990:26;-1:-1:-1;;21079:1:1;21075:14;;;21091:3;21071:24;21067:37;21063:42;21048:58;21033:74;;20920:201;-1:-1:-1;;;;;21167:1:1;21151:14;;;21147:22;21134:36;;-1:-1:-1;20085:1352:1:o;21442:414::-;21644:2;21626:21;;;21683:2;21663:18;;;21656:30;21722:34;21717:2;21702:18;;21695:62;-1:-1:-1;;;21788:2:1;21773:18;;21766:48;21846:3;21831:19;;21442:414::o;21861:489::-;-1:-1:-1;;;;;22130:15:1;;;22112:34;;22182:15;;22177:2;22162:18;;22155:43;22229:2;22214:18;;22207:34;;;22277:3;22272:2;22257:18;;22250:31;;;22055:4;;22298:46;;22324:19;;22316:6;22298:46;:::i;:::-;22290:54;21861:489;-1:-1:-1;;;;;;21861:489:1:o;22355:249::-;22424:6;22477:2;22465:9;22456:7;22452:23;22448:32;22445:52;;;22493:1;22490;22483:12;22445:52;22525:9;22519:16;22544:30;22568:5;22544:30;:::i
Swarm Source
ipfs://102cd03db25bd730ea0fe16be968e9851cde6b4971934bdae0942247a4ebc022
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.