Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 7 from a total of 7 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Put On Sale | 18177761 | 890 days ago | IN | 0 ETH | 0.00389578 | ||||
| Put On Sale | 18164541 | 892 days ago | IN | 0 ETH | 0.00512479 | ||||
| Put On Sale | 18013095 | 913 days ago | IN | 0 ETH | 0.00502823 | ||||
| Buy Asset | 18010500 | 913 days ago | IN | 0 ETH | 0.00313276 | ||||
| Put On Sale | 18009405 | 914 days ago | IN | 0 ETH | 0.00210839 | ||||
| Transfer Ownersh... | 17886417 | 931 days ago | IN | 0 ETH | 0.00152813 | ||||
| Change Signer | 17886410 | 931 days ago | IN | 0 ETH | 0.00143411 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Trade
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier:UNLICENSED
pragma solidity 0.8.16;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
import "./interface/ITransferProxy.sol";
import "./interface/ISokuNFT721.sol";
import "./interface/ISokuNFT1155.sol";
import "hardhat/console.sol";
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
}
contract Trade is AccessControl, Ownable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
enum BuyingAssetType {
ERC1155,
ERC721,
LazyERC1155,
LazyERC721
}
event SignerChanged(
address indexed previousSigner,
address indexed newSigner
);
event SellerFee(uint8 sellerFee);
event BuyerFee(uint8 buyerFee);
event BuyAsset(
address indexed assetOwner,
uint256 indexed tokenId,
uint256 quantity,
address indexed buyer
);
event ExecuteBid(
address indexed assetOwner,
uint256 indexed tokenId,
uint256 quantity,
address indexed buyer
);
// buyer platformFee
uint8 private buyerFeePermille;
// seller platformFee
uint8 private sellerFeePermille;
ITransferProxy public transferProxy;
IUniswapV2Router02 public sushiswapRouter;
address public signer;
mapping(uint256 => bool) public usedNonce;
mapping(uint256 => Asset1155) public users;
mapping(uint256 => SignOrder) public onSale;
//mapping of input address of referral to output address referred by
mapping(address => address) public addressRefBy;
//mapping of input user address (arg1) and then token address (arg2) to count ref rewards
mapping(address => mapping(address => uint256)) public addressRefRewards;
struct Referral {
address referrer;
uint256 referralFee;
}
struct SignOrder {
address user;
address assetAddress;
uint256 tokenId;
uint256 qty;
address paymentAssetAddress;
uint256 amount;
uint256 startTime;
uint256 endTime;
bool status;
}
struct Asset1155 {
address seller;
address nftAddress;
uint256 tokenId;
uint256 supply;
bool initialize;
}
/** Fee Struct
@param platformFee uint256 (buyerFee + sellerFee) value which is transferred to current contract owner.
@param assetFee uint256 assetvalue which is transferred to current seller of the NFT.
@param royaltyFee uint256 value, transferred to Minter of the NFT.
@param price uint256 value, the combination of buyerFee and assetValue.
@param tokenCreator address value, it's store the creator of NFT.
*/
struct Fee {
uint256 platformFee;
uint256 assetFee;
uint256 royaltyFee;
uint256 price;
address tokenCreator;
}
/* An ECDSA signature. */
struct Sign {
uint8 v;
bytes32 r;
bytes32 s;
uint256 nonce;
}
/** Order Params
@param seller address of user,who's selling the NFT.
@param buyer address of user, who's buying the NFT.
@param erc20Address address of the token, which is used as payment token(WETH/WBNB/WMATIC...)
@param nftAddress address of NFT contract where the NFT token is created/Minted.
@param nftType an enum value, if the type is ERC721/ERC1155 the enum value is 0/1.
@param uintprice the Price Each NFT it's not including the buyerFee.
@param amount the price of NFT(assetFee + buyerFee).
@param tokenId
@param qty number of quantity to be transfer.
*/
struct Order {
address seller;
address buyer;
address erc20Address;
address nftAddress;
BuyingAssetType nftType;
uint256 unitPrice;
bool skipRoyalty;
uint256 amount;
uint256 tokenId;
string tokenURI;
uint256 supply;
uint96 royaltyFee;
uint256 qty;
}
uint256 refReward;
uint256 refRewardRefBy1;
uint256 refRewardRefBy2;
uint256 refRewardRefBy3;
constructor(
uint8 _buyerFee,
uint8 _sellerFee,
address _routerAddress,
ITransferProxy _transferProxy
) {
buyerFeePermille = _buyerFee;
sellerFeePermille = _sellerFee;
transferProxy = _transferProxy;
sushiswapRouter = IUniswapV2Router02(_routerAddress);
signer = _msgSender();
_setupRole("ADMIN_ROLE", _msgSender());
_setupRole("SIGNER_ROLE", _msgSender());
}
receive() external payable {}
fallback() external payable {}
/**
returns the buyerservice Fee in multiply of 1000.
*/
function buyerServiceFee() external view virtual returns (uint8) {
return buyerFeePermille;
}
/**
returns the sellerservice Fee in multiply of 1000.
*/
function sellerServiceFee() external view virtual returns (uint8) {
return sellerFeePermille;
}
/**
@param _transferProxy address for a new transferProxy.
*/
function setTransferProxy(
address _transferProxy
) external onlyRole("ADMIN_ROLE") {
transferProxy = ITransferProxy(_transferProxy);
}
/**
@param _buyerFee value for buyerservice in multiply of 1000.
*/
function setBuyerServiceFee(
uint8 _buyerFee
) external onlyRole("ADMIN_ROLE") {
buyerFeePermille = _buyerFee;
emit BuyerFee(buyerFeePermille);
}
/**
@param _sellerFee value for buyerservice in multiply of 1000.
*/
function setSellerServiceFee(
uint8 _sellerFee
) external onlyRole("ADMIN_ROLE") {
sellerFeePermille = _sellerFee;
emit SellerFee(sellerFeePermille);
}
/**
transfers the contract ownership to newowner address.
@param newOwner address of newOwner
*/
function transferOwnership(
address newOwner
) public override onlyRole("ADMIN_ROLE") {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_revokeRole("ADMIN_ROLE", owner());
_transferOwnership(newOwner);
_setupRole("ADMIN_ROLE", newOwner);
}
/**
transfers the contract ownership to newowner address.
@param newSigner address of newOwner
*/
function changeSigner(address newSigner) external onlyRole("SIGNER_ROLE") {
require(newSigner != address(0), " new Signer is the zero address");
_revokeRole("SIGNER_ROLE", signer);
signer = newSigner;
_setupRole("SIGNER_ROLE", newSigner);
emit SignerChanged(signer, newSigner);
}
function putOnSale(SignOrder memory signOrder, uint256 nonce) external {
require(!onSale[nonce].status, "Already In Sale");
signOrder.user = _msgSender();
signOrder.status = true;
onSale[nonce] = signOrder;
}
function removeFromSale(uint256 nonce) external {
require(onSale[nonce].status, "Not In Sale");
require(onSale[nonce].user == _msgSender(), "Invalid User");
delete onSale[nonce];
}
function pause() external onlyRole("ADMIN_ROLE") {
transferProxy.pause();
}
function unpause() external onlyRole("ADMIN_ROLE") {
transferProxy.unpause();
}
/**
excuting the NFT order.
@param order ordervalues(seller, buyer,...).
@param sign Sign value(v, r, f).
*/
function buyAsset(
Order memory order,
Sign calldata sign,
Referral memory referral,
bool isWertPurchase
) external payable {
if (isWertPurchase) {
uint[] memory amounts = _swapETHforToken(
order.amount,
order.erc20Address
);
require(
amounts[1] >= order.amount,
"Trade: insufficient swapped amount"
);
}
require(!usedNonce[sign.nonce], "Nonce : Invalid Nonce");
require(
((onSale[sign.nonce].startTime <= block.timestamp &&
block.timestamp <= onSale[sign.nonce].endTime) ||
onSale[sign.nonce].startTime == onSale[sign.nonce].endTime) &&
onSale[sign.nonce].status,
"Sale Not Eligible"
);
if (
order.nftType == BuyingAssetType.ERC721 ||
order.nftType == BuyingAssetType.LazyERC721
) {
usedNonce[sign.nonce] = true;
onSale[sign.nonce].status = false;
} else if (
order.nftType == BuyingAssetType.ERC1155 ||
order.nftType == BuyingAssetType.LazyERC1155
) {
if (users[sign.nonce].initialize) {
require(
users[sign.nonce].nftAddress == order.nftAddress &&
users[sign.nonce].seller == order.seller &&
users[sign.nonce].tokenId == order.tokenId,
"Nonce: Invalid Data"
);
require(
users[sign.nonce].supply >= order.qty,
"Invalid Quantity"
);
users[sign.nonce].supply -= order.qty;
if (users[sign.nonce].supply == 0) {
usedNonce[sign.nonce] = true;
onSale[sign.nonce].status = false;
}
} else if (!users[sign.nonce].initialize) {
require(
onSale[sign.nonce].qty >= order.qty,
"Invalid Quantity"
);
users[sign.nonce] = Asset1155(
order.seller,
order.nftAddress,
order.tokenId,
onSale[sign.nonce].qty - order.qty,
true
);
}
}
Fee memory fee = getFees(order);
require(
(fee.price >= order.unitPrice * order.qty),
"Paid invalid amount"
);
verifySellerSign(sign);
tradeAsset(order, fee, referral, isWertPurchase);
emit BuyAsset(order.seller, order.tokenId, order.qty, order.buyer);
}
/**
excuting the NFT order.
@param order ordervalues(seller, buyer,...).
@param sign Sign value(v, r, f).
*/
function executeBid(
Order memory order,
Sign calldata sign,
Referral memory referral
) external {
require(!usedNonce[sign.nonce], "Nonce : Invalid Nonce");
usedNonce[sign.nonce] = true;
Fee memory fee = getFees(order);
verifyBuyerSign(
order.buyer,
order.tokenId,
order.amount,
order.erc20Address,
order.nftAddress,
order.qty,
sign
);
tradeAsset(order, fee, referral, false);
emit ExecuteBid(order.seller, order.tokenId, order.qty, order.buyer);
}
/**
excuting the NFT order.
@param order ordervalues(seller, buyer,...).
@param sign Sign value(v, r, f).
*/
function mintAndBuyAsset(
Order memory order,
Sign calldata sign,
Sign calldata ownerSign,
Referral memory referral,
bool isWertPurchase
) external payable {
if (isWertPurchase) {
uint[] memory amounts = _swapETHforToken(
order.amount,
order.erc20Address
);
require(
amounts[1] >= order.amount,
"Trade: insufficient swapped amount"
);
}
require(!usedNonce[sign.nonce], "Nonce : Invalid Nonce");
require(
(onSale[sign.nonce].startTime <= block.timestamp &&
block.timestamp <= onSale[sign.nonce].endTime) ||
(onSale[sign.nonce].startTime == onSale[sign.nonce].endTime &&
onSale[sign.nonce].status),
"Sale Not Eligible"
);
usedNonce[sign.nonce] = true;
onSale[sign.nonce].status = false;
Fee memory fee = getFees(order);
require(
(fee.price >= order.unitPrice * order.qty),
"Paid invalid amount"
);
verifyOwnerSign(
order.seller,
order.tokenURI,
order.nftAddress,
ownerSign
);
verifySellerSign(sign);
tradeAsset(order, fee, referral, isWertPurchase);
emit BuyAsset(order.seller, order.tokenId, order.qty, order.buyer);
}
/**
excuting the NFT order.
@param order ordervalues(seller, buyer,...).
@param sign Sign value(v, r, f).
*/
function mintAndExecuteBid(
Order memory order,
Sign calldata sign,
Sign calldata ownerSign,
Referral memory referral
) external {
require(!usedNonce[sign.nonce], "Nonce : Invalid Nonce");
usedNonce[sign.nonce] = true;
Fee memory fee = getFees(order);
verifyOwnerSign(
order.seller,
order.tokenURI,
order.nftAddress,
ownerSign
);
verifyBuyerSign(
order.buyer,
order.tokenId,
order.amount,
order.erc20Address,
order.nftAddress,
order.qty,
sign
);
tradeAsset(order, fee, referral, false);
emit ExecuteBid(order.seller, order.tokenId, order.qty, order.buyer);
}
/**
returns the signer of given signature.
*/
function getSigner(
bytes32 hash,
Sign memory sign
) internal pure returns (address) {
return
ecrecover(
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
),
sign.v,
sign.r,
sign.s
);
}
function verifySellerSign(Sign memory sign) internal view {
bytes32 hash = keccak256(
abi.encodePacked(
onSale[sign.nonce].assetAddress,
onSale[sign.nonce].tokenId,
onSale[sign.nonce].paymentAssetAddress,
onSale[sign.nonce].amount,
onSale[sign.nonce].qty,
sign.nonce
)
);
require(
onSale[sign.nonce].user == getSigner(hash, sign),
"seller sign verification failed"
);
}
function verifyOwnerSign(
address seller,
string memory tokenURI,
address assetAddress,
Sign memory sign
) internal view {
bytes32 hash = keccak256(
abi.encodePacked(this, assetAddress, seller, tokenURI, sign.nonce)
);
require(
signer == getSigner(hash, sign),
"owner sign verification failed"
);
}
function verifyBuyerSign(
address buyer,
uint256 tokenId,
uint256 amount,
address paymentAssetAddress,
address assetAddress,
uint256 qty,
Sign memory sign
) internal pure {
bytes32 hash = keccak256(
abi.encodePacked(
assetAddress,
tokenId,
paymentAssetAddress,
amount,
qty,
sign.nonce
)
);
require(
buyer == getSigner(hash, sign),
"buyer sign verification failed"
);
}
/**
it retuns platformFee, assetFee, royaltyFee, price and tokencreator.
*/
function getFees(Order memory order) internal view returns (Fee memory) {
address tokenCreator;
uint256 platformFee;
uint256 royaltyFee;
uint256 assetFee;
uint256 price = (order.amount * 1000) / (1000 + buyerFeePermille);
uint256 buyerFee = order.amount - price;
uint256 sellerFee = (price * sellerFeePermille) / 1000;
platformFee = buyerFee + sellerFee;
if (
!order.skipRoyalty &&
((order.nftType == BuyingAssetType.ERC721) ||
(order.nftType == BuyingAssetType.ERC1155))
) {
(tokenCreator, royaltyFee) = IERC2981(order.nftAddress).royaltyInfo(
order.tokenId,
price
);
}
if (
!order.skipRoyalty &&
((order.nftType == BuyingAssetType.LazyERC721) ||
(order.nftType == BuyingAssetType.LazyERC1155))
) {
(tokenCreator, royaltyFee) = (
order.seller,
uint96((price * order.royaltyFee) / 1000)
);
}
assetFee = price - royaltyFee - sellerFee;
return Fee(platformFee, assetFee, royaltyFee, price, tokenCreator);
}
function tradeAsset(
Order memory order,
Fee memory fee,
Referral memory referral,
bool isWertPurchase
) internal virtual {
if (order.nftType == BuyingAssetType.ERC721) {
transferProxy.erc721safeTransferFrom(
IERC721(order.nftAddress),
order.seller,
order.buyer,
order.tokenId
);
}
if (order.nftType == BuyingAssetType.ERC1155) {
transferProxy.erc1155safeTransferFrom(
IERC1155(order.nftAddress),
order.seller,
order.buyer,
order.tokenId,
order.qty,
""
);
}
if (order.nftType == BuyingAssetType.LazyERC721) {
transferProxy.mintAndSafe721Transfer(
ILazyMint(order.nftAddress),
order.seller,
order.buyer,
order.tokenURI,
order.royaltyFee
);
}
if (order.nftType == BuyingAssetType.LazyERC1155) {
transferProxy.mintAndSafe1155Transfer(
ILazyMint(order.nftAddress),
order.seller,
order.buyer,
order.tokenURI,
order.royaltyFee,
order.supply,
order.qty
);
}
require(
order.buyer != referral.referrer,
"Buyer cannot be the referrer"
);
address erc20TokenFrom = isWertPurchase ? address(this) : _msgSender();
if(isWertPurchase){
IERC20(order.erc20Address).approve(address(transferProxy), type(uint).max);
}
refReward = 0;
refRewardRefBy1 = 0;
refRewardRefBy2 = 0;
refRewardRefBy3 = 0;
if (fee.platformFee > 0) {
if (addressRefBy[order.buyer] == address(0)) {
if (referral.referrer != address(0)) {
if (
order.buyer != addressRefBy[referral.referrer] ||
order.buyer !=
addressRefBy[addressRefBy[referral.referrer]] ||
order.buyer !=
addressRefBy[
addressRefBy[addressRefBy[referral.referrer]]
]
) {
addressRefBy[order.buyer] = referral.referrer;
}
refReward = fee.platformFee.div(10);
addressRefRewards[referral.referrer][
order.erc20Address
] += refReward;
}
} else {
//addressRefBy[order.buyer] != address(0) is TRUE
refRewardRefBy1 = fee.platformFee.div(10);
addressRefRewards[addressRefBy[order.buyer]][
order.erc20Address
] += refRewardRefBy1;
if (addressRefBy[addressRefBy[order.buyer]] != address(0)) {
refRewardRefBy2 = fee.platformFee.mul(100).div(1667);
addressRefRewards[addressRefBy[addressRefBy[order.buyer]]][
order.erc20Address
] += refRewardRefBy2;
if (
addressRefBy[addressRefBy[addressRefBy[order.buyer]]] !=
address(0)
) {
refRewardRefBy3 = fee.platformFee.div(25);
addressRefRewards[
addressRefBy[
addressRefBy[addressRefBy[order.buyer]]
]
][order.erc20Address] += refRewardRefBy3;
}
}
}
uint256 ownerRewards = fee
.platformFee
.sub(refReward)
.sub(refRewardRefBy1)
.sub(refRewardRefBy2)
.sub(refRewardRefBy3);
if (erc20TokenFrom != address(this)) {
// transfer the rewards to the contract itself for referrers to withdraw later
transferProxy.erc20safeTransferFrom(
IERC20(order.erc20Address),
erc20TokenFrom,
address(this),
fee.platformFee.sub(ownerRewards)
);
}
// transfer the remaining platform fee to the contract owner directly
transferProxy.erc20safeTransferFrom(
IERC20(order.erc20Address),
erc20TokenFrom,
owner(),
ownerRewards
);
}
if (fee.royaltyFee > 0) {
transferProxy.erc20safeTransferFrom(
IERC20(order.erc20Address),
erc20TokenFrom,
fee.tokenCreator,
fee.royaltyFee
);
}
if (referral.referrer != address(0) && referral.referralFee > 0) {
uint256 referralFeeAmnt = fee
.assetFee
.mul(referral.referralFee)
.div(1000);
addressRefRewards[referral.referrer][
order.erc20Address
] += referralFeeAmnt;
transferProxy.erc20safeTransferFrom(
IERC20(order.erc20Address),
erc20TokenFrom,
address(this),
referralFeeAmnt
);
}
transferProxy.erc20safeTransferFrom(
IERC20(order.erc20Address),
erc20TokenFrom,
order.seller,
fee.assetFee.mul(1000 - referral.referralFee).div(1000)
);
}
function _swapETHforToken(
uint _amountOutMin,
address _tokenAddress
) internal returns (uint[] memory amounts) {
address[] memory path = new address[](2);
path[0] = sushiswapRouter.WETH();
path[1] = _tokenAddress;
if (path[0] == path[1]) {
IWETH(_tokenAddress).deposit{value: msg.value}();
amounts = new uint[](2);
amounts[0] = msg.value;
amounts[1] = msg.value;
} else {
amounts = sushiswapRouter.swapETHForExactTokens{value: msg.value}(
_amountOutMin,
path,
address(this),
block.timestamp
);
}
}
function withdraw(address tokenAddress) public {
require(
addressRefRewards[_msgSender()][tokenAddress] > 0,
"No rewards to withdraw."
);
uint256 amount = addressRefRewards[_msgSender()][tokenAddress];
addressRefRewards[_msgSender()][tokenAddress] = 0;
IERC20(tokenAddress).safeTransfer(_msgSender(), amount);
}
function withdrawAmountETH(uint256 amount) public onlyOwner {
require(amount <= address(this).balance, "Trade: Withdrawal amount exceeds balance");
(bool sent, ) = _msgSender().call{value: amount}("");
require(sent, "Trade: Failed to withdraw Ether");
}
function withdrawAmountERC20(address tokenAddress, uint256 amount) public onlyOwner {
IERC20 token = IERC20(tokenAddress);
uint256 contractBalance = token.balanceOf(address(this));
require(amount <= contractBalance, "Trade: Withdrawal amount exceeds balance");
token.safeTransfer(_msgSender(), amount);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../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 Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) pragma solidity ^0.8.0; import "../token/ERC1155/IERC1155.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard
*/
interface IERC2981 is IERC165 {
/**
* @dev Called with the sale price to determine how much royalty is owed and to whom.
* @param tokenId - the NFT asset queried for royalty information
* @param salePrice - the sale price of the NFT asset specified by `tokenId`
* @return receiver - address of who should be sent the royalty payment
* @return royaltyAmount - the royalty payment amount for `salePrice`
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}// SPDX-License-Identifier:UNLICENSED
pragma solidity 0.8.16;
import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "@openzeppelin/contracts/interfaces/IERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC1155.sol";
interface ILazyMint {
function mintAndTransfer(
address from,
address to,
string memory _tokenURI,
uint96 _royaltyFee
) external returns(uint256 _tokenId);
function mintAndTransfer(
address from,
address to,
string memory _tokenURI,
uint96 _royaltyFee,
uint256 supply,
uint256 qty
) external returns(uint256 _tokenId);
}// SPDX-License-Identifier:UNLICENSED
pragma solidity 0.8.16;
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
interface ISokuNFT1155 is IERC1155 {
function owner() external returns (address);
}// SPDX-License-Identifier:UNLICENSED
pragma solidity 0.8.16;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface ISokuNFT721 is IERC721{
function owner() external returns (address);
}// SPDX-License-Identifier:UNLICENSED
pragma solidity 0.8.16;
import "./ILazyMint.sol";
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
interface ITransferProxy {
function erc721safeTransferFrom(
IERC721 token,
address from,
address to,
uint256 tokenId
) external;
function erc1155safeTransferFrom(
IERC1155 token,
address from,
address to,
uint256 tokenId,
uint256 value,
bytes calldata data
) external;
function mintAndSafe1155Transfer(
ILazyMint nftAddress,
address from,
address to,
string memory _tokenURI,
uint96 _royaltyFee,
uint256 supply,
uint256 qty
) external;
function mintAndSafe721Transfer(
ILazyMint nftAddress,
address from,
address to,
string memory _tokenURI,
uint96 _royaltyFee
) external ;
function erc20safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) external;
function pause() external;
function unpause() external;
}// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
function _sendLogPayload(bytes memory payload) private view {
uint256 payloadLength = payload.length;
address consoleAddress = CONSOLE_ADDRESS;
assembly {
let payloadStart := add(payload, 32)
let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint8","name":"_buyerFee","type":"uint8"},{"internalType":"uint8","name":"_sellerFee","type":"uint8"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"contract ITransferProxy","name":"_transferProxy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"assetOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"}],"name":"BuyAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"buyerFee","type":"uint8"}],"name":"BuyerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"assetOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"}],"name":"ExecuteBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"sellerFee","type":"uint8"}],"name":"SellerFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousSigner","type":"address"},{"indexed":true,"internalType":"address","name":"newSigner","type":"address"}],"name":"SignerChanged","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressRefBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"addressRefRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"erc20Address","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"enum Trade.BuyingAssetType","name":"nftType","type":"uint8"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"bool","name":"skipRoyalty","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint96","name":"royaltyFee","type":"uint96"},{"internalType":"uint256","name":"qty","type":"uint256"}],"internalType":"struct Trade.Order","name":"order","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct Trade.Sign","name":"sign","type":"tuple"},{"components":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"referralFee","type":"uint256"}],"internalType":"struct Trade.Referral","name":"referral","type":"tuple"},{"internalType":"bool","name":"isWertPurchase","type":"bool"}],"name":"buyAsset","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyerServiceFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"changeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"erc20Address","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"enum Trade.BuyingAssetType","name":"nftType","type":"uint8"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"bool","name":"skipRoyalty","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint96","name":"royaltyFee","type":"uint96"},{"internalType":"uint256","name":"qty","type":"uint256"}],"internalType":"struct Trade.Order","name":"order","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct Trade.Sign","name":"sign","type":"tuple"},{"components":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"referralFee","type":"uint256"}],"internalType":"struct Trade.Referral","name":"referral","type":"tuple"}],"name":"executeBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"erc20Address","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"enum Trade.BuyingAssetType","name":"nftType","type":"uint8"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"bool","name":"skipRoyalty","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint96","name":"royaltyFee","type":"uint96"},{"internalType":"uint256","name":"qty","type":"uint256"}],"internalType":"struct Trade.Order","name":"order","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct Trade.Sign","name":"sign","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct Trade.Sign","name":"ownerSign","type":"tuple"},{"components":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"referralFee","type":"uint256"}],"internalType":"struct Trade.Referral","name":"referral","type":"tuple"},{"internalType":"bool","name":"isWertPurchase","type":"bool"}],"name":"mintAndBuyAsset","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"erc20Address","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"enum Trade.BuyingAssetType","name":"nftType","type":"uint8"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"bool","name":"skipRoyalty","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint96","name":"royaltyFee","type":"uint96"},{"internalType":"uint256","name":"qty","type":"uint256"}],"internalType":"struct Trade.Order","name":"order","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct Trade.Sign","name":"sign","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct Trade.Sign","name":"ownerSign","type":"tuple"},{"components":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256","name":"referralFee","type":"uint256"}],"internalType":"struct Trade.Referral","name":"referral","type":"tuple"}],"name":"mintAndExecuteBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"onSale","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"paymentAssetAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"assetAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"paymentAssetAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"internalType":"struct Trade.SignOrder","name":"signOrder","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"putOnSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"removeFromSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellerServiceFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_buyerFee","type":"uint8"}],"name":"setBuyerServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_sellerFee","type":"uint8"}],"name":"setSellerServiceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_transferProxy","type":"address"}],"name":"setTransferProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferProxy","outputs":[{"internalType":"contract ITransferProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedNonce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"users","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"bool","name":"initialize","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmountERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawAmountETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200440238038062004402833981016040819052620000349162000240565b6200003f336200010e565b6001805460ff858116600160a81b0260ff60a81b19918816600160a01b029190911661ffff60a01b1990921691909117179055600280546001600160a01b038084166001600160a01b0319928316179092556003805492851692909116919091179055620000aa3390565b600480546001600160a01b0319166001600160a01b0392909216919091179055620000ea6941444d494e5f524f4c4560b01b620000e43390565b62000160565b620001046a5349474e45525f524f4c4560a81b3362000160565b50505050620002a2565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200016c828262000170565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200016c576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001cc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b805160ff811681146200022257600080fd5b919050565b6001600160a01b03811681146200023d57600080fd5b50565b600080600080608085870312156200025757600080fd5b620002628562000210565b9350620002726020860162000210565b92506040850151620002848162000227565b6060860151909250620002978162000227565b939692955090935050565b61415080620002b26000396000f3fe6080604052600436106101f05760003560e01c80638da5cb5b1161010c578063b43a76f11161009a578063d547741f1161006c578063d547741f14610722578063e9240c2d14610742578063f1eeb42a14610762578063f2fde38b14610782578063f9fc4816146107a257005b8063b43a76f11461060e578063b953d196146106dc578063cef89d00146106ef578063d395cc181461070f57005b80639c66809d116100de5780639c66809d1461057a578063a217fddf14610599578063a3667c7b146105ae578063a96b446d146105ce578063aad2b723146105ee57005b80638da5cb5b146104d45780638fe56dc8146104f257806391d148541461052a5780639723fb6d1461054a57005b80633f4ba83a116101895780636d2511d21161015b5780636d2511d21461044a5780636e667db31461046a578063715018a61461048a5780638456cb591461049f5780638ae42905146104b457005b80633f4ba83a146103b257806347ecbcf9146103c757806351cff8d9146103fd57806360085da61461041d57005b8063248a9ca3116101c2578063248a9ca3146102a65780632f2ff15d146102e457806336568abe14610304578063365b98b21461032457005b806301ffc9a7146101f95780630e3487731461022e5780631361a3b61461024e578063238ac9331461026e57005b366101f757005b005b34801561020557600080fd5b50610219610214366004613492565b6107c2565b60405190151581526020015b60405180910390f35b34801561023a57600080fd5b506101f76102493660046134e4565b6107f9565b34801561025a57600080fd5b506101f7610269366004613510565b6108d5565b34801561027a57600080fd5b5060045461028e906001600160a01b031681565b6040516001600160a01b039091168152602001610225565b3480156102b257600080fd5b506102d66102c1366004613510565b60009081526020819052604090206001015490565b604051908152602001610225565b3480156102f057600080fd5b506101f76102ff366004613529565b6109de565b34801561031057600080fd5b506101f761031f366004613529565b610a09565b34801561033057600080fd5b5061037d61033f366004613510565b600660205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909160ff1685565b604080516001600160a01b0396871681529590941660208601529284019190915260608301521515608082015260a001610225565b3480156103be57600080fd5b506101f7610a87565b3480156103d357600080fd5b5061028e6103e2366004613559565b6008602052600090815260409020546001600160a01b031681565b34801561040957600080fd5b506101f7610418366004613559565b610b0a565b34801561042957600080fd5b50600154600160a81b900460ff165b60405160ff9091168152602001610225565b34801561045657600080fd5b506101f7610465366004613821565b610baf565b34801561047657600080fd5b5060025461028e906001600160a01b031681565b34801561049657600080fd5b506101f7610cdf565b3480156104ab57600080fd5b506101f7610d15565b3480156104c057600080fd5b506101f76104cf366004613559565b610d7d565b3480156104e057600080fd5b506001546001600160a01b031661028e565b3480156104fe57600080fd5b506102d661050d366004613894565b600960209081526000928352604080842090915290825290205481565b34801561053657600080fd5b50610219610545366004613529565b610db8565b34801561055657600080fd5b50610219610565366004613510565b60056020526000908152604090205460ff1681565b34801561058657600080fd5b50600154600160a01b900460ff16610438565b3480156105a557600080fd5b506102d6600081565b3480156105ba57600080fd5b506101f76105c93660046138d3565b610de1565b3480156105da57600080fd5b506101f76105e93660046138d3565b610e52565b3480156105fa57600080fd5b506101f7610609366004613559565b610ebb565b34801561061a57600080fd5b50610685610629366004613510565b60076020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154978701546008909701546001600160a01b039687169895871697949693959290931693909260ff1689565b604080516001600160a01b039a8b168152988a1660208a0152880196909652606087019490945295909116608085015260a084015260c083019390935260e082019290925290151561010082015261012001610225565b6101f76106ea3660046138ee565b610fc0565b3480156106fb57600080fd5b506101f761070a366004613977565b611261565b6101f761071d366004613a22565b611367565b34801561072e57600080fd5b506101f761073d366004613529565b61197f565b34801561074e57600080fd5b5060035461028e906001600160a01b031681565b34801561076e57600080fd5b506101f761077d366004613a95565b6119a5565b34801561078e57600080fd5b506101f761079d366004613559565b611aa9565b3480156107ae57600080fd5b506101f76107bd366004613510565b611b6e565b60006001600160e01b03198216637965db0b60e01b14806107f357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001546001600160a01b0316331461082c5760405162461bcd60e51b815260040161082390613af4565b60405180910390fd5b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108999190613b29565b9050808311156108bb5760405162461bcd60e51b815260040161082390613b42565b6108cf6001600160a01b0383163385611c50565b50505050565b60008181526007602052604090206008015460ff166109245760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420496e2053616c6560a81b6044820152606401610823565b6000818152600760205260409020546001600160a01b031633146109795760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102ab9b2b960a11b6044820152606401610823565b6000908152600760208190526040822080546001600160a01b031990811682556001820180548216905560028201849055600382018490556004820180549091169055600581018390556006810183905590810191909155600801805460ff19169055565b6000828152602081905260409020600101546109fa8133611ca2565b610a048383611d06565b505050565b6001600160a01b0381163314610a795760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610823565b610a838282611d8a565b5050565b6941444d494e5f524f4c4560b01b610a9f8133611ca2565b600260009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610aef57600080fd5b505af1158015610b03573d6000803e3d6000fd5b5050505050565b3360009081526009602090815260408083206001600160a01b0385168452909152902054610b7a5760405162461bcd60e51b815260206004820152601760248201527f4e6f207265776172647320746f2077697468647261772e0000000000000000006044820152606401610823565b3360008181526009602090815260408083206001600160a01b0386168085529252822080549290559091610a83919083611c50565b606083013560009081526005602052604090205460ff1615610be35760405162461bcd60e51b815260040161082390613b8a565b60608301356000908152600560205260408120805460ff19166001179055610c0a85611def565b85516101208701516060880151929350610c3292610c2d36889003880188613bb9565b61205e565b610c6b85602001518661010001518760e00151886040015189606001518a61018001518a803603810190610c669190613bb9565b6120fc565b610c7885828460006121a9565b84602001516001600160a01b031685610100015186600001516001600160a01b03167fec34853c156da04e4792f1c735112ae54e5ed52bac58db5014b26746f306a362886101800151604051610cd091815260200190565b60405180910390a45050505050565b6001546001600160a01b03163314610d095760405162461bcd60e51b815260040161082390613af4565b610d136000612bd4565b565b6941444d494e5f524f4c4560b01b610d2d8133611ca2565b600260009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610aef57600080fd5b6941444d494e5f524f4c4560b01b610d958133611ca2565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6941444d494e5f524f4c4560b01b610df98133611ca2565b6001805460ff60a81b1916600160a81b60ff8581168202929092179283905560405192041681527f04e959c7352d9eda8a6d989e4fee25ff0bf44c87386b7259d8500343c4e9992e906020015b60405180910390a15050565b6941444d494e5f524f4c4560b01b610e6a8133611ca2565b6001805460ff60a01b1916600160a01b60ff8581168202929092179283905560405192041681527f1715ed10763088cbfba08a6ecfb6e5894eac73040cb1899d10d3f96ced2bd0ef90602001610e46565b6a5349474e45525f524f4c4560a81b610ed48133611ca2565b6001600160a01b038216610f2a5760405162461bcd60e51b815260206004820152601f60248201527f206e6577205369676e657220697320746865207a65726f2061646472657373006044820152606401610823565b600454610f4f906a5349474e45525f524f4c4560a81b906001600160a01b0316611d8a565b600480546001600160a01b0319166001600160a01b038416179055610f826a5349474e45525f524f4c4560a81b83612c26565b6004546040516001600160a01b038085169216907feeb293e1f8f3a9db91ade748726387ed1352ca78f5430c5f06fe3d1e1ad5057990600090a35050565b801561101c576000610fda8660e001518760400151612c30565b90508560e0015181600181518110610ff457610ff4613c23565b6020026020010151101561101a5760405162461bcd60e51b815260040161082390613c39565b505b606084013560009081526005602052604090205460ff16156110505760405162461bcd60e51b815260040161082390613b8a565b6060840135600090815260076020526040902060060154421080159061108d57506060840135600090815260076020819052604090912001544211155b806110d6575060608401356000908152600760208190526040909120908101546006909101541480156110d65750606084013560009081526007602052604090206008015460ff165b6111165760405162461bcd60e51b815260206004820152601160248201527053616c65204e6f7420456c696769626c6560781b6044820152606401610823565b60608401356000908152600560209081526040808320805460ff19908116600117909155600790925282206008018054909116905561115486611def565b90508561018001518660a0015161116b9190613c91565b816060015110156111b45760405162461bcd60e51b815260206004820152601360248201527214185a59081a5b9d985b1a5908185b5bdd5b9d606a1b6044820152606401610823565b855161012087015160608801516111d6929190610c2d36899003890189613bb9565b6111ed6111e836879003870187613bb9565b612ecd565b6111f9868285856121a9565b85602001516001600160a01b031686610100015187600001516001600160a01b03167fb10197cef009fd301a90b892d25451c22c3701eb18ee2df1250d31e514fff39489610180015160405161125191815260200190565b60405180910390a4505050505050565b60008181526007602052604090206008015460ff16156112b55760405162461bcd60e51b815260206004820152600f60248201526e416c726561647920496e2053616c6560881b6044820152606401610823565b33825260016101008301818152600092835260076020818152604094859020865181546001600160a01b03199081166001600160a01b0392831617835592880151958201805484169682169690961790955594860151600286015560608601516003860155608086015160048601805490921694169390931790925560a0840151600584015560c0840151600684015560e0909301519082015590516008909101805460ff1916911515919091179055565b80156113c35760006113818560e001518660400151612c30565b90508460e001518160018151811061139b5761139b613c23565b602002602001015110156113c15760405162461bcd60e51b815260040161082390613c39565b505b606083013560009081526005602052604090205460ff16156113f75760405162461bcd60e51b815260040161082390613b8a565b6060830135600090815260076020526040902060060154421080159061143457506060830135600090815260076020819052604090912001544211155b8061145c57506060830135600090815260076020819052604090912090810154600690910154145b801561147e5750606083013560009081526007602052604090206008015460ff165b6114be5760405162461bcd60e51b815260206004820152601160248201527053616c65204e6f7420456c696769626c6560781b6044820152606401610823565b6001846080015160038111156114d6576114d6613cb0565b14806114f757506003846080015160038111156114f5576114f5613cb0565b145b156115375760608301356000908152600560209081526040808320805460ff1990811660011790915560079092529091206008018054909116905561189e565b60008460800151600381111561154f5761154f613cb0565b1480611570575060028460800151600381111561156e5761156e613cb0565b145b1561189e57606083013560009081526006602052604090206004015460ff161561173a57606080850151908401356000908152600660205260409020600101546001600160a01b0390811691161480156115ea5750835160608401356000908152600660205260409020546001600160a01b039081169116145b801561161057506101008401516060840135600090815260066020526040902060020154145b6116525760405162461bcd60e51b81526020600482015260136024820152724e6f6e63653a20496e76616c6964204461746160681b6044820152606401610823565b610180840151606084013560009081526006602052604090206003015410156116b05760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964205175616e7469747960801b6044820152606401610823565b6101808401516060840135600090815260066020526040812060030180549091906116dc908490613cc6565b9091555050606083013560009081526006602052604081206003015490036117355760608301356000908152600560209081526040808320805460ff199081166001179091556007909252909120600801805490911690555b61189e565b606083013560009081526006602052604090206004015460ff1661189e57610180840151606084013560009081526007602052604090206003015410156117b65760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964205175616e7469747960801b6044820152606401610823565b6040518060a0016040528085600001516001600160a01b0316815260200185606001516001600160a01b03168152602001856101000151815260200185610180015160076000876060013581526020019081526020016000206003015461181d9190613cc6565b815260016020918201819052606086810135600090815260068452604090819020855181546001600160a01b03199081166001600160a01b039283161783559587015194820180549096169416939093179093559183015160028201559082015160038201556080909101516004909101805460ff19169115159190911790555b60006118a985611def565b90508461018001518560a001516118c09190613c91565b816060015110156119095760405162461bcd60e51b815260206004820152601360248201527214185a59081a5b9d985b1a5908185b5bdd5b9d606a1b6044820152606401610823565b61191b6111e836869003860186613bb9565b611927858285856121a9565b84602001516001600160a01b031685610100015186600001516001600160a01b03167fb10197cef009fd301a90b892d25451c22c3701eb18ee2df1250d31e514fff394886101800151604051610cd091815260200190565b60008281526020819052604090206001015461199b8133611ca2565b610a048383611d8a565b606082013560009081526005602052604090205460ff16156119d95760405162461bcd60e51b815260040161082390613b8a565b60608201356000908152600560205260408120805460ff19166001179055611a0084611def565b9050611a3684602001518561010001518660e001518760400151886060015189610180015189803603810190610c669190613bb9565b611a4384828460006121a9565b83602001516001600160a01b031684610100015185600001516001600160a01b03167fec34853c156da04e4792f1c735112ae54e5ed52bac58db5014b26746f306a362876101800151604051611a9b91815260200190565b60405180910390a450505050565b6941444d494e5f524f4c4560b01b611ac18133611ca2565b6001600160a01b038216611b265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610823565b611b4e6941444d494e5f524f4c4560b01b611b496001546001600160a01b031690565b611d8a565b611b5782612bd4565b610a836941444d494e5f524f4c4560b01b83612c26565b6001546001600160a01b03163314611b985760405162461bcd60e51b815260040161082390613af4565b47811115611bb85760405162461bcd60e51b815260040161082390613b42565b604051600090339083908381818185875af1925050503d8060008114611bfa576040519150601f19603f3d011682016040523d82523d6000602084013e611bff565b606091505b5050905080610a835760405162461bcd60e51b815260206004820152601f60248201527f54726164653a204661696c656420746f207769746864726177204574686572006044820152606401610823565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a04908490612fcb565b611cac8282610db8565b610a8357611cc4816001600160a01b0316601461309d565b611ccf83602061309d565b604051602001611ce0929190613cfd565b60408051601f198184030181529082905262461bcd60e51b825261082391600401613d9e565b611d108282610db8565b610a83576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611d463390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611d948282610db8565b15610a83576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b611e2a6040518060a001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b6001546000908190819081908190611e4e90600160a01b900460ff166103e8613db1565b61ffff168760e001516103e8611e649190613c91565b611e6e9190613dcc565b90506000818860e00151611e829190613cc6565b6001549091506000906103e890611ea390600160a81b900460ff1685613c91565b611ead9190613dcc565b9050611eb98183613dee565b95508860c00151158015611f015750600189608001516003811115611ee057611ee0613cb0565b1480611f015750600089608001516003811115611eff57611eff613cb0565b145b15611f8d5760608901516101008a015160405163152a902d60e11b81526001600160a01b0390921691632a55205a91611f47918790600401918252602082015260400190565b6040805180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613e01565b90975094505b8860c00151158015611fd35750600389608001516003811115611fb257611fb2613cb0565b1480611fd35750600289608001516003811115611fd157611fd1613cb0565b145b156120105788516101608a01516103e890611ff7906001600160601b031686613c91565b6120019190613dcc565b9097506001600160601b031694505b8061201b8685613cc6565b6120259190613cc6565b6040805160a081018252978852602088019190915286019490945250606084015250506001600160a01b03909116608082015292915050565b600030838686856060015160405160200161207d959493929190613e2f565b60405160208183030381529060405280519060200120905061209f818361323f565b6004546001600160a01b03908116911614610b035760405162461bcd60e51b815260206004820152601e60248201527f6f776e6572207369676e20766572696669636174696f6e206661696c656400006044820152606401610823565b60008387868886866060015160405160200161211d96959493929190613e83565b60405160208183030381529060405280519060200120905061213f818361323f565b6001600160a01b0316886001600160a01b03161461219f5760405162461bcd60e51b815260206004820152601e60248201527f6275796572207369676e20766572696669636174696f6e206661696c656400006044820152606401610823565b5050505050505050565b6001846080015160038111156121c1576121c1613cb0565b0361223f57600254606085015185516020870151610100880151604051637b84dc8360e11b81526001600160a01b039095169463f709b9069461220c94909390929091600401613ec9565b600060405180830381600087803b15801561222657600080fd5b505af115801561223a573d6000803e3d6000fd5b505050505b60008460800151600381111561225757612257613cb0565b036122fb57600254606085015185516020870151610100880151610180890151604051639c1c2ee960e01b81526001600160a01b039586166004820152938516602485015291841660448401526064830152608482015260c060a4820152600060c4820152911690639c1c2ee99060e401600060405180830381600087803b1580156122e257600080fd5b505af11580156122f6573d6000803e3d6000fd5b505050505b60038460800151600381111561231357612313613cb0565b03612399576002546060850151855160208701516101208801516101608901516040516304aa1a9b60e51b81526001600160a01b0390961695639543536095612366959094909390929091600401613ef3565b600060405180830381600087803b15801561238057600080fd5b505af1158015612394573d6000803e3d6000fd5b505050505b6002846080015160038111156123b1576123b1613cb0565b03612447576002546060850151855160208701516101208801516101608901516101408a01516101808b0151604051632094b96560e11b81526001600160a01b039098169763412972ca9761241497909690959094909390929091600401613f42565b600060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b505050505b81600001516001600160a01b031684602001516001600160a01b0316036124b05760405162461bcd60e51b815260206004820152601c60248201527f42757965722063616e6e6f7420626520746865207265666572726572000000006044820152606401610823565b6000816124bd57336124bf565b305b9050811561254557604085810151600254915163095ea7b360e01b81526001600160a01b039283166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190613f9e565b505b6000600a819055600b819055600c819055600d558351156129bf576020808601516001600160a01b0390811660009081526008909252604090912054166126cc5782516001600160a01b0316156126c75782516001600160a01b0390811660009081526008602090815260409091205490870151821691161415806125f7575082516001600160a01b039081166000908152600860209081526040808320548416835290912054908701518216911614155b80612637575082516001600160a01b0390811660009081526008602090815260408083205484168352808320548416835290912054908701518216911614155b156126725782516020868101516001600160a01b0390811660009081526008909252604090912080546001600160a01b031916919092161790555b835161267f90600a6132f6565b600a81905583516001600160a01b0390811660009081526009602090815260408083208a820151909416835292905290812080549091906126c1908490613dee565b90915550505b61287c565b83516126d990600a6132f6565b600b8190556020808701516001600160a01b039081166000908152600883526040808220548316825260098452808220818b015190931682529190925281208054909190612728908490613dee565b90915550506020808601516001600160a01b03908116600090815260089092526040808320548216835290912054161561287c5783516127779061068390612771906064613302565b906132f6565b600c8190556020808701516001600160a01b0390811660009081526008835260408082205483168252808220548316825260098452808220818b0151909316825291909252812080549091906127ce908490613dee565b90915550506020808601516001600160a01b039081166000908152600890925260408083205482168352808320548216835290912054161561287c5783516128179060196132f6565b600d8190556020808701516001600160a01b03908116600090815260088352604080822054831682528082205483168252808220548316825260098452808220818b015190931682529190925281208054909190612876908490613dee565b90915550505b60006128af600d546128a9600c546128a9600b546128a9600a548c6000015161330e90919063ffffffff16565b9061330e565b90506001600160a01b038216301461293e57600254604087015186516001600160a01b039092169163776062c39190859030906128ec908761330e565b6040518563ffffffff1660e01b815260040161290b9493929190613ec9565b600060405180830381600087803b15801561292557600080fd5b505af1158015612939573d6000803e3d6000fd5b505050505b60025460408701516001600160a01b039091169063776062c3908461296b6001546001600160a01b031690565b856040518563ffffffff1660e01b815260040161298b9493929190613ec9565b600060405180830381600087803b1580156129a557600080fd5b505af11580156129b9573d6000803e3d6000fd5b50505050505b604084015115612a3e57600254604080870151608087015187830151925163776062c360e01b81526001600160a01b039094169363776062c393612a0b93928792909190600401613ec9565b600060405180830381600087803b158015612a2557600080fd5b505af1158015612a39573d6000803e3d6000fd5b505050505b82516001600160a01b031615801590612a5b575060008360200151115b15612b37576000612a836103e86127718660200151886020015161330290919063ffffffff16565b84516001600160a01b0390811660009081526009602090815260408083208b820151909416835292905290812080549293508392909190612ac5908490613dee565b9091555050600254604080880151905163776062c360e01b81526001600160a01b039092169163776062c391612b0391869030908790600401613ec9565b600060405180830381600087803b158015612b1d57600080fd5b505af1158015612b31573d6000803e3d6000fd5b50505050505b6002546040860151865160208601516001600160a01b039093169263776062c392918591612b7c906103e89061277190612b719083613cc6565b60208d015190613302565b6040518563ffffffff1660e01b8152600401612b9b9493929190613ec9565b600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b505050505050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a838282611d06565b604080516002808252606080830184529260009291906020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc29190613fbb565b81600081518110612cd557612cd5613c23565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d0957612d09613c23565b60200260200101906001600160a01b031690816001600160a01b03168152505080600181518110612d3c57612d3c613c23565b60200260200101516001600160a01b031681600081518110612d6057612d60613c23565b60200260200101516001600160a01b031603612e4457826001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b5060029350612dd392505050565b604051908082528060200260200182016040528015612dfc578160200160208202803683370190505b5091503482600081518110612e1357612e13613c23565b6020026020010181815250503482600181518110612e3357612e33613c23565b602002602001018181525050612ec6565b60035460405163fb3bdb4160e01b81526001600160a01b039091169063fb3bdb41903490612e7c908890869030904290600401613fd8565b60006040518083038185885af1158015612e9a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612ec39190810190614042565b91505b5092915050565b6060810180516000908152600760209081526040808320600101548451845281842060020154855185528285206004015486518652838620600501548751875284872060030154975194519697612f3b976001600160a01b0395861697949695909316949193909201613e83565b604051602081830303815290604052805190602001209050612f5d818361323f565b60608301516000908152600760205260409020546001600160a01b03908116911614610a835760405162461bcd60e51b815260206004820152601f60248201527f73656c6c6572207369676e20766572696669636174696f6e206661696c6564006044820152606401610823565b6000613020826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661331a9092919063ffffffff16565b805190915015610a04578080602001905181019061303e9190613f9e565b610a045760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610823565b606060006130ac836002613c91565b6130b7906002613dee565b6001600160401b038111156130ce576130ce613576565b6040519080825280601f01601f1916602001820160405280156130f8576020820181803683370190505b509050600360fc1b8160008151811061311357613113613c23565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061314257613142613c23565b60200101906001600160f81b031916908160001a9053506000613166846002613c91565b613171906001613dee565b90505b60018111156131e9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106131a5576131a5613c23565b1a60f81b8282815181106131bb576131bb613c23565b60200101906001600160f81b031916908160001a90535060049490941c936131e2816140e7565b9050613174565b5083156132385760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610823565b9392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101839052600090600190605c0160408051601f19818403018152828252805160209182012086518783015188850151600087529386018086529290925260ff16928401929092526060830191909152608082015260a0016020604051602081039080840390855afa1580156132e4573d6000803e3d6000fd5b5050604051601f190151949350505050565b60006132388284613dcc565b60006132388284613c91565b60006132388284613cc6565b60606133298484600085613331565b949350505050565b6060824710156133925760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610823565b843b6133e05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610823565b600080866001600160a01b031685876040516133fc91906140fe565b60006040518083038185875af1925050503d8060008114613439576040519150601f19603f3d011682016040523d82523d6000602084013e61343e565b606091505b509150915061344e828286613459565b979650505050505050565b60608315613468575081613238565b8251156134785782518084602001fd5b8160405162461bcd60e51b81526004016108239190613d9e565b6000602082840312156134a457600080fd5b81356001600160e01b03198116811461323857600080fd5b6001600160a01b03811681146134d157600080fd5b50565b80356134df816134bc565b919050565b600080604083850312156134f757600080fd5b8235613502816134bc565b946020939093013593505050565b60006020828403121561352257600080fd5b5035919050565b6000806040838503121561353c57600080fd5b82359150602083013561354e816134bc565b809150509250929050565b60006020828403121561356b57600080fd5b8135613238816134bc565b634e487b7160e01b600052604160045260246000fd5b6040516101a081016001600160401b03811182821017156135af576135af613576565b60405290565b60405161012081016001600160401b03811182821017156135af576135af613576565b604051601f8201601f191681016001600160401b038111828210171561360057613600613576565b604052919050565b8035600481106134df57600080fd5b80151581146134d157600080fd5b80356134df81613617565b600082601f83011261364157600080fd5b81356001600160401b0381111561365a5761365a613576565b61366d601f8201601f19166020016135d8565b81815284602083860101111561368257600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160601b03811681146134df57600080fd5b60006101a082840312156136c957600080fd5b6136d161358c565b90506136dc826134d4565b81526136ea602083016134d4565b60208201526136fb604083016134d4565b604082015261370c606083016134d4565b606082015261371d60808301613608565b608082015260a082013560a082015261373860c08301613625565b60c082015260e082013560e0820152610100808301358183015250610120808301356001600160401b0381111561376e57600080fd5b61377a85828601613630565b82840152505061014080830135818301525061016061379a81840161369f565b818301525061018080830135818301525092915050565b6000608082840312156137c357600080fd5b50919050565b6000604082840312156137db57600080fd5b604051604081018181106001600160401b03821117156137fd576137fd613576565b604052905080823561380e816134bc565b8152602092830135920191909152919050565b600080600080610160858703121561383857600080fd5b84356001600160401b0381111561384e57600080fd5b61385a878288016136b6565b94505061386a86602087016137b1565b92506138798660a087016137b1565b91506138898661012087016137c9565b905092959194509250565b600080604083850312156138a757600080fd5b82356138b2816134bc565b9150602083013561354e816134bc565b803560ff811681146134df57600080fd5b6000602082840312156138e557600080fd5b613238826138c2565b6000806000806000610180868803121561390757600080fd5b85356001600160401b0381111561391d57600080fd5b613929888289016136b6565b95505061393987602088016137b1565b93506139488760a088016137b1565b92506139588761012088016137c9565b915061016086013561396981613617565b809150509295509295909350565b60008082840361014081121561398c57600080fd5b6101208082121561399c57600080fd5b6139a46135b5565b91506139af856134d4565b82526139bd602086016134d4565b602083015260408501356040830152606085013560608301526139e2608086016134d4565b608083015260a085013560a083015260c085013560c083015260e085013560e0830152610100613a13818701613625565b90830152909593013593505050565b6000806000806101008587031215613a3957600080fd5b84356001600160401b03811115613a4f57600080fd5b613a5b878288016136b6565b945050613a6b86602087016137b1565b9250613a7a8660a087016137c9565b915060e0850135613a8a81613617565b939692955090935050565b600080600060e08486031215613aaa57600080fd5b83356001600160401b03811115613ac057600080fd5b613acc868287016136b6565b935050613adc85602086016137b1565b9150613aeb8560a086016137c9565b90509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613b3b57600080fd5b5051919050565b60208082526028908201527f54726164653a205769746864726177616c20616d6f756e7420657863656564736040820152672062616c616e636560c01b606082015260800190565b6020808252601590820152744e6f6e6365203a20496e76616c6964204e6f6e636560581b604082015260600190565b600060808284031215613bcb57600080fd5b604051608081018181106001600160401b0382111715613bed57613bed613576565b604052613bf9836138c2565b81526020830135602082015260408301356040820152606083013560608201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f54726164653a20696e73756666696369656e74207377617070656420616d6f756040820152611b9d60f21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613cab57613cab613c7b565b500290565b634e487b7160e01b600052602160045260246000fd5b818103818111156107f3576107f3613c7b565b60005b83811015613cf4578181015183820152602001613cdc565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613d35816017850160208801613cd9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613d66816028840160208801613cd9565b01602801949350505050565b60008151808452613d8a816020860160208601613cd9565b601f01601f19169290920160200192915050565b6020815260006132386020830184613d72565b61ffff818116838216019080821115612ec657612ec6613c7b565b600082613de957634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107f3576107f3613c7b565b60008060408385031215613e1457600080fd5b8251613e1f816134bc565b6020939093015192949293505050565b60006001600160601b0319808860601b168352808760601b166014840152808660601b166028840152508351613e6c81603c850160208801613cd9565b603c920191820192909252605c0195945050505050565b6bffffffffffffffffffffffff19606097881b8116825260148201969096529390951b909316603483015260488201526068810191909152608881019190915260a80190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03868116825285811660208301528416604082015260a060608201819052600090613f2790830185613d72565b90506001600160601b03831660808301529695505050505050565b6001600160a01b03888116825287811660208301528616604082015260e060608201819052600090613f7690830187613d72565b6001600160601b039590951660808301525060a081019290925260c090910152949350505050565b600060208284031215613fb057600080fd5b815161323881613617565b600060208284031215613fcd57600080fd5b8151613238816134bc565b600060808201868352602060808185015281875180845260a086019150828901935060005b818110156140225784516001600160a01b031683529383019391830191600101613ffd565b50506001600160a01b039690961660408501525050506060015292915050565b6000602080838503121561405557600080fd5b82516001600160401b038082111561406c57600080fd5b818501915085601f83011261408057600080fd5b81518181111561409257614092613576565b8060051b91506140a38483016135d8565b81815291830184019184810190888411156140bd57600080fd5b938501935b838510156140db578451825293850193908501906140c2565b98975050505050505050565b6000816140f6576140f6613c7b565b506000190190565b60008251614110818460208701613cd9565b919091019291505056fea2646970667358221220735162a0a886e05f92382e4c7042d8181a18e63b8beca803813bbe89659f29a164736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000009cf4f4fc1294f6eccb19a81d77530b7f7e4c86f0
Deployed Bytecode
0x6080604052600436106101f05760003560e01c80638da5cb5b1161010c578063b43a76f11161009a578063d547741f1161006c578063d547741f14610722578063e9240c2d14610742578063f1eeb42a14610762578063f2fde38b14610782578063f9fc4816146107a257005b8063b43a76f11461060e578063b953d196146106dc578063cef89d00146106ef578063d395cc181461070f57005b80639c66809d116100de5780639c66809d1461057a578063a217fddf14610599578063a3667c7b146105ae578063a96b446d146105ce578063aad2b723146105ee57005b80638da5cb5b146104d45780638fe56dc8146104f257806391d148541461052a5780639723fb6d1461054a57005b80633f4ba83a116101895780636d2511d21161015b5780636d2511d21461044a5780636e667db31461046a578063715018a61461048a5780638456cb591461049f5780638ae42905146104b457005b80633f4ba83a146103b257806347ecbcf9146103c757806351cff8d9146103fd57806360085da61461041d57005b8063248a9ca3116101c2578063248a9ca3146102a65780632f2ff15d146102e457806336568abe14610304578063365b98b21461032457005b806301ffc9a7146101f95780630e3487731461022e5780631361a3b61461024e578063238ac9331461026e57005b366101f757005b005b34801561020557600080fd5b50610219610214366004613492565b6107c2565b60405190151581526020015b60405180910390f35b34801561023a57600080fd5b506101f76102493660046134e4565b6107f9565b34801561025a57600080fd5b506101f7610269366004613510565b6108d5565b34801561027a57600080fd5b5060045461028e906001600160a01b031681565b6040516001600160a01b039091168152602001610225565b3480156102b257600080fd5b506102d66102c1366004613510565b60009081526020819052604090206001015490565b604051908152602001610225565b3480156102f057600080fd5b506101f76102ff366004613529565b6109de565b34801561031057600080fd5b506101f761031f366004613529565b610a09565b34801561033057600080fd5b5061037d61033f366004613510565b600660205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949390921692909160ff1685565b604080516001600160a01b0396871681529590941660208601529284019190915260608301521515608082015260a001610225565b3480156103be57600080fd5b506101f7610a87565b3480156103d357600080fd5b5061028e6103e2366004613559565b6008602052600090815260409020546001600160a01b031681565b34801561040957600080fd5b506101f7610418366004613559565b610b0a565b34801561042957600080fd5b50600154600160a81b900460ff165b60405160ff9091168152602001610225565b34801561045657600080fd5b506101f7610465366004613821565b610baf565b34801561047657600080fd5b5060025461028e906001600160a01b031681565b34801561049657600080fd5b506101f7610cdf565b3480156104ab57600080fd5b506101f7610d15565b3480156104c057600080fd5b506101f76104cf366004613559565b610d7d565b3480156104e057600080fd5b506001546001600160a01b031661028e565b3480156104fe57600080fd5b506102d661050d366004613894565b600960209081526000928352604080842090915290825290205481565b34801561053657600080fd5b50610219610545366004613529565b610db8565b34801561055657600080fd5b50610219610565366004613510565b60056020526000908152604090205460ff1681565b34801561058657600080fd5b50600154600160a01b900460ff16610438565b3480156105a557600080fd5b506102d6600081565b3480156105ba57600080fd5b506101f76105c93660046138d3565b610de1565b3480156105da57600080fd5b506101f76105e93660046138d3565b610e52565b3480156105fa57600080fd5b506101f7610609366004613559565b610ebb565b34801561061a57600080fd5b50610685610629366004613510565b60076020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154978701546008909701546001600160a01b039687169895871697949693959290931693909260ff1689565b604080516001600160a01b039a8b168152988a1660208a0152880196909652606087019490945295909116608085015260a084015260c083019390935260e082019290925290151561010082015261012001610225565b6101f76106ea3660046138ee565b610fc0565b3480156106fb57600080fd5b506101f761070a366004613977565b611261565b6101f761071d366004613a22565b611367565b34801561072e57600080fd5b506101f761073d366004613529565b61197f565b34801561074e57600080fd5b5060035461028e906001600160a01b031681565b34801561076e57600080fd5b506101f761077d366004613a95565b6119a5565b34801561078e57600080fd5b506101f761079d366004613559565b611aa9565b3480156107ae57600080fd5b506101f76107bd366004613510565b611b6e565b60006001600160e01b03198216637965db0b60e01b14806107f357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001546001600160a01b0316331461082c5760405162461bcd60e51b815260040161082390613af4565b60405180910390fd5b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108999190613b29565b9050808311156108bb5760405162461bcd60e51b815260040161082390613b42565b6108cf6001600160a01b0383163385611c50565b50505050565b60008181526007602052604090206008015460ff166109245760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420496e2053616c6560a81b6044820152606401610823565b6000818152600760205260409020546001600160a01b031633146109795760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2102ab9b2b960a11b6044820152606401610823565b6000908152600760208190526040822080546001600160a01b031990811682556001820180548216905560028201849055600382018490556004820180549091169055600581018390556006810183905590810191909155600801805460ff19169055565b6000828152602081905260409020600101546109fa8133611ca2565b610a048383611d06565b505050565b6001600160a01b0381163314610a795760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610823565b610a838282611d8a565b5050565b6941444d494e5f524f4c4560b01b610a9f8133611ca2565b600260009054906101000a90046001600160a01b03166001600160a01b0316633f4ba83a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610aef57600080fd5b505af1158015610b03573d6000803e3d6000fd5b5050505050565b3360009081526009602090815260408083206001600160a01b0385168452909152902054610b7a5760405162461bcd60e51b815260206004820152601760248201527f4e6f207265776172647320746f2077697468647261772e0000000000000000006044820152606401610823565b3360008181526009602090815260408083206001600160a01b0386168085529252822080549290559091610a83919083611c50565b606083013560009081526005602052604090205460ff1615610be35760405162461bcd60e51b815260040161082390613b8a565b60608301356000908152600560205260408120805460ff19166001179055610c0a85611def565b85516101208701516060880151929350610c3292610c2d36889003880188613bb9565b61205e565b610c6b85602001518661010001518760e00151886040015189606001518a61018001518a803603810190610c669190613bb9565b6120fc565b610c7885828460006121a9565b84602001516001600160a01b031685610100015186600001516001600160a01b03167fec34853c156da04e4792f1c735112ae54e5ed52bac58db5014b26746f306a362886101800151604051610cd091815260200190565b60405180910390a45050505050565b6001546001600160a01b03163314610d095760405162461bcd60e51b815260040161082390613af4565b610d136000612bd4565b565b6941444d494e5f524f4c4560b01b610d2d8133611ca2565b600260009054906101000a90046001600160a01b03166001600160a01b0316638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610aef57600080fd5b6941444d494e5f524f4c4560b01b610d958133611ca2565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6941444d494e5f524f4c4560b01b610df98133611ca2565b6001805460ff60a81b1916600160a81b60ff8581168202929092179283905560405192041681527f04e959c7352d9eda8a6d989e4fee25ff0bf44c87386b7259d8500343c4e9992e906020015b60405180910390a15050565b6941444d494e5f524f4c4560b01b610e6a8133611ca2565b6001805460ff60a01b1916600160a01b60ff8581168202929092179283905560405192041681527f1715ed10763088cbfba08a6ecfb6e5894eac73040cb1899d10d3f96ced2bd0ef90602001610e46565b6a5349474e45525f524f4c4560a81b610ed48133611ca2565b6001600160a01b038216610f2a5760405162461bcd60e51b815260206004820152601f60248201527f206e6577205369676e657220697320746865207a65726f2061646472657373006044820152606401610823565b600454610f4f906a5349474e45525f524f4c4560a81b906001600160a01b0316611d8a565b600480546001600160a01b0319166001600160a01b038416179055610f826a5349474e45525f524f4c4560a81b83612c26565b6004546040516001600160a01b038085169216907feeb293e1f8f3a9db91ade748726387ed1352ca78f5430c5f06fe3d1e1ad5057990600090a35050565b801561101c576000610fda8660e001518760400151612c30565b90508560e0015181600181518110610ff457610ff4613c23565b6020026020010151101561101a5760405162461bcd60e51b815260040161082390613c39565b505b606084013560009081526005602052604090205460ff16156110505760405162461bcd60e51b815260040161082390613b8a565b6060840135600090815260076020526040902060060154421080159061108d57506060840135600090815260076020819052604090912001544211155b806110d6575060608401356000908152600760208190526040909120908101546006909101541480156110d65750606084013560009081526007602052604090206008015460ff165b6111165760405162461bcd60e51b815260206004820152601160248201527053616c65204e6f7420456c696769626c6560781b6044820152606401610823565b60608401356000908152600560209081526040808320805460ff19908116600117909155600790925282206008018054909116905561115486611def565b90508561018001518660a0015161116b9190613c91565b816060015110156111b45760405162461bcd60e51b815260206004820152601360248201527214185a59081a5b9d985b1a5908185b5bdd5b9d606a1b6044820152606401610823565b855161012087015160608801516111d6929190610c2d36899003890189613bb9565b6111ed6111e836879003870187613bb9565b612ecd565b6111f9868285856121a9565b85602001516001600160a01b031686610100015187600001516001600160a01b03167fb10197cef009fd301a90b892d25451c22c3701eb18ee2df1250d31e514fff39489610180015160405161125191815260200190565b60405180910390a4505050505050565b60008181526007602052604090206008015460ff16156112b55760405162461bcd60e51b815260206004820152600f60248201526e416c726561647920496e2053616c6560881b6044820152606401610823565b33825260016101008301818152600092835260076020818152604094859020865181546001600160a01b03199081166001600160a01b0392831617835592880151958201805484169682169690961790955594860151600286015560608601516003860155608086015160048601805490921694169390931790925560a0840151600584015560c0840151600684015560e0909301519082015590516008909101805460ff1916911515919091179055565b80156113c35760006113818560e001518660400151612c30565b90508460e001518160018151811061139b5761139b613c23565b602002602001015110156113c15760405162461bcd60e51b815260040161082390613c39565b505b606083013560009081526005602052604090205460ff16156113f75760405162461bcd60e51b815260040161082390613b8a565b6060830135600090815260076020526040902060060154421080159061143457506060830135600090815260076020819052604090912001544211155b8061145c57506060830135600090815260076020819052604090912090810154600690910154145b801561147e5750606083013560009081526007602052604090206008015460ff165b6114be5760405162461bcd60e51b815260206004820152601160248201527053616c65204e6f7420456c696769626c6560781b6044820152606401610823565b6001846080015160038111156114d6576114d6613cb0565b14806114f757506003846080015160038111156114f5576114f5613cb0565b145b156115375760608301356000908152600560209081526040808320805460ff1990811660011790915560079092529091206008018054909116905561189e565b60008460800151600381111561154f5761154f613cb0565b1480611570575060028460800151600381111561156e5761156e613cb0565b145b1561189e57606083013560009081526006602052604090206004015460ff161561173a57606080850151908401356000908152600660205260409020600101546001600160a01b0390811691161480156115ea5750835160608401356000908152600660205260409020546001600160a01b039081169116145b801561161057506101008401516060840135600090815260066020526040902060020154145b6116525760405162461bcd60e51b81526020600482015260136024820152724e6f6e63653a20496e76616c6964204461746160681b6044820152606401610823565b610180840151606084013560009081526006602052604090206003015410156116b05760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964205175616e7469747960801b6044820152606401610823565b6101808401516060840135600090815260066020526040812060030180549091906116dc908490613cc6565b9091555050606083013560009081526006602052604081206003015490036117355760608301356000908152600560209081526040808320805460ff199081166001179091556007909252909120600801805490911690555b61189e565b606083013560009081526006602052604090206004015460ff1661189e57610180840151606084013560009081526007602052604090206003015410156117b65760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964205175616e7469747960801b6044820152606401610823565b6040518060a0016040528085600001516001600160a01b0316815260200185606001516001600160a01b03168152602001856101000151815260200185610180015160076000876060013581526020019081526020016000206003015461181d9190613cc6565b815260016020918201819052606086810135600090815260068452604090819020855181546001600160a01b03199081166001600160a01b039283161783559587015194820180549096169416939093179093559183015160028201559082015160038201556080909101516004909101805460ff19169115159190911790555b60006118a985611def565b90508461018001518560a001516118c09190613c91565b816060015110156119095760405162461bcd60e51b815260206004820152601360248201527214185a59081a5b9d985b1a5908185b5bdd5b9d606a1b6044820152606401610823565b61191b6111e836869003860186613bb9565b611927858285856121a9565b84602001516001600160a01b031685610100015186600001516001600160a01b03167fb10197cef009fd301a90b892d25451c22c3701eb18ee2df1250d31e514fff394886101800151604051610cd091815260200190565b60008281526020819052604090206001015461199b8133611ca2565b610a048383611d8a565b606082013560009081526005602052604090205460ff16156119d95760405162461bcd60e51b815260040161082390613b8a565b60608201356000908152600560205260408120805460ff19166001179055611a0084611def565b9050611a3684602001518561010001518660e001518760400151886060015189610180015189803603810190610c669190613bb9565b611a4384828460006121a9565b83602001516001600160a01b031684610100015185600001516001600160a01b03167fec34853c156da04e4792f1c735112ae54e5ed52bac58db5014b26746f306a362876101800151604051611a9b91815260200190565b60405180910390a450505050565b6941444d494e5f524f4c4560b01b611ac18133611ca2565b6001600160a01b038216611b265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610823565b611b4e6941444d494e5f524f4c4560b01b611b496001546001600160a01b031690565b611d8a565b611b5782612bd4565b610a836941444d494e5f524f4c4560b01b83612c26565b6001546001600160a01b03163314611b985760405162461bcd60e51b815260040161082390613af4565b47811115611bb85760405162461bcd60e51b815260040161082390613b42565b604051600090339083908381818185875af1925050503d8060008114611bfa576040519150601f19603f3d011682016040523d82523d6000602084013e611bff565b606091505b5050905080610a835760405162461bcd60e51b815260206004820152601f60248201527f54726164653a204661696c656420746f207769746864726177204574686572006044820152606401610823565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a04908490612fcb565b611cac8282610db8565b610a8357611cc4816001600160a01b0316601461309d565b611ccf83602061309d565b604051602001611ce0929190613cfd565b60408051601f198184030181529082905262461bcd60e51b825261082391600401613d9e565b611d108282610db8565b610a83576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611d463390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611d948282610db8565b15610a83576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b611e2a6040518060a001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b6001546000908190819081908190611e4e90600160a01b900460ff166103e8613db1565b61ffff168760e001516103e8611e649190613c91565b611e6e9190613dcc565b90506000818860e00151611e829190613cc6565b6001549091506000906103e890611ea390600160a81b900460ff1685613c91565b611ead9190613dcc565b9050611eb98183613dee565b95508860c00151158015611f015750600189608001516003811115611ee057611ee0613cb0565b1480611f015750600089608001516003811115611eff57611eff613cb0565b145b15611f8d5760608901516101008a015160405163152a902d60e11b81526001600160a01b0390921691632a55205a91611f47918790600401918252602082015260400190565b6040805180830381865afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613e01565b90975094505b8860c00151158015611fd35750600389608001516003811115611fb257611fb2613cb0565b1480611fd35750600289608001516003811115611fd157611fd1613cb0565b145b156120105788516101608a01516103e890611ff7906001600160601b031686613c91565b6120019190613dcc565b9097506001600160601b031694505b8061201b8685613cc6565b6120259190613cc6565b6040805160a081018252978852602088019190915286019490945250606084015250506001600160a01b03909116608082015292915050565b600030838686856060015160405160200161207d959493929190613e2f565b60405160208183030381529060405280519060200120905061209f818361323f565b6004546001600160a01b03908116911614610b035760405162461bcd60e51b815260206004820152601e60248201527f6f776e6572207369676e20766572696669636174696f6e206661696c656400006044820152606401610823565b60008387868886866060015160405160200161211d96959493929190613e83565b60405160208183030381529060405280519060200120905061213f818361323f565b6001600160a01b0316886001600160a01b03161461219f5760405162461bcd60e51b815260206004820152601e60248201527f6275796572207369676e20766572696669636174696f6e206661696c656400006044820152606401610823565b5050505050505050565b6001846080015160038111156121c1576121c1613cb0565b0361223f57600254606085015185516020870151610100880151604051637b84dc8360e11b81526001600160a01b039095169463f709b9069461220c94909390929091600401613ec9565b600060405180830381600087803b15801561222657600080fd5b505af115801561223a573d6000803e3d6000fd5b505050505b60008460800151600381111561225757612257613cb0565b036122fb57600254606085015185516020870151610100880151610180890151604051639c1c2ee960e01b81526001600160a01b039586166004820152938516602485015291841660448401526064830152608482015260c060a4820152600060c4820152911690639c1c2ee99060e401600060405180830381600087803b1580156122e257600080fd5b505af11580156122f6573d6000803e3d6000fd5b505050505b60038460800151600381111561231357612313613cb0565b03612399576002546060850151855160208701516101208801516101608901516040516304aa1a9b60e51b81526001600160a01b0390961695639543536095612366959094909390929091600401613ef3565b600060405180830381600087803b15801561238057600080fd5b505af1158015612394573d6000803e3d6000fd5b505050505b6002846080015160038111156123b1576123b1613cb0565b03612447576002546060850151855160208701516101208801516101608901516101408a01516101808b0151604051632094b96560e11b81526001600160a01b039098169763412972ca9761241497909690959094909390929091600401613f42565b600060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b505050505b81600001516001600160a01b031684602001516001600160a01b0316036124b05760405162461bcd60e51b815260206004820152601c60248201527f42757965722063616e6e6f7420626520746865207265666572726572000000006044820152606401610823565b6000816124bd57336124bf565b305b9050811561254557604085810151600254915163095ea7b360e01b81526001600160a01b039283166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190613f9e565b505b6000600a819055600b819055600c819055600d558351156129bf576020808601516001600160a01b0390811660009081526008909252604090912054166126cc5782516001600160a01b0316156126c75782516001600160a01b0390811660009081526008602090815260409091205490870151821691161415806125f7575082516001600160a01b039081166000908152600860209081526040808320548416835290912054908701518216911614155b80612637575082516001600160a01b0390811660009081526008602090815260408083205484168352808320548416835290912054908701518216911614155b156126725782516020868101516001600160a01b0390811660009081526008909252604090912080546001600160a01b031916919092161790555b835161267f90600a6132f6565b600a81905583516001600160a01b0390811660009081526009602090815260408083208a820151909416835292905290812080549091906126c1908490613dee565b90915550505b61287c565b83516126d990600a6132f6565b600b8190556020808701516001600160a01b039081166000908152600883526040808220548316825260098452808220818b015190931682529190925281208054909190612728908490613dee565b90915550506020808601516001600160a01b03908116600090815260089092526040808320548216835290912054161561287c5783516127779061068390612771906064613302565b906132f6565b600c8190556020808701516001600160a01b0390811660009081526008835260408082205483168252808220548316825260098452808220818b0151909316825291909252812080549091906127ce908490613dee565b90915550506020808601516001600160a01b039081166000908152600890925260408083205482168352808320548216835290912054161561287c5783516128179060196132f6565b600d8190556020808701516001600160a01b03908116600090815260088352604080822054831682528082205483168252808220548316825260098452808220818b015190931682529190925281208054909190612876908490613dee565b90915550505b60006128af600d546128a9600c546128a9600b546128a9600a548c6000015161330e90919063ffffffff16565b9061330e565b90506001600160a01b038216301461293e57600254604087015186516001600160a01b039092169163776062c39190859030906128ec908761330e565b6040518563ffffffff1660e01b815260040161290b9493929190613ec9565b600060405180830381600087803b15801561292557600080fd5b505af1158015612939573d6000803e3d6000fd5b505050505b60025460408701516001600160a01b039091169063776062c3908461296b6001546001600160a01b031690565b856040518563ffffffff1660e01b815260040161298b9493929190613ec9565b600060405180830381600087803b1580156129a557600080fd5b505af11580156129b9573d6000803e3d6000fd5b50505050505b604084015115612a3e57600254604080870151608087015187830151925163776062c360e01b81526001600160a01b039094169363776062c393612a0b93928792909190600401613ec9565b600060405180830381600087803b158015612a2557600080fd5b505af1158015612a39573d6000803e3d6000fd5b505050505b82516001600160a01b031615801590612a5b575060008360200151115b15612b37576000612a836103e86127718660200151886020015161330290919063ffffffff16565b84516001600160a01b0390811660009081526009602090815260408083208b820151909416835292905290812080549293508392909190612ac5908490613dee565b9091555050600254604080880151905163776062c360e01b81526001600160a01b039092169163776062c391612b0391869030908790600401613ec9565b600060405180830381600087803b158015612b1d57600080fd5b505af1158015612b31573d6000803e3d6000fd5b50505050505b6002546040860151865160208601516001600160a01b039093169263776062c392918591612b7c906103e89061277190612b719083613cc6565b60208d015190613302565b6040518563ffffffff1660e01b8152600401612b9b9493929190613ec9565b600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b505050505050505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a838282611d06565b604080516002808252606080830184529260009291906020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc29190613fbb565b81600081518110612cd557612cd5613c23565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110612d0957612d09613c23565b60200260200101906001600160a01b031690816001600160a01b03168152505080600181518110612d3c57612d3c613c23565b60200260200101516001600160a01b031681600081518110612d6057612d60613c23565b60200260200101516001600160a01b031603612e4457826001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b5060029350612dd392505050565b604051908082528060200260200182016040528015612dfc578160200160208202803683370190505b5091503482600081518110612e1357612e13613c23565b6020026020010181815250503482600181518110612e3357612e33613c23565b602002602001018181525050612ec6565b60035460405163fb3bdb4160e01b81526001600160a01b039091169063fb3bdb41903490612e7c908890869030904290600401613fd8565b60006040518083038185885af1158015612e9a573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612ec39190810190614042565b91505b5092915050565b6060810180516000908152600760209081526040808320600101548451845281842060020154855185528285206004015486518652838620600501548751875284872060030154975194519697612f3b976001600160a01b0395861697949695909316949193909201613e83565b604051602081830303815290604052805190602001209050612f5d818361323f565b60608301516000908152600760205260409020546001600160a01b03908116911614610a835760405162461bcd60e51b815260206004820152601f60248201527f73656c6c6572207369676e20766572696669636174696f6e206661696c6564006044820152606401610823565b6000613020826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661331a9092919063ffffffff16565b805190915015610a04578080602001905181019061303e9190613f9e565b610a045760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610823565b606060006130ac836002613c91565b6130b7906002613dee565b6001600160401b038111156130ce576130ce613576565b6040519080825280601f01601f1916602001820160405280156130f8576020820181803683370190505b509050600360fc1b8160008151811061311357613113613c23565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061314257613142613c23565b60200101906001600160f81b031916908160001a9053506000613166846002613c91565b613171906001613dee565b90505b60018111156131e9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106131a5576131a5613c23565b1a60f81b8282815181106131bb576131bb613c23565b60200101906001600160f81b031916908160001a90535060049490941c936131e2816140e7565b9050613174565b5083156132385760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610823565b9392505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101839052600090600190605c0160408051601f19818403018152828252805160209182012086518783015188850151600087529386018086529290925260ff16928401929092526060830191909152608082015260a0016020604051602081039080840390855afa1580156132e4573d6000803e3d6000fd5b5050604051601f190151949350505050565b60006132388284613dcc565b60006132388284613c91565b60006132388284613cc6565b60606133298484600085613331565b949350505050565b6060824710156133925760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610823565b843b6133e05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610823565b600080866001600160a01b031685876040516133fc91906140fe565b60006040518083038185875af1925050503d8060008114613439576040519150601f19603f3d011682016040523d82523d6000602084013e61343e565b606091505b509150915061344e828286613459565b979650505050505050565b60608315613468575081613238565b8251156134785782518084602001fd5b8160405162461bcd60e51b81526004016108239190613d9e565b6000602082840312156134a457600080fd5b81356001600160e01b03198116811461323857600080fd5b6001600160a01b03811681146134d157600080fd5b50565b80356134df816134bc565b919050565b600080604083850312156134f757600080fd5b8235613502816134bc565b946020939093013593505050565b60006020828403121561352257600080fd5b5035919050565b6000806040838503121561353c57600080fd5b82359150602083013561354e816134bc565b809150509250929050565b60006020828403121561356b57600080fd5b8135613238816134bc565b634e487b7160e01b600052604160045260246000fd5b6040516101a081016001600160401b03811182821017156135af576135af613576565b60405290565b60405161012081016001600160401b03811182821017156135af576135af613576565b604051601f8201601f191681016001600160401b038111828210171561360057613600613576565b604052919050565b8035600481106134df57600080fd5b80151581146134d157600080fd5b80356134df81613617565b600082601f83011261364157600080fd5b81356001600160401b0381111561365a5761365a613576565b61366d601f8201601f19166020016135d8565b81815284602083860101111561368257600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160601b03811681146134df57600080fd5b60006101a082840312156136c957600080fd5b6136d161358c565b90506136dc826134d4565b81526136ea602083016134d4565b60208201526136fb604083016134d4565b604082015261370c606083016134d4565b606082015261371d60808301613608565b608082015260a082013560a082015261373860c08301613625565b60c082015260e082013560e0820152610100808301358183015250610120808301356001600160401b0381111561376e57600080fd5b61377a85828601613630565b82840152505061014080830135818301525061016061379a81840161369f565b818301525061018080830135818301525092915050565b6000608082840312156137c357600080fd5b50919050565b6000604082840312156137db57600080fd5b604051604081018181106001600160401b03821117156137fd576137fd613576565b604052905080823561380e816134bc565b8152602092830135920191909152919050565b600080600080610160858703121561383857600080fd5b84356001600160401b0381111561384e57600080fd5b61385a878288016136b6565b94505061386a86602087016137b1565b92506138798660a087016137b1565b91506138898661012087016137c9565b905092959194509250565b600080604083850312156138a757600080fd5b82356138b2816134bc565b9150602083013561354e816134bc565b803560ff811681146134df57600080fd5b6000602082840312156138e557600080fd5b613238826138c2565b6000806000806000610180868803121561390757600080fd5b85356001600160401b0381111561391d57600080fd5b613929888289016136b6565b95505061393987602088016137b1565b93506139488760a088016137b1565b92506139588761012088016137c9565b915061016086013561396981613617565b809150509295509295909350565b60008082840361014081121561398c57600080fd5b6101208082121561399c57600080fd5b6139a46135b5565b91506139af856134d4565b82526139bd602086016134d4565b602083015260408501356040830152606085013560608301526139e2608086016134d4565b608083015260a085013560a083015260c085013560c083015260e085013560e0830152610100613a13818701613625565b90830152909593013593505050565b6000806000806101008587031215613a3957600080fd5b84356001600160401b03811115613a4f57600080fd5b613a5b878288016136b6565b945050613a6b86602087016137b1565b9250613a7a8660a087016137c9565b915060e0850135613a8a81613617565b939692955090935050565b600080600060e08486031215613aaa57600080fd5b83356001600160401b03811115613ac057600080fd5b613acc868287016136b6565b935050613adc85602086016137b1565b9150613aeb8560a086016137c9565b90509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613b3b57600080fd5b5051919050565b60208082526028908201527f54726164653a205769746864726177616c20616d6f756e7420657863656564736040820152672062616c616e636560c01b606082015260800190565b6020808252601590820152744e6f6e6365203a20496e76616c6964204e6f6e636560581b604082015260600190565b600060808284031215613bcb57600080fd5b604051608081018181106001600160401b0382111715613bed57613bed613576565b604052613bf9836138c2565b81526020830135602082015260408301356040820152606083013560608201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f54726164653a20696e73756666696369656e74207377617070656420616d6f756040820152611b9d60f21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613cab57613cab613c7b565b500290565b634e487b7160e01b600052602160045260246000fd5b818103818111156107f3576107f3613c7b565b60005b83811015613cf4578181015183820152602001613cdc565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613d35816017850160208801613cd9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613d66816028840160208801613cd9565b01602801949350505050565b60008151808452613d8a816020860160208601613cd9565b601f01601f19169290920160200192915050565b6020815260006132386020830184613d72565b61ffff818116838216019080821115612ec657612ec6613c7b565b600082613de957634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107f3576107f3613c7b565b60008060408385031215613e1457600080fd5b8251613e1f816134bc565b6020939093015192949293505050565b60006001600160601b0319808860601b168352808760601b166014840152808660601b166028840152508351613e6c81603c850160208801613cd9565b603c920191820192909252605c0195945050505050565b6bffffffffffffffffffffffff19606097881b8116825260148201969096529390951b909316603483015260488201526068810191909152608881019190915260a80190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03868116825285811660208301528416604082015260a060608201819052600090613f2790830185613d72565b90506001600160601b03831660808301529695505050505050565b6001600160a01b03888116825287811660208301528616604082015260e060608201819052600090613f7690830187613d72565b6001600160601b039590951660808301525060a081019290925260c090910152949350505050565b600060208284031215613fb057600080fd5b815161323881613617565b600060208284031215613fcd57600080fd5b8151613238816134bc565b600060808201868352602060808185015281875180845260a086019150828901935060005b818110156140225784516001600160a01b031683529383019391830191600101613ffd565b50506001600160a01b039690961660408501525050506060015292915050565b6000602080838503121561405557600080fd5b82516001600160401b038082111561406c57600080fd5b818501915085601f83011261408057600080fd5b81518181111561409257614092613576565b8060051b91506140a38483016135d8565b81815291830184019184810190888411156140bd57600080fd5b938501935b838510156140db578451825293850193908501906140c2565b98975050505050505050565b6000816140f6576140f6613c7b565b506000190190565b60008251614110818460208701613cd9565b919091019291505056fea2646970667358221220735162a0a886e05f92382e4c7042d8181a18e63b8beca803813bbe89659f29a164736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000009cf4f4fc1294f6eccb19a81d77530b7f7e4c86f0
-----Decoded View---------------
Arg [0] : _buyerFee (uint8): 0
Arg [1] : _sellerFee (uint8): 25
Arg [2] : _routerAddress (address): 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F
Arg [3] : _transferProxy (address): 0x9cf4f4fc1294F6EccB19A81d77530b7f7e4C86f0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [2] : 000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Arg [3] : 0000000000000000000000009cf4f4fc1294f6eccb19a81d77530b7f7e4c86f0
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.