Token
Test Strands Position NFT (TestSP)
ERC-721
Overview
Max Total Supply
0 TestSP
Holders
1
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 TestSPLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
StrandsPosition
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 20 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import {ERC721} from "solmate/src/tokens/ERC721.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {OwnableAdmins} from "../core/OwnableAdmins.sol";
import {DefaultOperatorFilterer} from "operator-filter-registry/src/DefaultOperatorFilterer.sol";
import {console} from "hardhat/console.sol";
//TODO:
//1) add isLong
//2) averagePrice to replace purchasePrice, adjustPosition to replace setSize
contract StrandsPosition is ERC721, DefaultOperatorFilterer, OwnableAdmins {
struct TradeDetails {
string tradeId;
bool isLong;
uint quantity;
uint purchasePrice;
uint tradeTime;
}
struct PositionDetails {
string symbol;
string exchange;
TradeDetails[] trades;
string clearingFirm;
string accountNumber;
}
uint256 MAX_UINT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
uint public mintCounter;
string tURI;
mapping(uint => PositionDetails) private positionDetails;
mapping(address => uint[]) private _ownedTokenIds; // Owner -> Owned Token Ids
mapping(bytes32 => uint) private hashMap; /// bytes32 = keccak256(abi.encodePacked(firm, ac, symbol))
event PositionExpired(address tokenOwner, uint tokenId, uint totalQuantity, bool isLong);
constructor(string memory _name, string memory _symbol, string memory _tURI) ERC721(_name, _symbol) {
tURI = _tURI;
}
function tokenURI(uint tokenId) public view override(ERC721) returns (string memory) {
require((mintCounter == 0 || tokenId <= mintCounter), "can't get URI for nonexistent token");
return tURI;
}
function getPositionDetails(uint tokenId) public view returns (PositionDetails memory) {
return positionDetails[tokenId];
}
function setTokenURI(uint tokenId, string memory _tURI) public onlyAdmins {
require((mintCounter == 0 || tokenId <= mintCounter), "can't set URI for nonexistent token");
tURI = _tURI;
}
function mint(
address to,
string memory symbol_,
string memory exchange_,
string memory clearingFirm_,
string memory accountNumber_,
TradeDetails memory tradeDetails_
) public onlyAdmins {
// Check NFT exists with same clearingFirm_ and accountNumber_
bytes32 hashMapKey = keccak256(abi.encodePacked(clearingFirm_, accountNumber_, symbol_));
require(hashMap[hashMapKey] == 0, "NFT already exists");
mintCounter += 1;
positionDetails[mintCounter].trades.push(
TradeDetails({
tradeId: tradeDetails_.tradeId,
isLong: tradeDetails_.isLong,
quantity: tradeDetails_.quantity,
purchasePrice: tradeDetails_.purchasePrice,
tradeTime: tradeDetails_.tradeTime
})
);
positionDetails[mintCounter].symbol = symbol_;
positionDetails[mintCounter].exchange = exchange_;
positionDetails[mintCounter].clearingFirm = clearingFirm_;
positionDetails[mintCounter].accountNumber = accountNumber_;
hashMap[hashMapKey] = mintCounter;
_ownedTokenIds[to].push(mintCounter);
_safeMint(to, mintCounter);
}
function addTrade(
address owner_,
string memory symbol_,
string memory exchange_,
string memory clearingFirm_,
string memory accountNumber_,
TradeDetails memory tradeDetails_
) external onlyAdmins {
if (balanceOf(owner_) == 0) {
mint(owner_, symbol_, exchange_, clearingFirm_, accountNumber_, tradeDetails_);
return;
}
(bool isPositionAvailable, bool isTradeIdAvailable, uint tokenId) = tradeIdExists(
owner_,
symbol_,
clearingFirm_,
accountNumber_,
tradeDetails_.tradeId
);
if (!isTradeIdAvailable && tokenId != 0) {
positionDetails[tokenId].trades.push(
TradeDetails({
tradeId: tradeDetails_.tradeId,
isLong: tradeDetails_.isLong,
quantity: tradeDetails_.quantity,
purchasePrice: tradeDetails_.purchasePrice,
tradeTime: tradeDetails_.tradeTime
})
);
return;
}
if (!isPositionAvailable) {
mint(owner_, symbol_, exchange_, clearingFirm_, accountNumber_, tradeDetails_);
}
}
function deleteTrade(
address owner_,
string memory tradeId_,
string memory symbol_,
string memory clearingFirm_,
string memory accountNumber_
) external onlyAdmins {
(bool isPositionAvailable, bool isTradeIdAvailable, uint tokenId) = tradeIdExists(
owner_,
symbol_,
clearingFirm_,
accountNumber_,
tradeId_
);
require(isPositionAvailable && isTradeIdAvailable, "Trade doesn't exist");
PositionDetails memory positionDetail = positionDetails[tokenId];
uint length = positionDetail.trades.length;
if (positionDetail.trades.length == 1) {
expirePosition(tokenId);
bytes32 hashMapKey = keccak256(abi.encodePacked(clearingFirm_, accountNumber_, symbol_));
hashMap[hashMapKey] = 0;
} else {
(, uint index) = _tradeIdExists(tokenId, tradeId_);
positionDetails[tokenId].trades[index] = positionDetails[tokenId].trades[length - 1];
positionDetails[tokenId].trades.pop();
}
}
function expirePosition(uint tokenId_) public onlyAdmins {
PositionDetails memory positionDetail = positionDetails[tokenId_];
address tokenOwner = _ownerOf[tokenId_];
int totalQuantity;
for (uint i = 0; i < positionDetail.trades.length; ) {
if (positionDetail.trades[i].isLong) {
totalQuantity += int(positionDetail.trades[i].quantity);
} else {
totalQuantity -= int(positionDetail.trades[i].quantity);
}
unchecked {
++i;
}
}
burn(tokenId_);
delete positionDetails[tokenId_];
bool isLong = totalQuantity >= 0;
uint positiveTotalQuantity;
if (isLong) {
positiveTotalQuantity = uint(totalQuantity);
} else {
positiveTotalQuantity = MAX_UINT - uint(totalQuantity) + 1;
}
emit PositionExpired(tokenOwner, tokenId_, positiveTotalQuantity, isLong);
}
function burn(uint tokenId_) internal {
address tokenOwner = _ownerOf[tokenId_];
uint length = _ownedTokenIds[tokenOwner].length;
_burn(tokenId_);
for (uint i = 0; i < length; ) {
if (tokenId_ == _ownedTokenIds[tokenOwner][i]) {
_ownedTokenIds[tokenOwner][i] = _ownedTokenIds[tokenOwner][length - 1];
_ownedTokenIds[tokenOwner].pop();
break;
}
unchecked {
++i;
}
}
}
function transferFrom(address from, address to, uint id) public override onlyAllowedOperator(from) {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
isAdmin[msg.sender] || msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
"NOT AUTHORIZED"
);
unchecked {
_balanceOf[from]--;
_balanceOf[to]++;
}
_ownerOf[id] = to;
uint length = _ownedTokenIds[from].length;
for (uint i = 0; i < length; ) {
if (id == _ownedTokenIds[from][i]) {
_ownedTokenIds[from][i] = _ownedTokenIds[from][length - 1];
_ownedTokenIds[from].pop();
break;
}
unchecked {
++i;
}
}
_ownedTokenIds[to].push(id);
delete getApproved[id];
emit Transfer(from, to, id);
}
/// @dev Returns isPositionAvailable, isTradeIdAvailable, tokenId
function tradeIdExists(
address owner_,
string memory symbol_,
string memory clearingFirm_,
string memory accountNumber_,
string memory tradeId_
) public view returns (bool, bool, uint256) {
uint tokenId = getTokenId(clearingFirm_, accountNumber_, symbol_);
// Check tokenId exists and correct owner
if (tokenId > 0 && ownerOf(tokenId) == owner_) {
(bool _exist, ) = _tradeIdExists(tokenId, tradeId_);
return (true, _exist, tokenId);
} else {
return (false, false, 0);
}
}
function _tradeIdExists(uint tokenId_, string memory tradeId_) internal view returns (bool, uint) {
PositionDetails memory positionDetail = positionDetails[tokenId_];
for (uint j = 0; j < positionDetail.trades.length; ) {
if (stringCompare(positionDetail.trades[j].tradeId, tradeId_)) {
return (true, j);
}
unchecked {
++j;
}
}
return (false, 0);
}
function getOwnerPositions(address target) public view returns (PositionDetails[] memory) {
uint length = _ownedTokenIds[target].length;
PositionDetails[] memory result = new PositionDetails[](length);
for (uint i = 0; i < length; ++i) {
result[i] = positionDetails[_ownedTokenIds[target][i]];
}
return result;
}
function getOwnerTokenIds(address target) public view returns (uint256[] memory) {
return _ownedTokenIds[target];
}
function getTokenId(
string memory clearingFirm_,
string memory accountNumber_,
string memory symbol_
) public view returns (uint) {
bytes32 hashMapKey = keccak256(abi.encodePacked(clearingFirm_, accountNumber_, symbol_));
return hashMap[hashMapKey];
}
function safeTransferFrom(address from, address to, uint id) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint id,
bytes calldata data
) public override onlyAllowedOperator(from) {
super.safeTransferFrom(from, to, id, data);
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return super.supportsInterface(interfaceId);
}
function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
super.setApprovalForAll(operator, approved);
}
function approve(address operator, uint tokenId) public override onlyAllowedOperatorApproval(operator) {
super.approve(operator, tokenId);
}
function stringCompare(string memory str1, string memory str2) internal pure returns (bool) {
if (bytes(str1).length != bytes(str2).length) {
return false;
}
return keccak256(abi.encodePacked(str1)) == keccak256(abi.encodePacked(str2));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* 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}.
*
* 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 default value returned by this function, unless
* it's 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;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_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;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_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;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_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 {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.16;
import "@openzeppelin/contracts/utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableAdmins {
mapping(address => bool) public isAdmin;
address public owner;
event AdminAdded(address indexed newAdmin);
event AdminRemoved(address indexed oldAdmin);
event OwnerChanged(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
isAdmin[msg.sender] = true;
owner = msg.sender;
}
modifier onlyAdmins() {
require(isAdmin[msg.sender], "Caller is not Admin");
_;
}
modifier onlyOwner() {
require(owner == msg.sender, "Caller is not Owner");
_;
}
function removeAdmin(address oldAdmin_) public virtual onlyOwner {
require(isAdmin[oldAdmin_], "This address is not admin");
isAdmin[oldAdmin_] = false;
emit AdminRemoved(oldAdmin_);
}
function addAdmin(address newAdmin_) public virtual onlyOwner {
require(!isAdmin[newAdmin_], "This address is already have admin role");
isAdmin[newAdmin_] = true;
emit AdminAdded(newAdmin_);
}
function transferOwnership(address newOwner_) public virtual onlyOwner {
require(owner != newOwner_, "New owner address is current owner");
address prevOwner = owner;
// Revoke admin role from prev owner
isAdmin[owner] = false;
// Assign admin role to new owner
isAdmin[newOwner_] = true;
owner = newOwner_;
emit OwnerChanged(prevOwner, newOwner_);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {OperatorFilterer} from "./OperatorFilterer.sol";
import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol";
/**
* @title DefaultOperatorFilterer
* @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
* @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide
* administration methods on the contract itself to interact with the registry otherwise the subscription
* will be locked to the options set during construction.
*/
abstract contract DefaultOperatorFilterer is OperatorFilterer {
/// @dev The constructor that is called when the contract is being deployed.
constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
interface IOperatorFilterRegistry {
/**
* @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
* true if supplied registrant address is not registered.
*/
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
/**
* @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
*/
function register(address registrant) external;
/**
* @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
*/
function registerAndSubscribe(address registrant, address subscription) external;
/**
* @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
* address without subscribing.
*/
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
/**
* @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
* Note that this does not remove any filtered addresses or codeHashes.
* Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
*/
function unregister(address addr) external;
/**
* @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
*/
function updateOperator(address registrant, address operator, bool filtered) external;
/**
* @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
*/
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
/**
* @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
*/
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
/**
* @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
*/
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
/**
* @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
* subscription if present.
* Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
* subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
* used.
*/
function subscribe(address registrant, address registrantToSubscribe) external;
/**
* @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
*/
function unsubscribe(address registrant, bool copyExistingEntries) external;
/**
* @notice Get the subscription address of a given registrant, if any.
*/
function subscriptionOf(address addr) external returns (address registrant);
/**
* @notice Get the set of addresses subscribed to a given registrant.
* Note that order is not guaranteed as updates are made.
*/
function subscribers(address registrant) external returns (address[] memory);
/**
* @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
* Note that order is not guaranteed as updates are made.
*/
function subscriberAt(address registrant, uint256 index) external returns (address);
/**
* @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
*/
function copyEntriesOf(address registrant, address registrantToCopy) external;
/**
* @notice Returns true if operator is filtered by a given address or its subscription.
*/
function isOperatorFiltered(address registrant, address operator) external returns (bool);
/**
* @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
*/
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
/**
* @notice Returns true if a codeHash is filtered by a given address or its subscription.
*/
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
/**
* @notice Returns a list of filtered operators for a given address or its subscription.
*/
function filteredOperators(address addr) external returns (address[] memory);
/**
* @notice Returns the set of filtered codeHashes for a given address or its subscription.
* Note that order is not guaranteed as updates are made.
*/
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
/**
* @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
* its subscription.
* Note that order is not guaranteed as updates are made.
*/
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
/**
* @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
* its subscription.
* Note that order is not guaranteed as updates are made.
*/
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
/**
* @notice Returns true if an address has registered
*/
function isRegistered(address addr) external returns (bool);
/**
* @dev Convenience method to compute the code hash of an arbitrary contract
*/
function codeHashOf(address addr) external returns (bytes32);
}// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol";
/**
* @title OperatorFilterer
* @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
* registrant's entries in the OperatorFilterRegistry.
* @dev This smart contract is meant to be inherited by token contracts so they can use the following:
* - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
* - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
* Please note that if your token contract does not provide an owner with EIP-173, it must provide
* administration methods on the contract itself to interact with the registry otherwise the subscription
* will be locked to the options set during construction.
*/
abstract contract OperatorFilterer {
/// @dev Emitted when an operator is not allowed.
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);
/// @dev The constructor that is called when the contract is being deployed.
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
} else {
if (subscriptionOrRegistrantToCopy != address(0)) {
OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
} else {
OPERATOR_FILTER_REGISTRY.register(address(this));
}
}
}
}
/**
* @dev A helper function to check if an operator is allowed.
*/
modifier onlyAllowedOperator(address from) virtual {
// Allow spending tokens from addresses with balance
// Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
// from an EOA.
if (from != msg.sender) {
_checkFilterOperator(msg.sender);
}
_;
}
/**
* @dev A helper function to check if an operator approval is allowed.
*/
modifier onlyAllowedOperatorApproval(address operator) virtual {
_checkFilterOperator(operator);
_;
}
/**
* @dev A helper function to check if an operator is allowed.
*/
function _checkFilterOperator(address operator) internal view virtual {
// Check registry code length to facilitate testing in environments without a deployed registry.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
// under normal circumstances, this function will revert rather than return false, but inheriting contracts
// may specify their own OperatorFilterRegistry implementations, which may behave differently
if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
revert OperatorNotAllowed(operator);
}
}
}
}// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE/LOGIC
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
function tokenURI(uint256 id) public view virtual returns (string memory);
/*//////////////////////////////////////////////////////////////
ERC721 BALANCE/OWNER STORAGE
//////////////////////////////////////////////////////////////*/
mapping(uint256 => address) internal _ownerOf;
mapping(address => uint256) internal _balanceOf;
function ownerOf(uint256 id) public view virtual returns (address owner) {
require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
}
function balanceOf(address owner) public view virtual returns (uint256) {
require(owner != address(0), "ZERO_ADDRESS");
return _balanceOf[owner];
}
/*//////////////////////////////////////////////////////////////
ERC721 APPROVAL STORAGE
//////////////////////////////////////////////////////////////*/
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
/*//////////////////////////////////////////////////////////////
ERC721 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 id) public virtual {
address owner = _ownerOf[id];
require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
getApproved[id] = spender;
emit Approval(owner, spender, id);
}
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
"NOT_AUTHORIZED"
);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
unchecked {
_balanceOf[from]--;
_balanceOf[to]++;
}
_ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes calldata data
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
/*//////////////////////////////////////////////////////////////
ERC165 LOGIC
//////////////////////////////////////////////////////////////*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 id) internal virtual {
require(to != address(0), "INVALID_RECIPIENT");
require(_ownerOf[id] == address(0), "ALREADY_MINTED");
// Counter overflow is incredibly unrealistic.
unchecked {
_balanceOf[to]++;
}
_ownerOf[id] = to;
emit Transfer(address(0), to, id);
}
function _burn(uint256 id) internal virtual {
address owner = _ownerOf[id];
require(owner != address(0), "NOT_MINTED");
// Ownership check above ensures no underflow.
unchecked {
_balanceOf[owner]--;
}
delete _ownerOf[id];
delete getApproved[id];
emit Transfer(owner, address(0), id);
}
/*//////////////////////////////////////////////////////////////
INTERNAL SAFE MINT LOGIC
//////////////////////////////////////////////////////////////*/
function _safeMint(address to, uint256 id) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _safeMint(
address to,
uint256 id,
bytes memory data
) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
}
/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
}{
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"optimizer": {
"enabled": true,
"runs": 20
},
"libraries": {}
}Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_tURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalQuantity","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"}],"name":"PositionExpired","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin_","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"exchange_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails","name":"tradeDetails_","type":"tuple"}],"name":"addTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":"address","name":"owner_","type":"address"},{"internalType":"string","name":"tradeId_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"}],"name":"deleteTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"expirePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getOwnerPositions","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"exchange","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails[]","name":"trades","type":"tuple[]"},{"internalType":"string","name":"clearingFirm","type":"string"},{"internalType":"string","name":"accountNumber","type":"string"}],"internalType":"struct StrandsPosition.PositionDetails[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getOwnerTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPositionDetails","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"exchange","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails[]","name":"trades","type":"tuple[]"},{"internalType":"string","name":"clearingFirm","type":"string"},{"internalType":"string","name":"accountNumber","type":"string"}],"internalType":"struct StrandsPosition.PositionDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"exchange_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails","name":"tradeDetails_","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oldAdmin_","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tURI","type":"string"}],"name":"setTokenURI","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":"owner_","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"internalType":"string","name":"tradeId_","type":"string"}],"name":"tradeIdExists","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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
60806040526000196008553480156200001757600080fd5b50604051620043af380380620043af8339810160408190526200003a91620002c4565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600184846000620000618382620003e4565b506001620000708282620003e4565b5050506daaeb6d7670e522a718067333cd4e3b15620001b85780156200010657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000e757600080fd5b505af1158015620000fc573d6000803e3d6000fd5b50505050620001b8565b6001600160a01b03821615620001575760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000cc565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200019e57600080fd5b505af1158015620001b3573d6000803e3d6000fd5b505050505b5050336000818152600660205260409020805460ff19166001179055600780546001600160a01b0319169091179055600a620001f58282620003e4565b50505050620004b0565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200022757600080fd5b81516001600160401b0380821115620002445762000244620001ff565b604051601f8301601f19908116603f011681019082821181831017156200026f576200026f620001ff565b816040528381526020925086838588010111156200028c57600080fd5b600091505b83821015620002b0578582018301518183018401529082019062000291565b600093810190920192909252949350505050565b600080600060608486031215620002da57600080fd5b83516001600160401b0380821115620002f257600080fd5b620003008783880162000215565b945060208601519150808211156200031757600080fd5b620003258783880162000215565b935060408601519150808211156200033c57600080fd5b506200034b8682870162000215565b9150509250925092565b600181811c908216806200036a57607f821691505b6020821081036200038b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003df57600081815260208120601f850160051c81016020861015620003ba5750805b601f850160051c820191505b81811015620003db57828155600101620003c6565b5050505b505050565b81516001600160401b03811115620004005762000400620001ff565b620004188162000411845462000355565b8462000391565b602080601f831160018114620004505760008415620004375750858301515b600019600386901b1c1916600185901b178555620003db565b600085815260208120601f198616915b82811015620004815788860151825594840194600190910190840162000460565b5085821015620004a05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b613eef80620004c06000396000f3fe608060405234801561001057600080fd5b506004361061016a5760003560e01c806301ffc9a71461016f57806306fdde0314610197578063081812fc146101ac578063095ea7b3146101e2578063162094c4146101f757806316bbbe731461020a5780631785f53c1461021d57806323b872dd1461023057806324d7806c1461024357806341f434341461026657806342842e0e1461027b57806346aa52ce1461028e5780636352211e146102a55780636e0bc23b146102b857806370480275146102cb57806370a08231146102de5780638389abf4146102f1578063845e1259146103045780638da5cb5b146103245780638fd62d4b1461033757806395d89b411461034a5780639ecceb5e14610352578063a22cb46514610372578063b75103c314610385578063b88d4fde14610398578063c87b56dd146103ab578063e3291be5146103be578063e66b6000146103ee578063e985e9c51461040e578063f2fde38b1461043c575b600080fd5b61018261017d366004613207565b61044f565b60405190151581526020015b60405180910390f35b61019f610460565b60405161018e919061327b565b6101d56101ba36600461328e565b6004602052600090815260409020546001600160a01b031681565b60405161018e91906132a7565b6101f56101f03660046132d2565b6104ee565b005b6101f561020536600461339e565b610507565b6101f56102183660046133e4565b6105b4565b6101f561022b3660046134a1565b610b65565b6101f561023e3660046134bc565b610c3c565b6101826102513660046134a1565b60066020526000908152604090205460ff1681565b6101d56daaeb6d7670e522a718067333cd4e81565b6101f56102893660046134bc565b610f56565b61029760095481565b60405190815260200161018e565b6101d56102b336600461328e565b610f81565b6101f56102c636600461359d565b610fbb565b6101f56102d93660046134a1565b611109565b6102976102ec3660046134a1565b6111f8565b6101f56102ff36600461328e565b61125b565b6103176103123660046134a1565b6117b5565b60405161018e9190613778565b6007546101d5906001600160a01b031681565b6101f561034536600461359d565b611c25565b61019f611e5f565b61036561036036600461328e565b611e6c565b60405161018e91906137da565b6101f56103803660046137ed565b6121ff565b610297610393366004613824565b612213565b6101f56103a63660046138ab565b612259565b61019f6103b936600461328e565b612280565b6103d16103cc3660046133e4565b61237f565b60408051931515845291151560208401529082015260600161018e565b6104016103fc3660046134a1565b6123f5565b60405161018e9190613945565b61018261041c366004613989565b600560209081526000928352604080842090915290825290205460ff1681565b6101f561044a3660046134a1565b612460565b600061045a8261256e565b92915050565b6000805461046d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610499906139bc565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b505050505081565b816104f8816125bc565b610502838361266f565b505050565b3360009081526006602052604090205460ff1661053f5760405162461bcd60e51b8152600401610536906139f6565b60405180910390fd5b600954158061055057506009548211155b6105a85760405162461bcd60e51b815260206004820152602360248201527f63616e2774207365742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a6105028282613a7e565b3360009081526006602052604090205460ff166105e35760405162461bcd60e51b8152600401610536906139f6565b60008060006105f5888787878b61237f565b9250925092508280156106055750815b6106475760405162461bcd60e51b8152602060048201526013602482015272151c98591948191bd95cdb89dd08195e1a5cdd606a1b6044820152606401610536565b6000818152600b6020526040808220815160a0810190925280548290829061066e906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906139bc565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b50505050508152602001600182018054610700906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461072c906139bc565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561089e57838290600052602060002090600502016040518060a00160405290816000820180546107da906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610806906139bc565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016107a7565b5050505081526020016003820180546108b6906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906139bc565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b50505050508152602001600482018054610948906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906139bc565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050919092525050506040810151519091506001819003610a28576109e68361125b565b600087878a6040516020016109fd93929190613b37565b60408051601f1981840301815291815281516020928301206000908152600d90925281205550610b59565b6000610a34848b612751565b6000868152600b602052604090209092506002019050610a55600184613b90565b81548110610a6557610a65613ba3565b9060005260206000209060050201600b60008681526020019081526020016000206002018281548110610a9a57610a9a613ba3565b6000918252602090912060059091020180610ab58382613bb9565b50600182810154908201805460ff191660ff9092161515919091179055600280830154818301556003808401549083015560049283015492909101919091556000858152600b6020526040902001805480610b1257610b12613c85565b60008281526020812060001990920191600583020190610b328282613110565b5060018101805460ff19169055600060028201819055600382018190556004909101559055505b50505050505050505050565b6007546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16610bf35760405162461bcd60e51b81526020600482015260196024820152782a3434b99030b2323932b9b99034b9903737ba1030b236b4b760391b6044820152606401610536565b6001600160a01b038116600081815260066020526040808220805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9190a250565b826001600160a01b0381163314610c5657610c56336125bc565b6000828152600260205260409020546001600160a01b03858116911614610cac5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610536565b6001600160a01b038316610cd25760405162461bcd60e51b815260040161053690613cc8565b3360009081526006602052604090205460ff1680610cf85750336001600160a01b038516145b80610d2657506001600160a01b038416600090815260056020908152604080832033845290915290205460ff165b80610d4757506000828152600460205260409020546001600160a01b031633145b610d845760405162461bcd60e51b815260206004820152600e60248201526d1393d5081055551213d49256915160921b6044820152606401610536565b6001600160a01b0380851660008181526003602090815260408083208054600019019055938716808352848320805460010190558683526002825284832080546001600160a01b0319169091179055918152600c90915290812054905b81811015610ef0576001600160a01b0386166000908152600c60205260409020805482908110610e1357610e13613ba3565b90600052602060002001548403610ee8576001600160a01b0386166000908152600c60205260409020610e47600184613b90565b81548110610e5757610e57613ba3565b9060005260206000200154600c6000886001600160a01b03166001600160a01b031681526020019081526020016000208281548110610e9857610e98613ba3565b60009182526020808320909101929092556001600160a01b0388168152600c90915260409020805480610ecd57610ecd613c85565b60019003818190600052602060002001600090559055610ef0565b600101610de1565b506001600160a01b038085166000818152600c60209081526040808320805460018101825590845282842001889055878352600490915280822080546001600160a01b0319169055518693891691600080516020613e9a83398151915291a45050505050565b826001600160a01b0381163314610f7057610f70336125bc565b610f7b848484612b48565b50505050565b6000818152600260205260409020546001600160a01b031680610fb65760405162461bcd60e51b815260040161053690613cf3565b919050565b3360009081526006602052604090205460ff16610fea5760405162461bcd60e51b8152600401610536906139f6565b610ff3866111f8565b60000361100d57611008868686868686611c25565b611101565b600080600061102389898888886000015161237f565b9250925092508115801561103657508015155b156110ea576000818152600b60209081526040808320815160a08101835288518152888401511515818501528883015192810192909252606080890151908301526080808901519083015260020180546001810182559084529190922082516005909202019081906110a89082613a7e565b50602082015160018201805460ff1916911515919091179055604082015160028201556060820151600382015560809091015160049091015550611101915050565b826110fd576110fd898989898989611c25565b5050505b505050505050565b6007546001600160a01b031633146111335760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16156111ac5760405162461bcd60e51b815260206004820152602760248201527f54686973206164647265737320697320616c726561647920686176652061646d604482015266696e20726f6c6560c81b6064820152608401610536565b6001600160a01b038116600081815260066020526040808220805460ff19166001179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399190a250565b60006001600160a01b03821661123f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610536565b506001600160a01b031660009081526003602052604090205490565b3360009081526006602052604090205460ff1661128a5760405162461bcd60e51b8152600401610536906139f6565b6000818152600b6020526040808220815160a081019092528054829082906112b1906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd906139bc565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b50505050508152602001600182018054611343906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461136f906139bc565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156114e157838290600052602060002090600502016040518060a001604052908160008201805461141d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611449906139bc565b80156114965780601f1061146b57610100808354040283529160200191611496565b820191906000526020600020905b81548152906001019060200180831161147957829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016113ea565b5050505081526020016003820180546114f9906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611525906139bc565b80156115725780601f1061154757610100808354040283529160200191611572565b820191906000526020600020905b81548152906001019060200180831161155557829003601f168201915b5050505050815260200160048201805461158b906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546115b7906139bc565b80156116045780601f106115d957610100808354040283529160200191611604565b820191906000526020600020905b8154815290600101906020018083116115e757829003601f168201915b505050919092525050506000838152600260205260408120549192506001600160a01b0390911690805b8360400151518110156116ce578360400151818151811061165157611651613ba3565b60200260200101516020015115611696578360400151818151811061167857611678613ba3565b6020026020010151604001518261168f9190613d17565b91506116c6565b836040015181815181106116ac576116ac613ba3565b602002602001015160400151826116c39190613d3f565b91505b60010161162e565b506116d884612c02565b6000848152600b60205260408120906116f18282613110565b6116ff600183016000613110565b61170d60028301600061314a565b61171b600383016000613110565b611729600483016000613110565b505060008082128015919061173f57508161175b565b8260085461174d9190613b90565b611758906001613d66565b90505b604080516001600160a01b03861681526020810188905290810182905282151560608201527f7dba56ccd98cbec1ed180696d405fbeebef14cd975e25cf9f3d6920c3b5bbfc19060800160405180910390a1505050505050565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b038111156117e9576117e96132fc565b60405190808252806020026020018201604052801561182257816020015b61180f61316b565b8152602001906001900390816118075790505b50905060005b82811015611c1d576001600160a01b0385166000908152600c602052604081208054600b9291908490811061185f5761185f613ba3565b906000526020600020015481526020019081526020016000206040518060a0016040529081600082018054611893906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf906139bc565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b50505050508152602001600182018054611925906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611951906139bc565b801561199e5780601f106119735761010080835404028352916020019161199e565b820191906000526020600020905b81548152906001019060200180831161198157829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611ac357838290600052602060002090600502016040518060a00160405290816000820180546119ff906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2b906139bc565b8015611a785780601f10611a4d57610100808354040283529160200191611a78565b820191906000526020600020905b815481529060010190602001808311611a5b57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016119cc565b505050508152602001600382018054611adb906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b07906139bc565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b50505050508152602001600482018054611b6d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b99906139bc565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b505050505081525050828281518110611c0157611c01613ba3565b602002602001018190525080611c1690613d79565b9050611828565b509392505050565b3360009081526006602052604090205460ff16611c545760405162461bcd60e51b8152600401610536906139f6565b6000838387604051602001611c6b93929190613b37565b60408051601f1981840301815291815281516020928301206000818152600d90935291205490915015611cd55760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b6044820152606401610536565b600160096000828254611ce89190613d66565b90915550506009546000908152600b60209081526040808320815160a0810183528651815286840151151581850152868301519281019290925260608087015190830152608080870151908301526002018054600181018255908452919092208251600590920201908190611d5d9082613a7e565b5060208281015160018301805460ff19169115159190911790556040808401516002840155606084015160038401556080909301516004909201919091556009546000908152600b90915220611db38782613a7e565b506009546000908152600b60205260409020600101611dd28682613a7e565b506009546000908152600b60205260409020600301611df18582613a7e565b506009546000908152600b60205260409020600401611e108482613a7e565b50600980546000838152600d602090815260408083208490556001600160a01b038c168352600c8252822080546001810182559083529120015554611e56908890612d44565b50505050505050565b6001805461046d906139bc565b611e7461316b565b6000828152600b602052604090819020815160a08101909252805482908290611e9c906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec8906139bc565b8015611f155780601f10611eea57610100808354040283529160200191611f15565b820191906000526020600020905b815481529060010190602001808311611ef857829003601f168201915b50505050508152602001600182018054611f2e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5a906139bc565b8015611fa75780601f10611f7c57610100808354040283529160200191611fa7565b820191906000526020600020905b815481529060010190602001808311611f8a57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156120cc57838290600052602060002090600502016040518060a0016040529081600082018054612008906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612034906139bc565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b505050918352505060018281015460ff161515602080840191909152600284015460408401526003840154606084015260049093015460809092019190915291835292019101611fd5565b5050505081526020016003820180546120e4906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612110906139bc565b801561215d5780601f106121325761010080835404028352916020019161215d565b820191906000526020600020905b81548152906001019060200180831161214057829003601f168201915b50505050508152602001600482018054612176906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546121a2906139bc565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b5050505050815250509050919050565b81612209816125bc565b6105028383612e02565b60008084848460405160200161222b93929190613b37565b60408051808303601f1901815291815281516020928301206000908152600d90925290205495945050505050565b846001600160a01b038116331461227357612273336125bc565b6111018686868686612e6e565b60606009546000148061229557506009548211155b6122ed5760405162461bcd60e51b815260206004820152602360248201527f63616e2774206765742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a80546122fa906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612326906139bc565b80156123735780601f1061234857610100808354040283529160200191612373565b820191906000526020600020905b81548152906001019060200180831161235657829003601f168201915b50505050509050919050565b60008060008061239087878a612213565b90506000811180156123bb5750886001600160a01b03166123b082610f81565b6001600160a01b0316145b156123dd5760006123cc8287612751565b506001955093509091506123ea9050565b6000806000935093509350505b955095509592505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561237357602002820191906000526020600020905b8154815260200190600101908083116124415750505050509050919050565b6007546001600160a01b0316331461248a5760405162461bcd60e51b815260040161053690613c9b565b6007546001600160a01b038083169116036124f25760405162461bcd60e51b815260206004820152602260248201527f4e6577206f776e657220616464726573732069732063757272656e74206f776e60448201526132b960f11b6064820152608401610536565b600780546001600160a01b03908116600081815260066020526040808220805460ff19908116909155938616808352818320805490951660011790945584546001600160a01b03191684179094559251909283917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9190a35050565b60006301ffc9a760e01b6001600160e01b03198316148061259f57506380ac58cd60e01b6001600160e01b03198316145b8061045a5750506001600160e01b031916635b5e139f60e01b1490565b6daaeb6d7670e522a718067333cd4e3b1561266c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264d9190613d92565b61266c5780604051633b79c77360e21b815260040161053691906132a7565b50565b6000818152600260205260409020546001600160a01b0316338114806126b857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6126f55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610536565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000806000600b60008681526020019081526020016000206040518060a0016040529081600082018054612784906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546127b0906139bc565b80156127fd5780601f106127d2576101008083540402835291602001916127fd565b820191906000526020600020905b8154815290600101906020018083116127e057829003601f168201915b50505050508152602001600182018054612816906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612842906139bc565b801561288f5780601f106128645761010080835404028352916020019161288f565b820191906000526020600020905b81548152906001019060200180831161287257829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156129b457838290600052602060002090600502016040518060a00160405290816000820180546128f0906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461291c906139bc565b80156129695780601f1061293e57610100808354040283529160200191612969565b820191906000526020600020905b81548152906001019060200180831161294c57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016128bd565b5050505081526020016003820180546129cc906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546129f8906139bc565b8015612a455780601f10612a1a57610100808354040283529160200191612a45565b820191906000526020600020905b815481529060010190602001808311612a2857829003601f168201915b50505050508152602001600482018054612a5e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8a906139bc565b8015612ad75780601f10612aac57610100808354040283529160200191612ad7565b820191906000526020600020905b815481529060010190602001808311612aba57829003601f168201915b505050505081525050905060005b816040015151811015612b3757612b1d82604001518281518110612b0b57612b0b613ba3565b60200260200101516000015186612f33565b15612b2f57600193509150612b419050565b600101612ae5565b5060008092509250505b9250929050565b612b53838383610c3c565b6001600160a01b0382163b1580612be65750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612b9790339088908790600401613daf565b6020604051808303816000875af1158015612bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bda9190613de2565b6001600160e01b031916145b6105025760405162461bcd60e51b815260040161053690613dff565b6000818152600260209081526040808320546001600160a01b0316808452600c90925290912054612c3283612f9d565b60005b81811015610f7b576001600160a01b0383166000908152600c60205260409020805482908110612c6757612c67613ba3565b90600052602060002001548403612d3c576001600160a01b0383166000908152600c60205260409020612c9b600184613b90565b81548110612cab57612cab613ba3565b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110612cec57612cec613ba3565b60009182526020808320909101929092556001600160a01b0385168152600c90915260409020805480612d2157612d21613c85565b60019003818190600052602060002001600090559055610f7b565b600101612c35565b612d4e828261303b565b6001600160a01b0382163b1580612de25750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612d939033906000908790600401613daf565b6020604051808303816000875af1158015612db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd69190613de2565b6001600160e01b031916145b612dfe5760405162461bcd60e51b815260040161053690613dff565b5050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612e79858585610c3c565b6001600160a01b0384163b1580612f105750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290612ec19033908a90899089908990600401613e29565b6020604051808303816000875af1158015612ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f049190613de2565b6001600160e01b031916145b612f2c5760405162461bcd60e51b815260040161053690613dff565b5050505050565b60008151835114612f465750600061045a565b81604051602001612f579190613e7d565b6040516020818303038152906040528051906020012083604051602001612f7e9190613e7d565b6040516020818303038152906040528051906020012014905092915050565b6000818152600260205260409020546001600160a01b031680612fd25760405162461bcd60e51b815260040161053690613cf3565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b03199081169091556004909252808320805490921690915551849290600080516020613e9a833981519152908390a45050565b6001600160a01b0382166130615760405162461bcd60e51b815260040161053690613cc8565b6000818152600260205260409020546001600160a01b0316156130b75760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610536565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020613e9a833981519152908290a45050565b50805461311c906139bc565b6000825580601f1061312c575050565b601f01602090049060005260206000209081019061266c919061319a565b508054600082556005029060005260206000209081019061266c91906131b3565b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b5b808211156131af576000815560010161319b565b5090565b808211156131af5760006131c78282613110565b5060018101805460ff191690556000600282018190556003820181905560048201556005016131b3565b6001600160e01b03198116811461266c57600080fd5b60006020828403121561321957600080fd5b8135613224816131f1565b9392505050565b60005b8381101561324657818101518382015260200161322e565b50506000910152565b6000815180845261326781602086016020860161322b565b601f01601f19169290920160200192915050565b602081526000613224602083018461324f565b6000602082840312156132a057600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114610fb657600080fd5b600080604083850312156132e557600080fd5b6132ee836132bb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261332357600080fd5b81356001600160401b038082111561333d5761333d6132fc565b604051601f8301601f19908116603f01168101908282118183101715613365576133656132fc565b8160405283815286602085880101111561337e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156133b157600080fd5b8235915060208301356001600160401b038111156133ce57600080fd5b6133da85828601613312565b9150509250929050565b600080600080600060a086880312156133fc57600080fd5b613405866132bb565b945060208601356001600160401b038082111561342157600080fd5b61342d89838a01613312565b9550604088013591508082111561344357600080fd5b61344f89838a01613312565b9450606088013591508082111561346557600080fd5b61347189838a01613312565b9350608088013591508082111561348757600080fd5b5061349488828901613312565b9150509295509295909350565b6000602082840312156134b357600080fd5b613224826132bb565b6000806000606084860312156134d157600080fd5b6134da846132bb565b92506134e8602085016132bb565b9150604084013590509250925092565b801515811461266c57600080fd5b600060a0828403121561351857600080fd5b60405160a081016001600160401b03828210818311171561353b5761353b6132fc565b81604052829350843591508082111561355357600080fd5b5061356085828601613312565b8252506020830135613571816134f8565b806020830152506040830135604082015260608301356060820152608083013560808201525092915050565b60008060008060008060c087890312156135b657600080fd5b6135bf876132bb565b955060208701356001600160401b03808211156135db57600080fd5b6135e78a838b01613312565b965060408901359150808211156135fd57600080fd5b6136098a838b01613312565b9550606089013591508082111561361f57600080fd5b61362b8a838b01613312565b9450608089013591508082111561364157600080fd5b61364d8a838b01613312565b935060a089013591508082111561366357600080fd5b5061367089828a01613506565b9150509295509295509295565b600060a082518185526136928286018261324f565b9050602080850151868303828801526136ab838261324f565b925050604080860151878403828901528381518086528486019150848160051b870101858401935060005b8281101561373557878203601f19018452845180518a84526136fa8b85018261324f565b828a01511515858b015288830151898601526060808401519086015260809283015192909401919091525093860193928601926001016136d6565b5060608a015197508a810360608c015261374f818961324f565b9750505050505050506080830151848203608086015261376f828261324f565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156137cd57603f198886030184526137bb85835161367d565b9450928501929085019060010161379f565b5092979650505050505050565b602081526000613224602083018461367d565b6000806040838503121561380057600080fd5b613809836132bb565b91506020830135613819816134f8565b809150509250929050565b60008060006060848603121561383957600080fd5b83356001600160401b038082111561385057600080fd5b61385c87838801613312565b9450602086013591508082111561387257600080fd5b61387e87838801613312565b9350604086013591508082111561389457600080fd5b506138a186828701613312565b9150509250925092565b6000806000806000608086880312156138c357600080fd5b6138cc866132bb565b94506138da602087016132bb565b93506040860135925060608601356001600160401b03808211156138fd57600080fd5b818801915088601f83011261391157600080fd5b81358181111561392057600080fd5b89602082850101111561393257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561397d57835183529284019291840191600101613961565b50909695505050505050565b6000806040838503121561399c57600080fd5b6139a5836132bb565b91506139b3602084016132bb565b90509250929050565b600181811c908216806139d057607f821691505b6020821081036139f057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1020b236b4b760691b604082015260600190565b601f82111561050257600081815260208120601f850160051c81016020861015613a4a5750805b601f850160051c820191505b8181101561110157828155600101613a56565b600019600383901b1c191660019190911b1790565b81516001600160401b03811115613a9757613a976132fc565b613aab81613aa584546139bc565b84613a23565b602080601f831160018114613ada5760008415613ac85750858301515b613ad28582613a69565b865550611101565b600085815260208120601f198616915b82811015613b0957888601518255948401946001909101908401613aea565b5085821015613b275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008451613b4981846020890161322b565b845190830190613b5d81836020890161322b565b8451910190613b7081836020880161322b565b0195945050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561045a5761045a613b7a565b634e487b7160e01b600052603260045260246000fd5b818103613bc4575050565b613bce82546139bc565b6001600160401b03811115613be557613be56132fc565b613bf381613aa584546139bc565b6000601f821160018114613c215760008315613c0f5750848201545b613c198482613a69565b855550612f2c565b600085815260209020601f19841690600086815260209020845b83811015613c5b5782860154825560019586019590910190602001613c3b565b5085831015613b275793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1027bbb732b960691b604082015260600190565b6020808252601190820152701253959053125117d49150d25412515395607a1b604082015260600190565b6020808252600a90820152691393d517d3525395115160b21b604082015260600190565b8082018281126000831280158216821582161715613d3757613d37613b7a565b505092915050565b8181036000831280158383131683831282161715613d5f57613d5f613b7a565b5092915050565b8082018082111561045a5761045a613b7a565b600060018201613d8b57613d8b613b7a565b5060010190565b600060208284031215613da457600080fd5b8151613224816134f8565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b600060208284031215613df457600080fd5b8151613224816131f1565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008251613e8f81846020870161322b565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c753f1dbaa6b0ad898e2e852af7e5ad6c1e677caf62eb96c61738b76fd13165464736f6c63430008100033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000195465737420537472616e647320506f736974696f6e204e46540000000000000000000000000000000000000000000000000000000000000000000000000000065465737453500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f737472616e64732e696e667572612d697066732e696f2f697066732f516d544141705938377661346b74547862436961735a767677563865463762366737587764694d4a36794b7539700000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061016a5760003560e01c806301ffc9a71461016f57806306fdde0314610197578063081812fc146101ac578063095ea7b3146101e2578063162094c4146101f757806316bbbe731461020a5780631785f53c1461021d57806323b872dd1461023057806324d7806c1461024357806341f434341461026657806342842e0e1461027b57806346aa52ce1461028e5780636352211e146102a55780636e0bc23b146102b857806370480275146102cb57806370a08231146102de5780638389abf4146102f1578063845e1259146103045780638da5cb5b146103245780638fd62d4b1461033757806395d89b411461034a5780639ecceb5e14610352578063a22cb46514610372578063b75103c314610385578063b88d4fde14610398578063c87b56dd146103ab578063e3291be5146103be578063e66b6000146103ee578063e985e9c51461040e578063f2fde38b1461043c575b600080fd5b61018261017d366004613207565b61044f565b60405190151581526020015b60405180910390f35b61019f610460565b60405161018e919061327b565b6101d56101ba36600461328e565b6004602052600090815260409020546001600160a01b031681565b60405161018e91906132a7565b6101f56101f03660046132d2565b6104ee565b005b6101f561020536600461339e565b610507565b6101f56102183660046133e4565b6105b4565b6101f561022b3660046134a1565b610b65565b6101f561023e3660046134bc565b610c3c565b6101826102513660046134a1565b60066020526000908152604090205460ff1681565b6101d56daaeb6d7670e522a718067333cd4e81565b6101f56102893660046134bc565b610f56565b61029760095481565b60405190815260200161018e565b6101d56102b336600461328e565b610f81565b6101f56102c636600461359d565b610fbb565b6101f56102d93660046134a1565b611109565b6102976102ec3660046134a1565b6111f8565b6101f56102ff36600461328e565b61125b565b6103176103123660046134a1565b6117b5565b60405161018e9190613778565b6007546101d5906001600160a01b031681565b6101f561034536600461359d565b611c25565b61019f611e5f565b61036561036036600461328e565b611e6c565b60405161018e91906137da565b6101f56103803660046137ed565b6121ff565b610297610393366004613824565b612213565b6101f56103a63660046138ab565b612259565b61019f6103b936600461328e565b612280565b6103d16103cc3660046133e4565b61237f565b60408051931515845291151560208401529082015260600161018e565b6104016103fc3660046134a1565b6123f5565b60405161018e9190613945565b61018261041c366004613989565b600560209081526000928352604080842090915290825290205460ff1681565b6101f561044a3660046134a1565b612460565b600061045a8261256e565b92915050565b6000805461046d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610499906139bc565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b505050505081565b816104f8816125bc565b610502838361266f565b505050565b3360009081526006602052604090205460ff1661053f5760405162461bcd60e51b8152600401610536906139f6565b60405180910390fd5b600954158061055057506009548211155b6105a85760405162461bcd60e51b815260206004820152602360248201527f63616e2774207365742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a6105028282613a7e565b3360009081526006602052604090205460ff166105e35760405162461bcd60e51b8152600401610536906139f6565b60008060006105f5888787878b61237f565b9250925092508280156106055750815b6106475760405162461bcd60e51b8152602060048201526013602482015272151c98591948191bd95cdb89dd08195e1a5cdd606a1b6044820152606401610536565b6000818152600b6020526040808220815160a0810190925280548290829061066e906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906139bc565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b50505050508152602001600182018054610700906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461072c906139bc565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561089e57838290600052602060002090600502016040518060a00160405290816000820180546107da906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610806906139bc565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016107a7565b5050505081526020016003820180546108b6906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906139bc565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b50505050508152602001600482018054610948906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906139bc565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050919092525050506040810151519091506001819003610a28576109e68361125b565b600087878a6040516020016109fd93929190613b37565b60408051601f1981840301815291815281516020928301206000908152600d90925281205550610b59565b6000610a34848b612751565b6000868152600b602052604090209092506002019050610a55600184613b90565b81548110610a6557610a65613ba3565b9060005260206000209060050201600b60008681526020019081526020016000206002018281548110610a9a57610a9a613ba3565b6000918252602090912060059091020180610ab58382613bb9565b50600182810154908201805460ff191660ff9092161515919091179055600280830154818301556003808401549083015560049283015492909101919091556000858152600b6020526040902001805480610b1257610b12613c85565b60008281526020812060001990920191600583020190610b328282613110565b5060018101805460ff19169055600060028201819055600382018190556004909101559055505b50505050505050505050565b6007546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16610bf35760405162461bcd60e51b81526020600482015260196024820152782a3434b99030b2323932b9b99034b9903737ba1030b236b4b760391b6044820152606401610536565b6001600160a01b038116600081815260066020526040808220805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9190a250565b826001600160a01b0381163314610c5657610c56336125bc565b6000828152600260205260409020546001600160a01b03858116911614610cac5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610536565b6001600160a01b038316610cd25760405162461bcd60e51b815260040161053690613cc8565b3360009081526006602052604090205460ff1680610cf85750336001600160a01b038516145b80610d2657506001600160a01b038416600090815260056020908152604080832033845290915290205460ff165b80610d4757506000828152600460205260409020546001600160a01b031633145b610d845760405162461bcd60e51b815260206004820152600e60248201526d1393d5081055551213d49256915160921b6044820152606401610536565b6001600160a01b0380851660008181526003602090815260408083208054600019019055938716808352848320805460010190558683526002825284832080546001600160a01b0319169091179055918152600c90915290812054905b81811015610ef0576001600160a01b0386166000908152600c60205260409020805482908110610e1357610e13613ba3565b90600052602060002001548403610ee8576001600160a01b0386166000908152600c60205260409020610e47600184613b90565b81548110610e5757610e57613ba3565b9060005260206000200154600c6000886001600160a01b03166001600160a01b031681526020019081526020016000208281548110610e9857610e98613ba3565b60009182526020808320909101929092556001600160a01b0388168152600c90915260409020805480610ecd57610ecd613c85565b60019003818190600052602060002001600090559055610ef0565b600101610de1565b506001600160a01b038085166000818152600c60209081526040808320805460018101825590845282842001889055878352600490915280822080546001600160a01b0319169055518693891691600080516020613e9a83398151915291a45050505050565b826001600160a01b0381163314610f7057610f70336125bc565b610f7b848484612b48565b50505050565b6000818152600260205260409020546001600160a01b031680610fb65760405162461bcd60e51b815260040161053690613cf3565b919050565b3360009081526006602052604090205460ff16610fea5760405162461bcd60e51b8152600401610536906139f6565b610ff3866111f8565b60000361100d57611008868686868686611c25565b611101565b600080600061102389898888886000015161237f565b9250925092508115801561103657508015155b156110ea576000818152600b60209081526040808320815160a08101835288518152888401511515818501528883015192810192909252606080890151908301526080808901519083015260020180546001810182559084529190922082516005909202019081906110a89082613a7e565b50602082015160018201805460ff1916911515919091179055604082015160028201556060820151600382015560809091015160049091015550611101915050565b826110fd576110fd898989898989611c25565b5050505b505050505050565b6007546001600160a01b031633146111335760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16156111ac5760405162461bcd60e51b815260206004820152602760248201527f54686973206164647265737320697320616c726561647920686176652061646d604482015266696e20726f6c6560c81b6064820152608401610536565b6001600160a01b038116600081815260066020526040808220805460ff19166001179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399190a250565b60006001600160a01b03821661123f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610536565b506001600160a01b031660009081526003602052604090205490565b3360009081526006602052604090205460ff1661128a5760405162461bcd60e51b8152600401610536906139f6565b6000818152600b6020526040808220815160a081019092528054829082906112b1906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd906139bc565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b50505050508152602001600182018054611343906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461136f906139bc565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156114e157838290600052602060002090600502016040518060a001604052908160008201805461141d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611449906139bc565b80156114965780601f1061146b57610100808354040283529160200191611496565b820191906000526020600020905b81548152906001019060200180831161147957829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016113ea565b5050505081526020016003820180546114f9906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611525906139bc565b80156115725780601f1061154757610100808354040283529160200191611572565b820191906000526020600020905b81548152906001019060200180831161155557829003601f168201915b5050505050815260200160048201805461158b906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546115b7906139bc565b80156116045780601f106115d957610100808354040283529160200191611604565b820191906000526020600020905b8154815290600101906020018083116115e757829003601f168201915b505050919092525050506000838152600260205260408120549192506001600160a01b0390911690805b8360400151518110156116ce578360400151818151811061165157611651613ba3565b60200260200101516020015115611696578360400151818151811061167857611678613ba3565b6020026020010151604001518261168f9190613d17565b91506116c6565b836040015181815181106116ac576116ac613ba3565b602002602001015160400151826116c39190613d3f565b91505b60010161162e565b506116d884612c02565b6000848152600b60205260408120906116f18282613110565b6116ff600183016000613110565b61170d60028301600061314a565b61171b600383016000613110565b611729600483016000613110565b505060008082128015919061173f57508161175b565b8260085461174d9190613b90565b611758906001613d66565b90505b604080516001600160a01b03861681526020810188905290810182905282151560608201527f7dba56ccd98cbec1ed180696d405fbeebef14cd975e25cf9f3d6920c3b5bbfc19060800160405180910390a1505050505050565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b038111156117e9576117e96132fc565b60405190808252806020026020018201604052801561182257816020015b61180f61316b565b8152602001906001900390816118075790505b50905060005b82811015611c1d576001600160a01b0385166000908152600c602052604081208054600b9291908490811061185f5761185f613ba3565b906000526020600020015481526020019081526020016000206040518060a0016040529081600082018054611893906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf906139bc565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b50505050508152602001600182018054611925906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611951906139bc565b801561199e5780601f106119735761010080835404028352916020019161199e565b820191906000526020600020905b81548152906001019060200180831161198157829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611ac357838290600052602060002090600502016040518060a00160405290816000820180546119ff906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2b906139bc565b8015611a785780601f10611a4d57610100808354040283529160200191611a78565b820191906000526020600020905b815481529060010190602001808311611a5b57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016119cc565b505050508152602001600382018054611adb906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b07906139bc565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b50505050508152602001600482018054611b6d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b99906139bc565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b505050505081525050828281518110611c0157611c01613ba3565b602002602001018190525080611c1690613d79565b9050611828565b509392505050565b3360009081526006602052604090205460ff16611c545760405162461bcd60e51b8152600401610536906139f6565b6000838387604051602001611c6b93929190613b37565b60408051601f1981840301815291815281516020928301206000818152600d90935291205490915015611cd55760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b6044820152606401610536565b600160096000828254611ce89190613d66565b90915550506009546000908152600b60209081526040808320815160a0810183528651815286840151151581850152868301519281019290925260608087015190830152608080870151908301526002018054600181018255908452919092208251600590920201908190611d5d9082613a7e565b5060208281015160018301805460ff19169115159190911790556040808401516002840155606084015160038401556080909301516004909201919091556009546000908152600b90915220611db38782613a7e565b506009546000908152600b60205260409020600101611dd28682613a7e565b506009546000908152600b60205260409020600301611df18582613a7e565b506009546000908152600b60205260409020600401611e108482613a7e565b50600980546000838152600d602090815260408083208490556001600160a01b038c168352600c8252822080546001810182559083529120015554611e56908890612d44565b50505050505050565b6001805461046d906139bc565b611e7461316b565b6000828152600b602052604090819020815160a08101909252805482908290611e9c906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec8906139bc565b8015611f155780601f10611eea57610100808354040283529160200191611f15565b820191906000526020600020905b815481529060010190602001808311611ef857829003601f168201915b50505050508152602001600182018054611f2e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5a906139bc565b8015611fa75780601f10611f7c57610100808354040283529160200191611fa7565b820191906000526020600020905b815481529060010190602001808311611f8a57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156120cc57838290600052602060002090600502016040518060a0016040529081600082018054612008906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612034906139bc565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b505050918352505060018281015460ff161515602080840191909152600284015460408401526003840154606084015260049093015460809092019190915291835292019101611fd5565b5050505081526020016003820180546120e4906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612110906139bc565b801561215d5780601f106121325761010080835404028352916020019161215d565b820191906000526020600020905b81548152906001019060200180831161214057829003601f168201915b50505050508152602001600482018054612176906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546121a2906139bc565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b5050505050815250509050919050565b81612209816125bc565b6105028383612e02565b60008084848460405160200161222b93929190613b37565b60408051808303601f1901815291815281516020928301206000908152600d90925290205495945050505050565b846001600160a01b038116331461227357612273336125bc565b6111018686868686612e6e565b60606009546000148061229557506009548211155b6122ed5760405162461bcd60e51b815260206004820152602360248201527f63616e2774206765742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a80546122fa906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612326906139bc565b80156123735780601f1061234857610100808354040283529160200191612373565b820191906000526020600020905b81548152906001019060200180831161235657829003601f168201915b50505050509050919050565b60008060008061239087878a612213565b90506000811180156123bb5750886001600160a01b03166123b082610f81565b6001600160a01b0316145b156123dd5760006123cc8287612751565b506001955093509091506123ea9050565b6000806000935093509350505b955095509592505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561237357602002820191906000526020600020905b8154815260200190600101908083116124415750505050509050919050565b6007546001600160a01b0316331461248a5760405162461bcd60e51b815260040161053690613c9b565b6007546001600160a01b038083169116036124f25760405162461bcd60e51b815260206004820152602260248201527f4e6577206f776e657220616464726573732069732063757272656e74206f776e60448201526132b960f11b6064820152608401610536565b600780546001600160a01b03908116600081815260066020526040808220805460ff19908116909155938616808352818320805490951660011790945584546001600160a01b03191684179094559251909283917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9190a35050565b60006301ffc9a760e01b6001600160e01b03198316148061259f57506380ac58cd60e01b6001600160e01b03198316145b8061045a5750506001600160e01b031916635b5e139f60e01b1490565b6daaeb6d7670e522a718067333cd4e3b1561266c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264d9190613d92565b61266c5780604051633b79c77360e21b815260040161053691906132a7565b50565b6000818152600260205260409020546001600160a01b0316338114806126b857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6126f55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610536565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000806000600b60008681526020019081526020016000206040518060a0016040529081600082018054612784906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546127b0906139bc565b80156127fd5780601f106127d2576101008083540402835291602001916127fd565b820191906000526020600020905b8154815290600101906020018083116127e057829003601f168201915b50505050508152602001600182018054612816906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612842906139bc565b801561288f5780601f106128645761010080835404028352916020019161288f565b820191906000526020600020905b81548152906001019060200180831161287257829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156129b457838290600052602060002090600502016040518060a00160405290816000820180546128f0906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461291c906139bc565b80156129695780601f1061293e57610100808354040283529160200191612969565b820191906000526020600020905b81548152906001019060200180831161294c57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016128bd565b5050505081526020016003820180546129cc906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546129f8906139bc565b8015612a455780601f10612a1a57610100808354040283529160200191612a45565b820191906000526020600020905b815481529060010190602001808311612a2857829003601f168201915b50505050508152602001600482018054612a5e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8a906139bc565b8015612ad75780601f10612aac57610100808354040283529160200191612ad7565b820191906000526020600020905b815481529060010190602001808311612aba57829003601f168201915b505050505081525050905060005b816040015151811015612b3757612b1d82604001518281518110612b0b57612b0b613ba3565b60200260200101516000015186612f33565b15612b2f57600193509150612b419050565b600101612ae5565b5060008092509250505b9250929050565b612b53838383610c3c565b6001600160a01b0382163b1580612be65750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612b9790339088908790600401613daf565b6020604051808303816000875af1158015612bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bda9190613de2565b6001600160e01b031916145b6105025760405162461bcd60e51b815260040161053690613dff565b6000818152600260209081526040808320546001600160a01b0316808452600c90925290912054612c3283612f9d565b60005b81811015610f7b576001600160a01b0383166000908152600c60205260409020805482908110612c6757612c67613ba3565b90600052602060002001548403612d3c576001600160a01b0383166000908152600c60205260409020612c9b600184613b90565b81548110612cab57612cab613ba3565b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110612cec57612cec613ba3565b60009182526020808320909101929092556001600160a01b0385168152600c90915260409020805480612d2157612d21613c85565b60019003818190600052602060002001600090559055610f7b565b600101612c35565b612d4e828261303b565b6001600160a01b0382163b1580612de25750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612d939033906000908790600401613daf565b6020604051808303816000875af1158015612db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd69190613de2565b6001600160e01b031916145b612dfe5760405162461bcd60e51b815260040161053690613dff565b5050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612e79858585610c3c565b6001600160a01b0384163b1580612f105750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290612ec19033908a90899089908990600401613e29565b6020604051808303816000875af1158015612ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f049190613de2565b6001600160e01b031916145b612f2c5760405162461bcd60e51b815260040161053690613dff565b5050505050565b60008151835114612f465750600061045a565b81604051602001612f579190613e7d565b6040516020818303038152906040528051906020012083604051602001612f7e9190613e7d565b6040516020818303038152906040528051906020012014905092915050565b6000818152600260205260409020546001600160a01b031680612fd25760405162461bcd60e51b815260040161053690613cf3565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b03199081169091556004909252808320805490921690915551849290600080516020613e9a833981519152908390a45050565b6001600160a01b0382166130615760405162461bcd60e51b815260040161053690613cc8565b6000818152600260205260409020546001600160a01b0316156130b75760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610536565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020613e9a833981519152908290a45050565b50805461311c906139bc565b6000825580601f1061312c575050565b601f01602090049060005260206000209081019061266c919061319a565b508054600082556005029060005260206000209081019061266c91906131b3565b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b5b808211156131af576000815560010161319b565b5090565b808211156131af5760006131c78282613110565b5060018101805460ff191690556000600282018190556003820181905560048201556005016131b3565b6001600160e01b03198116811461266c57600080fd5b60006020828403121561321957600080fd5b8135613224816131f1565b9392505050565b60005b8381101561324657818101518382015260200161322e565b50506000910152565b6000815180845261326781602086016020860161322b565b601f01601f19169290920160200192915050565b602081526000613224602083018461324f565b6000602082840312156132a057600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114610fb657600080fd5b600080604083850312156132e557600080fd5b6132ee836132bb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261332357600080fd5b81356001600160401b038082111561333d5761333d6132fc565b604051601f8301601f19908116603f01168101908282118183101715613365576133656132fc565b8160405283815286602085880101111561337e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156133b157600080fd5b8235915060208301356001600160401b038111156133ce57600080fd5b6133da85828601613312565b9150509250929050565b600080600080600060a086880312156133fc57600080fd5b613405866132bb565b945060208601356001600160401b038082111561342157600080fd5b61342d89838a01613312565b9550604088013591508082111561344357600080fd5b61344f89838a01613312565b9450606088013591508082111561346557600080fd5b61347189838a01613312565b9350608088013591508082111561348757600080fd5b5061349488828901613312565b9150509295509295909350565b6000602082840312156134b357600080fd5b613224826132bb565b6000806000606084860312156134d157600080fd5b6134da846132bb565b92506134e8602085016132bb565b9150604084013590509250925092565b801515811461266c57600080fd5b600060a0828403121561351857600080fd5b60405160a081016001600160401b03828210818311171561353b5761353b6132fc565b81604052829350843591508082111561355357600080fd5b5061356085828601613312565b8252506020830135613571816134f8565b806020830152506040830135604082015260608301356060820152608083013560808201525092915050565b60008060008060008060c087890312156135b657600080fd5b6135bf876132bb565b955060208701356001600160401b03808211156135db57600080fd5b6135e78a838b01613312565b965060408901359150808211156135fd57600080fd5b6136098a838b01613312565b9550606089013591508082111561361f57600080fd5b61362b8a838b01613312565b9450608089013591508082111561364157600080fd5b61364d8a838b01613312565b935060a089013591508082111561366357600080fd5b5061367089828a01613506565b9150509295509295509295565b600060a082518185526136928286018261324f565b9050602080850151868303828801526136ab838261324f565b925050604080860151878403828901528381518086528486019150848160051b870101858401935060005b8281101561373557878203601f19018452845180518a84526136fa8b85018261324f565b828a01511515858b015288830151898601526060808401519086015260809283015192909401919091525093860193928601926001016136d6565b5060608a015197508a810360608c015261374f818961324f565b9750505050505050506080830151848203608086015261376f828261324f565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156137cd57603f198886030184526137bb85835161367d565b9450928501929085019060010161379f565b5092979650505050505050565b602081526000613224602083018461367d565b6000806040838503121561380057600080fd5b613809836132bb565b91506020830135613819816134f8565b809150509250929050565b60008060006060848603121561383957600080fd5b83356001600160401b038082111561385057600080fd5b61385c87838801613312565b9450602086013591508082111561387257600080fd5b61387e87838801613312565b9350604086013591508082111561389457600080fd5b506138a186828701613312565b9150509250925092565b6000806000806000608086880312156138c357600080fd5b6138cc866132bb565b94506138da602087016132bb565b93506040860135925060608601356001600160401b03808211156138fd57600080fd5b818801915088601f83011261391157600080fd5b81358181111561392057600080fd5b89602082850101111561393257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561397d57835183529284019291840191600101613961565b50909695505050505050565b6000806040838503121561399c57600080fd5b6139a5836132bb565b91506139b3602084016132bb565b90509250929050565b600181811c908216806139d057607f821691505b6020821081036139f057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1020b236b4b760691b604082015260600190565b601f82111561050257600081815260208120601f850160051c81016020861015613a4a5750805b601f850160051c820191505b8181101561110157828155600101613a56565b600019600383901b1c191660019190911b1790565b81516001600160401b03811115613a9757613a976132fc565b613aab81613aa584546139bc565b84613a23565b602080601f831160018114613ada5760008415613ac85750858301515b613ad28582613a69565b865550611101565b600085815260208120601f198616915b82811015613b0957888601518255948401946001909101908401613aea565b5085821015613b275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008451613b4981846020890161322b565b845190830190613b5d81836020890161322b565b8451910190613b7081836020880161322b565b0195945050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561045a5761045a613b7a565b634e487b7160e01b600052603260045260246000fd5b818103613bc4575050565b613bce82546139bc565b6001600160401b03811115613be557613be56132fc565b613bf381613aa584546139bc565b6000601f821160018114613c215760008315613c0f5750848201545b613c198482613a69565b855550612f2c565b600085815260209020601f19841690600086815260209020845b83811015613c5b5782860154825560019586019590910190602001613c3b565b5085831015613b275793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1027bbb732b960691b604082015260600190565b6020808252601190820152701253959053125117d49150d25412515395607a1b604082015260600190565b6020808252600a90820152691393d517d3525395115160b21b604082015260600190565b8082018281126000831280158216821582161715613d3757613d37613b7a565b505092915050565b8181036000831280158383131683831282161715613d5f57613d5f613b7a565b5092915050565b8082018082111561045a5761045a613b7a565b600060018201613d8b57613d8b613b7a565b5060010190565b600060208284031215613da457600080fd5b8151613224816134f8565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b600060208284031215613df457600080fd5b8151613224816131f1565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008251613e8f81846020870161322b565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c753f1dbaa6b0ad898e2e852af7e5ad6c1e677caf62eb96c61738b76fd13165464736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000195465737420537472616e647320506f736974696f6e204e46540000000000000000000000000000000000000000000000000000000000000000000000000000065465737453500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f737472616e64732e696e667572612d697066732e696f2f697066732f516d544141705938377661346b74547862436961735a767677563865463762366737587764694d4a36794b7539700000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Test Strands Position NFT
Arg [1] : _symbol (string): TestSP
Arg [2] : _tURI (string): https://strands.infura-ipfs.io/ipfs/QmTAApY87va4ktTxbCiasZvvwV8eF7b6g7XwdiMJ6yKu9p
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 5465737420537472616e647320506f736974696f6e204e465400000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 5465737453500000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [8] : 68747470733a2f2f737472616e64732e696e667572612d697066732e696f2f69
Arg [9] : 7066732f516d544141705938377661346b74547862436961735a767677563865
Arg [10] : 463762366737587764694d4a36794b7539700000000000000000000000000000
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.